[lang_en]Turning On NCQ Queing On ICH7 Chipsets With Linux[/lang_en][lang_ru]Включение поддержки NCQ Queing на чипсетах ICH7 Chipsets под Linux[/lang_ru]
11 Aug2006

[lang_en]

Recently we’ve got critical load on one of our new free web hosting servers that handles millions of hits per day. When I’ve tried to analyze how to get more performance from that servers, I noted that these servers has ICH7 chipsets and Seagate SATA drives with NCQ support… But in closer view I noticed, that NCQ support is not enabled on our servers with ata_piix IDE driver. So, I decided that it would be great to enable NCQ and take a look what will happen with performance (it was obvious, that performance should increase)…

[/lang_en]

[lang_ru]

Недавно на нескольких из наших серверов, обслуживающих миллионы посещений в сутки, мы достигли предела производительности дисковой подсистемы. Когда я начал анализировать методы, которыми можно исправить ситуацию, я обратил внимание, что на эти сервера имеют чипсеты ICH7 и SATA-диски Seagate с поддержкой NCQ… Но при ближайшем рассмотрении я увидел, что поддержка NCQ не включена на этих серверах с IDE-драйвером ata_piix. Итак, я решил было бы отлично включить поддержку NCQ и взглянуть, как это повлияет на производительность (было очевидно, что она должна увеличиться)…

[/lang_ru]

[lang_en]

Fast research showed, that first thing I need is to enable AHCI-compatibility more in server’s BIOS to be able to use ahci SATA driver from latest version of Linux 2.6 kernel. After AHCI has been enabled, I saw following info in dmesg log:

ahci 0000:00:1f.2: AHCI 0001.0100 32 slots 4 ports 3 Gbps 0xf impl SATA mode
ahci 0000:00:1f.2: flags: 64bit ncq pm led clo pio slum part
ata1: SATA max UDMA/133 cmd 0xFFFFC20000022500 ctl 0x0 bmdma 0x0 irq 66
ata2: SATA max UDMA/133 cmd 0xFFFFC20000022580 ctl 0x0 bmdma 0x0 irq 66
ata3: SATA max UDMA/133 cmd 0xFFFFC20000022600 ctl 0x0 bmdma 0x0 irq 66
ata4: SATA max UDMA/133 cmd 0xFFFFC20000022680 ctl 0x0 bmdma 0x0 irq 66
scsi0 : ahci
ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
ata1.00: ATA-7, max UDMA/133, 586072368 sectors: LBA48
ata1.00: ata1: dev 0 multi count 16
ata1.00: configured for UDMA/133
scsi1 : ahci
......
  Vendor: ATA       Model: ST3300622AS       Rev: 3.AA
  Type:   Direct-Access                      ANSI SCSI revision: 05
  Vendor: ATA       Model: ST3300622AS       Rev: 3.AA
  Type:   Direct-Access                      ANSI SCSI revision: 05
  Vendor: ATA       Model: ST3300622AS       Rev: 3.AA
  Type:   Direct-Access                      ANSI SCSI revision: 05
  Vendor: ATA       Model: ST3300622AS       Rev: 3.AA
  Type:   Direct-Access                      ANSI SCSI revision: 05
......

As you can see, there is no NCQ support for SATA drives… But official libata site said, that it should be there!

More deep research showed, that libata in linux 2.6 kernel has no NCQ support for AHCI. 🙁 So, I decided to find out how to get more recent libata in linux 2.6…Unfortunately, official libata site has only outdated patches for linux 2.6. And after long search I found site with libata patches for latest 2.6 kernels that brings latest libata library and allows me to enable NCQ on my drives! This site is home page of Tejun Heo – Korean kernel hacker, that maintains libata-tj-stable patch set.

After applying these patches and rebooting I’ve got following messages for sata channels:

...
ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
ata1.00: ATA-7, max UDMA/133, 586072368 sectors: LBA48 NCQ (depth 31/32)
ata1.00: ata1: dev 0 multi count 16
ata1.00: configured for UDMA/133
...

So, now I have NCQ enabled on my drives and it gabe me some 15-30% of additional performance (I see it from traffic graphs, so I don’t need any deep performance test – it’s obvious) and if you have ICH controller and want to get NCQ queing enabled on your drives, try these patches – they are really stable.

[/lang_en]

[lang_ru]

Беглый поиск показал, что для начала нам необходимо включить режим совместимости AHCI в BIOS сервера для того, чтобы использовать SATA-драйвер ahci из последней версии ядра Linux 2.6. После включения AHCI я увидал в логах сервера следующее:

ahci 0000:00:1f.2: AHCI 0001.0100 32 slots 4 ports 3 Gbps 0xf impl SATA mode
ahci 0000:00:1f.2: flags: 64bit ncq pm led clo pio slum part
ata1: SATA max UDMA/133 cmd 0xFFFFC20000022500 ctl 0x0 bmdma 0x0 irq 66
ata2: SATA max UDMA/133 cmd 0xFFFFC20000022580 ctl 0x0 bmdma 0x0 irq 66
ata3: SATA max UDMA/133 cmd 0xFFFFC20000022600 ctl 0x0 bmdma 0x0 irq 66
ata4: SATA max UDMA/133 cmd 0xFFFFC20000022680 ctl 0x0 bmdma 0x0 irq 66
scsi0 : ahci
ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
ata1.00: ATA-7, max UDMA/133, 586072368 sectors: LBA48
ata1.00: ata1: dev 0 multi count 16
ata1.00: configured for UDMA/133
scsi1 : ahci
......
  Vendor: ATA       Model: ST3300622AS       Rev: 3.AA
  Type:   Direct-Access                      ANSI SCSI revision: 05
  Vendor: ATA       Model: ST3300622AS       Rev: 3.AA
  Type:   Direct-Access                      ANSI SCSI revision: 05
  Vendor: ATA       Model: ST3300622AS       Rev: 3.AA
  Type:   Direct-Access                      ANSI SCSI revision: 05
  Vendor: ATA       Model: ST3300622AS       Rev: 3.AA
  Type:   Direct-Access                      ANSI SCSI revision: 05
......

Как вы видите – ни одного упоминания об NCQ для SATA-дисков не наблюдалось… Но официальная страница библиотеки libata заявляет, что поддержка должна быть там!

Более глубокие исследования показали, сто libata в ядре linux 2.6 не содержит поддержки NCQ для AHCI-чипсетов. 🙁 Тогда я решил копнуть глубже и найти вохможность поставить новую версию libata на linux 2.6… К сожалению, официальный сайт libata сожержал только устаревшие патчи для linux 2.6. После долгих поисков я нашел сайт с патчами libata для самого свежего ядра 2.6, который позволял получить последнюю версию библиотеки libata и включить поддержку NCQ на моих дисках! Этот сайт – домашнаяя страница Tejun Heo – Корейского хокера ядра, который поддерживает набор патчей libata-tj-stable.

После применения описанного патча и перезагрузки я с удовлетворением увидел следующие сообщения насчет каналов sata-контроллера:

...
ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
ata1.00: ATA-7, max UDMA/133, 586072368 sectors: LBA48 NCQ (depth 31/32)
ata1.00: ata1: dev 0 multi count 16
ata1.00: configured for UDMA/133
...

Итак, тетерь поддержка NCQ включена на наших дисках и мы получили дополнительные 15-30% дополнительной производительности (я вижу ее на графиках трафика, потому никаких глубоких тестов не проводил – результат оказался очевиден). Итак, если вы имеете ICH-контроллер и хотите получить поддержку NCQ на ваших дисках, попробуйте эти патчи – они действительно стабильны.

[/lang_ru]