Суббота, 23.11.2024, 08:36
Приветствую Вас, Гость | RSS
Меню сайта
Статистика

Онлайн всего: 2
Гостей: 2
Пользователей: 0
Главная » 2015 » Июнь » 18 » Оценка способности сетевого стека Linux обрабатывать миллион пакетов в секунду
02:10
Оценка способности сетевого стека Linux обрабатывать миллион пакетов в секунду
Марек Майковски (Marek Majkowski), разработчик ядра Linux, работающий в компании CloudFlare, провёл заслуживающий внимания эксперимент, пытаясь разобраться насколько быстр сетевой стек ядра Linux и возможно ли в Linux обеспечить работу пользовательского приложения, способного обработать миллион UDP-пакетов в секунду на обычном сервере с шестиядерным CPU Xeon (2GHz) и сетевой картой 10G. В эксперименте применялась связка из программы для отправки данных, использующая вызов sendmmsg для отправки информации порциями по 1024 пакета за раз, и программы для приема данных, использующая системный вызов recvmmsg, более эффективный чем recv благодаря пакетной обработке данных. Первый вариант приложения продемонстрировал производительность отправки данных в диапазоне от 197 до 350 тысяч пакетов в секунду. Непостоянство производительности объяснялось миграцией обработчиков между ядрами CPU. После жесткого закрепления программы за одним ядром CPU возросла эффективность кэша и производительность стабилизировалась на отметке в 350 тысяч пакетов в секунду. Следующим шагом стало распараллеливание отправки в несколько нитей, генерация пакетов значительно возросла, но принимающая программа не смогла обработать больше чем при первой попытке, уперевшись в производительность ядра CPU, выполняющего код приложения. Данное ограничение удалось преодолеть при помощи задействования нескольких принимающих очередей (RX queue), привязанных к разным CPU и закреплённых за разными IP-адресами. Распределение запросов по двум принимающим очередям увеличил производительность до 650 тысяч пакетов в секунду. Попытка дальнейшего увеличения числа RX-очередей привела к очередному узкому месту - несмотря на то, что сетевая карта справлялась с доставкой пакетов ядру, ядро оказалось не способно доставить их приложению, которое не успевало их принимать. Увеличение числа принимающих нитей, из-за ограниченного размера буфера UDP, не улучшило положение. Справиться с ограничением помог флаг SO_REUSEPORT, позволяющий сразу нескольким слушающим сокетам подключиться к одному порту для приёма соединений. При этом каждый обработчик использует отдельный дескриптор сокета, т.е. свой отдельный принимающий буфер UDP. Запустив четыре обработчика производительность удалось довести до 1.1 млн пакетов в секунду. Привязав обработку RX-очереди и принимающее приложение к одному узлу NUMA производительность удалось поднять до 1.4 млн пакетов в секунду.
Просмотров: 224 | Добавил: muge | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Форма входа
Поиск
Календарь
«  Июнь 2015  »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
2930