суббота, 5 декабря 2015 г.

NCQ в Linux как возможная причина медленной работы дисков

На этой неделе собирал php 5.5.30 для Debian Jessie и часто пользовался pbuilder. В какой-то момент заметил, что pbuilder слишком долго распаковывает пакеты в chroot. Проверил работу дискового массива через iostat - один из дисков зеркального RAID был занят на 10-20%, а второй на 100%. В сервере установлены два одинаковых диска TOSHIBA DT01ACA300 на 3Tb:

$ sudo hdparm -i /dev/sd{a,b}
/dev/sda:

 Model=TOSHIBA DT01ACA300, FwRev=MX6OABB0, SerialNo=Z3GHLUVGS
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=56
 BuffType=DualPortCache, BuffSize=unknown, MaxMultSect=16, MultSect=off
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=5860533168
 IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes:  pio0 pio1 pio2 pio3 pio4 
 DMA modes:  mdma0 mdma1 mdma2 
 UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 *udma6 
 AdvancedPM=yes: disabled (255) WriteCache=enabled
 Drive conforms to: unknown:  ATA/ATAPI-2,3,4,5,6,7

 * signifies the current active mode


/dev/sdb:

 Model=TOSHIBA DT01ACA300, FwRev=MX6OABB0, SerialNo=X2S0833WS
 Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs }
 RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=56
 BuffType=DualPortCache, BuffSize=unknown, MaxMultSect=16, MultSect=off
 CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=5860533168
 IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
 PIO modes:  pio0 pio1 pio2 pio3 pio4 
 DMA modes:  mdma0 mdma1 mdma2 
 UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 *udma6 
 AdvancedPM=yes: disabled (255) WriteCache=enabled
 Drive conforms to: unknown:  ATA/ATAPI-2,3,4,5,6,7

 * signifies the current active mode

Из двух дисков собран RAID1 в mdadm, а уровнем выше находится LVM.

Создал тестовый том /dev/VolGroup0/test и натравил на него fio со следующим конфигом:

[randwrite]
blocksize=4k
filename=/dev/VolGroup0/test
rw=randwrite
direct=1
buffered=0
ioengine=libaio
iodepth=32

Замеры показали около 10-30 iops, хотя должно быть 100 и более. Попробовал переключить IO scheduler на noop:

$ echo noop | sudo tee /sys/block/sda/queue/scheduler
$ echo noop | sudo tee /sys/block/sdb/queue/scheduler

Никакой разницы. А потом выключил ncq:

$ sudo hdparm -Q1 /dev/sd{a,b}

/dev/sda:
 setting queue_depth to 1
 queue_depth   =  1

/dev/sdb:
 setting queue_depth to 1
 queue_depth   =  1

После этого iops в fio стал стабильно выше 100. Для наглядности включил ncq обратно и iops через несколько секунд iops "испортился". Пока выключил, а дальше видно будет.

Комментариев нет:

Отправить комментарий