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).
См. также: Сокеты, Кольцевой буфер