Почему записи с O_DIRECT и O_SYNC по-прежнему вызывают слияние io?
Каждый
Недавно я провёл тест fio, чтобы проверить производительность моего диска. Я сконфигурировал fio для использования прямых io и O_SYNC, и моя конфигурация следующая
[global]
invalidate=0 # mandatory
direct=1
sync=1
thread=1
norandommap=1
runtime=10000
time_based=1
[write4k-rand]
stonewall
group_reporting
bs=4k
size=1g
rw=randwrite
numjobs=1
iodepth=1
Однако, когда я наблюдаю за производительностью диска через iostat во время работы fio, я вижу следующий вывод.
avg-cpu: %user %nice %system %iowait %steal %idle
0.12 0.00 0.08 3.81 0.00 95.98
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 39.50 0.00 176.00 0.00 1648.00 9.36 1.02 5.81 5.65 99.50
WRQM / с составляет 39,50. Если stop fio, wrqm/s равно 0. Почему все еще происходит слияние, когда я выполняю прямой ввод с O_SYNC? Пожалуйста, помогите мне.
Спасибо:-)
1 ответ
В Linux выполнение прямого ввода-вывода не означает "делать именно такой ввод-вывод" - это означает обход кеша страниц Linux. Во время написания открытой страницы man это говорит о O_DIRECT
:
Постарайтесь минимизировать эффекты кэширования ввода-вывода в этот файл и из него.
Это означает, что такие вещи, как планировщик ввода-вывода Linux, по-прежнему могут выполнять свои функции в отношении слияний, переупорядочений (использование вами fio sync=1
это то, что останавливает изменение порядка) O_DIRECT
I / O.
Смотрите различные параметры nomerges
в https://www.kernel.org/doc/Documentation/block/queue-sysfs.txt о том, как научить планировщика избегать слияния / реорганизации, но учтите, что вы не можете контролировать разбиение слишком большого запроса,