Kernel is the root of all evil ⊙.☉
Сейчас вряд ли кого-то удивить использованием
epoll()/
kqueue() в поллерах событий. Для решения проблемы
C10K cуществует довольно много разнообразных решений (
libevent/
libev/
libuv), с разной производительностью и довольно высокими накладными расходами. В статье рассматривается использование
DPDK для решения задачи обработки 10 миллионов соединений (С10M), и достижение максимального прироста производительности при обработке сетевых запросов в распространённых прикладных решениях. Главной особенностью подобной задачи является делегирование ответственности обработки трафика с ядра ОС в пользовательское пространство (userspace), точный контроль обработки прерываний и каналов
DMA, использование
VFIO, и много других не очень понятных слов. В качестве целевого прикладного окружения было выбрано Java
Netty с использованием
Disruptor паттерна и
offheap кэширования.
Если кратко — это очень эффективный способ обработки трафика, по производительности близкий к существующим аппаратным решениям. Накладные расходы от использования средств предоставленных самим ядром ОС — слишком велики, и для подобных задач оно является источником большинства проблем. Сложность заключается в поддержке со стороны драйверов целевых сетевых интерфейсов, и архитектурных особенностях приложений в целом.
В статье очень детально рассмотрены вопросы установки, настройки, использования, отладки, профилирования и разворачивания
DPDK для построения высокопроизводительных решений.