Мы заменили mmap на io_uring в нашем Rust-движке запросов. Стало медленнее
We Replaced MMAP with Io_uring in Our Rust Query Engine. It Got Slower

В Conviva мы проанализировали замену mmap на io_uring в нашем Rust-движке запросов на базе DataFusion и Arrow. Ожидалось, что прямой ввод-вывод через io_uring устранит проблемы с page cache и блокировками, которые вызывали всплески p95 до 150 секунд под нагрузкой. Однако на Linux запросы стали выполняться на 60% медленнее: 21,8 секунды против 13,6. Хотя major faults сократились в 35 раз, minor faults выросли в 8 раз, что свело на нет всё преимущество.
Мы решили именно ту проблему, которую io_uring и должен решать: ядро больше не тратило силы на major page-ins. Но minor faults выросли в 8 раз, а общее время запроса увеличилось с 13,6 до 21,8 секунды.
- jandrewrogers
Проблема здесь в том, что mmap и io_uring требуют принципиально разных программных архитектур в контексте производительности. Не стоит их менять местами.
API вроде io_uring в сочетании с O_DIRECT позволяют спроектировать собственный планировщик в пользовательском пространстве под конкретную нагрузку с нуля. Если вы делегируете планирование рантайму, то теряете большую часть преимуществ в производительности, ради которых эти API и создавались. Во многих случаях производительность окажется хуже. Напротив, mmap неявно делегирует все решения по планированию, и у него есть некоторые преимущества, если делегирование — ваша стратегия, по сравнению с рантаймом.
Преимущества io_uring ограничены без готовности проектировать собственные планировщики. С другой стороны, опытные проектировщики планировщиков могут увеличить производительность в разы с помощью этих API по сравнению с mmap. Проектирование планировщиков под конкретное приложение — задача не из лёгких, это высококвалифицированный труд. Но награда реальна.
Чтобы хорошо использовать io_uring, нужно полностью перейти на требуемую им программную архитектуру, чтобы раскрыть его потенциал.
- laserbeam
Настоящая проблема здесь в том, что есть часть 2 (ссылка в конце статьи), где они добиваются того, что реализация на io_uring становится вдвое быстрее mmap. Так что это кликбейтный заголовок для части 1, которая разрешается в части 2.
То есть они накатали 2 статьи, одна из которых — чистый рейджбейт. И обе, похоже, написаны LLM. Может, у них и есть какой-то крутой совет, а может, и нет... но это не тот формат, который мне нравится читать.
- londons_explore
В разработке ПО есть такой паттерн:
* Проект существует
* Новые сотрудники придумывают идею для повышения эффективности
* Месяцы уходят на реализацию. Старый код становится легаси.
* В новую штуку по ходу сборки прикручивают дополнительные фичи.
* Эффективность новой штуки оказывается хуже исходной, но теперь движущей силой становятся новые фичи и «меньше технического долга».
* Новая штука запускается, старая устаревает, но реальной пользы от всех этих месяцев работы почти нет.