tak jsem zkoušel znovu všechny kombinace write-cache a ncq pomocí tohoto skriptu (fio je asi lepší než ioping, ale vychází to stejně):
#!/bin/bash
DISK=sde #pozor, sem zapisuje
for w in 0 1
do
for n in 1 31
do
echo "WC=" ${w} " NCQ=" ${n}
for i in randread randwrite read write
do
sync
sync
echo 3 > /proc/sys/vm/drop_caches
for d in /dev/sd?
do
j=`basename ${d}`
blockdev --flushbufs ${d}
hdparm -W ${w} -F -f ${d} 2>/dev/null >/dev/null
echo ${n} > /sys/block/${j}/device/queue_depth
done
echo -n " " ${i} " : "
fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=/dev/${DISK} --bs=4k --iodepth=64 --size=128G --readwrite=${i} --runtim=140 --ramp_time=20 | grep iops
done
done
done
A výsledek je nakonec jinačí, než jsem čekal, takže jsem neměl pravdu.
Třeba WD 8TB UltraStar (HGST) (nešindelovej snad)
NCQ=1 , WC=0: read 558 iops, 251.7 MB/s, write 262 iops, 7.6 MB/s
NCQ=31, WC=0: read 1282 iops, 200.8 MB/s, write 420 iops, 11.1 MB/s
NCQ=1 , WC=1: read 556 iops, 251.7 MB/s, write 440 iops, 148.3 MB/s
NCQ=31, WC=1: read 1278 iops, 199.7 MB/s, write 453 iops, 89.1 MB/s
NCQ zvyšuje náhodné čtení, to jste čekali, ale kupodivu snižuje sekvenční čtení
zkoušel jsem echo check > /sys/block/md0/md/sync_action a je to opravdu bez NCQ o kapku rychlejší
btrfs scrub je bez NCQ pomalejší, on to asi nečte sekvenčně, ale spíš po souborech - náhodně
WC o dost sníží sekvenční zápis, kupodivu náhodný zápis s vypnutým WC, ale zapnutým NCQ je stejně vysoký
Se zapnutým WC NCQ spíše snižuje sekvenční zápis, podobně jako u čtení
takže asi záleží, asi se hodí při sekvenční zátěži NCQ vypnout (kontrola md z cronu, kopírování disku dd u zdroje i cíle)