Я тестирую параллельный дисковый ввод-вывод из нескольких процессов и получаю очень разные результаты при записи в один и тот же файл или в разные файлы. Поскольку я использую O_DIRECT, я не ожидал такой разницы.
Использованный сценарий:
#!/bin/sh
set -eu
nprocs=$1
for i in $(seq $nprocs)
do
target=test_file$i
[[ "${2:-}" == "same" ]] && target=test_file
echo $(date) - Run $i/$nprocs $(dd if=/dev/zero of=$target bs=2k count=128000 oflag=direct 2>&1) &
done
Результаты:
# iostat while running: sh mkfile.sh 10
vg-cpu: %user %nice %system %iowait %steal %idle
0.39 0.00 9.62 12.09 0.00 77.89
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.00 11016.00 0.00 33409.50 6.07 81.36 0.12 0.00 0.12 0.09 100.00
# iostat while running: sh mkfile.sh 10 same
vg-cpu: %user %nice %system %iowait %steal %idle
0.51 0.00 7.95 4.87 0.00 86.67
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.00 7780.00 0.00 16362.00 4.21 0.75 0.10 0.00 0.10 0.10 74.90
Разницу можно увидеть на W/S, 11016.00 (многофайловый) и 7780.00 (однофайловый). Поскольку dd использует O_DIRECT, независимо от записи в одну и ту же физическую область, я не ожидаю какой-либо блокировки на уровне ядра, avgqu-sz низкий, а %util не достигает 100%, поэтому я также не могу физически конкурировать за ввод-вывод.
Я, должно быть, упускаю что-то действительно тривиальное :)
Есть ли у вас идеи о причине столь низкого показателя IOPS?