Почему записи с 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 о том, как научить планировщика избегать слияния / реорганизации, но учтите, что вы не можете контролировать разбиение слишком большого запроса,

Другие вопросы по тегам