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).

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