EMZETT.
Войти

epoll и io_uring

Коротко: epoll и io_uring — интерфейсы Linux, с помощью которых программа эффективно обслуживает тысячи соединений или файловых операций одновременно.

Подробнее: Классический путь — блокировать по потоку на каждое соединение — плохо масштабируется. Событийные серверы вместо этого спрашивают у ядра, какие соединения готовы.

Подробности

  • select/poll: При каждом вызове передают весь список и проверяют его линейно, медленно при многих соединениях.
  • epoll: Ядро запоминает список наблюдения. epoll_wait возвращает только готовые соединения, затраты растут с числом активных, а не всех соединений. Основа nginx, Node.js (libuv) и Redis.
  • io_uring: Два кольцевых буфера между программой и ядром (подача и завершение). Программа ставит в очередь множество операций и забирает результаты, не платя системным вызовом за каждую. Работает и для файлов.
  • Осторожно: У io_uring были некоторые проблемы с безопасностью, в ряде сред его отключают.
  • Похожее: kqueue (BSD, macOS) и IOCP (Windows).
  • Следствие: Один поток может держать десятки тысяч соединений (проблема C10k).

См. также: Сокеты, Кольцевой буфер