![]() |
|
Модераторы: xvr |
![]()
|
|
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: нет Всего: 25 |
Имеем вот такой циклик, который умудряется обрабатывать порядка 2863311 пакетов в секунду
единственное, что меня не устраивает что данный код практически полностью загружают процессор
принимаю любые идеи по оптимизации -------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| vinick |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 9.6.2005 Репутация: 4 Всего: 22 |
По идее select может снизить нагрузку на процессор, но в этом случае я не уверен.
сам цикл имеет смысл заменить на memset, и в массиве counter_packet_size - всегда используется только один элемент, обнулять его потом целиком нет смысла,да и вместо самого массива дешевле отправлять только одно значение (rec>>6)&0x00ff, но это потребует изменения принимающей стороны. Еще, может быть объединить все три массива в один и отправлять одним вызовом sendto. |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
Step,
1. концептуальная оптимизация - использование отображения пакетов на кольцевой буфер через mmap ну и мультиплексация через epoll это позволит уменьшить количество вызовов recvfrom подробнее в linux/Documentation/networking/packet_mmap.txt 2. фильтрация на уровне сниффера достаточо при создании пакетного сокета указать третьим параметром htons(ETH_P_IP) Добавлено @ 12:59 vinick,аз memset - это тоже цикл, хоть и оптимизированный что касается sendto, то он вызывается по таймауту, а таймаут отсчитывается по секундам (используется time(NULL)), поэтому sendto вызывается не чаще 1-го раза в секунду а т. к за одну секунду приходит больше 2-х миллионов пакетов, то оптимизировать это не имеет никакого смысла -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: нет Всего: 25 |
MAKCim, спасибо,
вы бы не могли пояснить в двух словах 1. "позволит уменьшить количество вызовов" я не совсем понял, за счет чего, мне нужно обрабатывать каждый пакет, приведенная схема обработки это только начало 2. htons(ETH_P_IP) в двух словах что это чего я себя лишаю, и что преобретаю -------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
в существующей схеме для получения одного пакета нужен один вызов recvfrom при использовании отображения мы через epoll_wait получим уведомление о том, что пришел как минимум один пакет его считывание - это не вызов recvfrom, а чтение части отображенного на адресное пространство процесса буфера иными словами, используя один вызов epoll_wait, мы можем прочитать более одного пакета без перехода в режим ядра
лишаешь себя возможности обработки не IP-пакетов приобретаешь... весь "мусор" типа ARP и ICMP отбрасывается -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: нет Всего: 25 |
т.е. если я правильно понял, мы в этом случае работаем напрямую с буфером приема сетевой карты, избавляем себя от целого ряда ненужных операций Добавлено через 1 минуту и 15 секунд
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
а, ну если нужно, тогда нужно я просто по коду смотрел там только на IP проверка
напрямую с буфером мы не работаем но от целого ряда ненужных операций себя избавляем -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |