Включение поддержки NCQ Queing на чипсетах ICH7 Chipsets под Linux
11 Aug2006

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

Беглый поиск показал, что для начала нам необходимо включить режим совместимости 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 на ваших дисках, попробуйте эти патчи – они действительно стабильны.