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