С выпуском dnsjit v0.9.3 завершена первая веха проекта Производительность и ответы. Фокус этой вехи несколько сместился с тех пор, как она была определена, большая часть работы была направлена на другие части dnsjit для повышения производительности, потому что потоки не всегда являются решением.
Проект финансируется Comcast Innovation Fund для дальнейшего развития drool, который был переписан на Lua/dnsjit.
Пакеты dnsjit v0.9.3 можно найти в предрелизных каналах для Debian, Ubuntu, CentOS, RHEL, SLE и openSUSE.
Улучшения ввода
Для ввода пакетов я добавил еще 3 модуля:
- fpcap: используйте fopen(), чтобы прочитать PCAP и проанализировать его без libpcap
- mmpcap: используйте mmap(), чтобы прочитать PCAP и проанализировать его без libpcap.
- pcap: использовать libpcap
На моем ноутбуке (Dell XPS 13 Developer 9350) они работают следующим образом:
- pcap: 6,38 млн пакетов в секунду
- fpcap: 7,21 млн пакетов в секунду +13%
- mmpcap: 23,2 млн пакетов в секунду +264%.
Парсинг сетевых пакетов
Для разбора стека пакетов, который встроен в pcap-thread, я добавил filter.layer и переиспользовал код из pcap-thread, они работают следующим образом:
- pcapthread: 3,60 млн пакетов в секунду
- pcap: 3,96 млн пакетов в секунду +10%
- fpcap: 4,36 млн пакетов в секунду +21%
- mmpcap: 7,97 млн пакетов в секунду +121%
Потоки
Что касается пропускной способности потоков, несмотря на то, что пока не используется атомарность, есть некоторый прирост и упрощение кода. Мой ноутбук может передавать пустой статический объект между потоками со скоростью около 11M/сек, код SLLQ, используемый в drool v1.1.0, делает чуть более 5M/сек. Обратите внимание, что выполнение этого в одном потоке дает 200–250 Мбит/с, поэтому в зависимости от рабочей нагрузки использование потоков может оказаться нецелесообразным.
Отправка запросов
Для отправки запросов я добавил очень простой UDP-DNS-клиент (output.udpcli), который просто берет всю полезную нагрузку UDP-запроса и отправляет ее с помощью sendto(). Используя ввод mmpcap, новый код потока, filter.layer и output.udpcli, мой ноутбук достиг максимальной скорости 450Kqps на локальном хосте. Для drool v1.1.0 максимальное значение составляло около 260Kqps.
Пользовательский Lua
Также была проделана работа над дизайном w.r.t. добавление пользовательского кода Lua между модулями. Я добавил модуль, который использует сопрограммы Lua, чтобы удвоить производительность и упростить получение данных из обработки (пример), предыдущий способ имел собственное состояние Lua, поэтому никакие данные не могли быть разделены с основным государство.
Здесь ведется дополнительная работа по возврату цепочки процессов, вместо построения цепочки получателей (вход-›получатель-›получатель-›вывод) можно было бы иметь цепочку производителей ( input‹-produce‹-produce), который извлекает объекты, а не получает их. Это позволяет строить цепочки, которые используют и то, и другое, а также пользовательский Lua посередине (производитель‹-lua-›получатель), и это очень хорошо работает (пустые статические объекты):
- ноль:приемник() -> ноль:получать(): 210M/сек
- ноль:производить() ‹- null:производитель(): 253M/сек
- ноль: произвести() ‹- lua -> null:receive(): 216 МБ/с
Это будет окончательный способ обработки PCAP!
С уважением,
Джерри