2007-07-31

NCQ на ICH7*

нарыл в интернете информацию, что существуют патчи, позволяющие получить ncq на чипсете ich7, и решил разобраться, т.к. у самого такое чудо техники.

исследования показали, что патчи нафиг не нужны, но все-равно ncq заработает не на всех чипах семейства ich7. раскопки на сайте интел выдали имена чипов, поддерживающих ahci (только через ahci на ich7 доступен ncq).

но есть один нюанс. на большинстве материнов в биосе можно выбрать режим работы сата-контроллера: raid, ahci, legacy. ncq не только недоступен в режиме legacy, но и при этом контроллер идентифицируеться как принципиально не поддерживающий ahci.

в режиме легаси - 8086:27c0 :
# lspci
00:1f.2 IDE interface: Intel Corporation 82801GB/GR/GH (ICH7 Family) SATA IDE Controller (rev 01)
# lscpi -s 00:1f.2 -n
00:1f.2 0101: 8086:27c0 (rev 01)

в режиме ahci - 8086:27c1 :
# lspci
00:1f.2 SATA controller: Intel Corporation 82801GR/GH (ICH7 Family) SATA AHCI Controller (rev 01)
# lspci -n -s 00:1f.2
00:1f.2 0106: 8086:27c1 (rev 01)


соответственно ядро использует разные драйвера для работы с этими контроллерами:
# cd /usr/src/linux/drivers/ata
# grep 27c0 ./ -R
./ata_piix.c: { 0x8086, 0x27c0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich6_sata_ahci },
# grep 27c1 ./ -R
./ahci.c: { PCI_VDEVICE(INTEL, 0x27c1), board_ahci }, /* ICH7 */
для 27c0 (82801/GB) - ata_piix, без ncq
для 27с1,27с2,27c3 (82801/GR/GH/GHM) - ahci, с поддержкой ncq


соответственно, включив в биосе ahci режим, ncq будет включен автоматически:
# dmesg | grep ncq -i -B1
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.00: ATA-7: SAMSUNG SP2504C, VT100-38, max UDMA7
ata1.00: 488397168 sectors, multi 16: LBA48 NCQ (depth 31/32)
.....
обращаем внимание на надпись (depth 31/32), 31 значит что используються 31 элемента очереди. значение 0/32 значит, что ncq не может работать - не поддерживаеться контроллером либо винчестером.

для ручного выключения/включения ncq можно использовать интерфейс sysfs:
выключить (установить количество используемых элементов в 1):
# echo 1 > /sys/block/sdX/device/queue_depth
включить (задействовать все элементы очереди):
# echo 31 > /sys/block/sdX/device/queue_depth
где sdX - выбранное устройство..

удачных экспериментов :)

п.с. интересно, какой выигрыш может дать ncq....

2 коментарі:

vortex сказав...

далеко зашел :)
результат того стоит..

invalid сказав...

чем померять этот результат? бо честно говоря принципиальной разницы нет.
тем более что на 23м ядре...