Мы заменили mmap на io_uring в нашем Rust-движке запросов. Стало медленнее

We Replaced MMAP with Io_uring in Our Rust Query Engine. It Got Slower

Мы заменили mmap на io_uring в нашем Rust-движке запросов. Стало медленнее

В 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 секунды.
  1. jandrewrogers

    Проблема здесь в том, что mmap и io_uring требуют принципиально разных программных архитектур в контексте производительности. Не стоит их менять местами.

    API вроде io_uring в сочетании с O_DIRECT позволяют спроектировать собственный планировщик в пользовательском пространстве под конкретную нагрузку с нуля. Если вы делегируете планирование рантайму, то теряете большую часть преимуществ в производительности, ради которых эти API и создавались. Во многих случаях производительность окажется хуже. Напротив, mmap неявно делегирует все решения по планированию, и у него есть некоторые преимущества, если делегирование — ваша стратегия, по сравнению с рантаймом.

    Преимущества io_uring ограничены без готовности проектировать собственные планировщики. С другой стороны, опытные проектировщики планировщиков могут увеличить производительность в разы с помощью этих API по сравнению с mmap. Проектирование планировщиков под конкретное приложение — задача не из лёгких, это высококвалифицированный труд. Но награда реальна.

    Чтобы хорошо использовать io_uring, нужно полностью перейти на требуемую им программную архитектуру, чтобы раскрыть его потенциал.

  2. laserbeam

    Настоящая проблема здесь в том, что есть часть 2 (ссылка в конце статьи), где они добиваются того, что реализация на io_uring становится вдвое быстрее mmap. Так что это кликбейтный заголовок для части 1, которая разрешается в части 2.

    То есть они накатали 2 статьи, одна из которых — чистый рейджбейт. И обе, похоже, написаны LLM. Может, у них и есть какой-то крутой совет, а может, и нет... но это не тот формат, который мне нравится читать.

  3. londons_explore

    В разработке ПО есть такой паттерн:

    * Проект существует

    * Новые сотрудники придумывают идею для повышения эффективности

    * Месяцы уходят на реализацию. Старый код становится легаси.

    * В новую штуку по ходу сборки прикручивают дополнительные фичи.

    * Эффективность новой штуки оказывается хуже исходной, но теперь движущей силой становятся новые фичи и «меньше технического долга».

    * Новая штука запускается, старая устаревает, но реальной пользы от всех этих месяцев работы почти нет.

Ещё за этот день

2026-09-11