Hitting Peak File IO Performance with Zig
Как выжать максимум из файлового IO в Linux на Zig + io_uring
Тест
- Железо: Ubuntu 24.04, 6.14, NVMe, 32 ядер, 756 ГБ ОЗУ (не влияет,
direct_io). - Параметры: 512 КБ блок, очередь 64, 16 ГБ файл, один поток.
Результаты
| fio | Zig | |
|---|---|---|
| write | 4.08 ГБ/с | 3.80 ГБ/с |
| read | 7.33 ГБ/с | 7.00 ГБ/с |
Zig на 5–7 % медленнее fio, но близко к пределу SSD.
Ключевые фишки реализации
- Полл-режим (
IOPOLL) +nvme.poll_queues=16→ прерывания не нужны. - Два экземпляра io_uring: один с
IOPOLL(только read/write), второй – для остального. - Зарегистрированные буферы: память выделяется заранее, пользователь получает/возвращает готовые блоки.
- Выравнивание:
- чтение – внутренняя «перехватка» невыравненных запросов;
- запись – пользователь сам выравнивает, иначе лишние read-modify-write.
- Без слияния IO внутри библиотеки – проще и гибче на уровне приложения.
Код: steelcake/csio