CloudFlare применил NetMap для повышения скорости обработки пакетов в Linux
Добившись возможности обрабатывать на штатном сетевом стеке ядра Linux миллион пакетов в секунду, инженеры сети доставки контента CloudFlare продолжили разработку методов увеличения скорости обработки трафика. На этот раз была предпринята попытка задействовать средства прямого взаимодействия с сетевым адаптером, позволяющие в десять раз поднять скорость обработки пакетов по сравнению с использованием сетевого стека Linux.
Для организации прямой обработки пакетов решено использовать фреймворк NetMap, который разработан для FreeBSD, но также поддерживает Linux и Windows. Проблема оказалась в том, что NetMap осуществляет перенаправление обработки всех входящих (RX) очередей сетевой карты, отсоединяя их от штатного сетевого стека, в то время как была поставлена задача раздельной обработки очередей: при помощи NetMap планировалось обрабатывать только простейшие потоки трафика, связанные с вредоносной активностью, такой как UDP-флуд, а обработку обычного трафика необходимо было оставить как есть с использованием штатного сетевого стека Linux.
В итоге, компания CloudFlare присоединилась к разработке NetMap и, развив имеющиеся наработки Павла Одинцова, подготовила набор изменений с реализаций режима выборочной обработки RX-очередей пакетов, позволяющего связать с NetMap отдельные очереди пакетов, закрепив остальные за обработчиком в сетевом стеке ядра. Перенаравив в связанную с NetMap очередь специфичный трафик, появляется возможность его обработки специально оптимизированным приложением вне сетевого стека.
Данное NetMap-приложение выделяет в общем потоке нормальные запросы и возвращает их на обработку в обычный сетевой стек, отсеивая флуд (например, в результате DDoS-атаки через наводнение DNS-запросами). Тестирование показало, что подобный обработчик в пространстве пользователя способен разбирать трафик со скоростью 5.8 млн пакетов в секунду, при сохранении неизменного процесса обработки ядром остальные сетевых потоков.
Полный текст статьи читайте на OpenNet