У меня есть приложение, которое читает большой объем данных с диска, а также много пишет. Я пытаюсь использовать прямой ввод-вывод для улучшения производительности ввода-вывода.
Сейчас я пользуюсь libaio
реализовать асинхронный ввод-вывод, как для чтения, так и для записи. Предварительный результат показывает улучшение в стадии чтения, но большое падение в стадии написания.
Тогда я использовал strace
чтобы захватить поведение во время выполнения и вот журнал стадии чтения (я удалил несколько несвязанных журналов):
8509 20:59:03.005920 io_submit(139876672323584, 16, {{pread, filedes:102, buf:0x7f36bf816000, nbytes:524288, offset:96468992}} <unfinished ...>
8509 20:59:03.007236 <... io_submit resumed> ) = 16 <0.000893>
и вот запись этапа записи:
8098 20:47:40.219194 io_submit(140277578346496, 1, {{pwrite, filedes:116, str:"\177\362\215\264\252\360\240\306\377?\265\36/\215#%\304\0343\300\230\256\3550\374 k\316\v\225\327\""..., nbytes:524288, offset:24117248}}) = 1 <0.002457>
Вообще то же самое io_submit
API занимает разное время. Даже если отправлять 16 запросов на чтение одновременно, это все же быстрее, чем отправлять 1 запрос на запись.
Так это правильно? Как я могу оптимизировать мою стадию записи?
Задача ещё не решена.
Других решений пока нет …