Процесс, с помощью которого сетевой стек Linux получает данные, немного сложнее. Я написал comprehensive guide to the Linux network stack, который объясняет все, что вам нужно знать, начиная с драйвера устройства, до очереди приема сокета в пользовательской программе.
Есть много мест буферы поддерживаются в ядре:
- ДМА кольцо, где пакеты написаны NIC после того, как они прибыли.
- Ссылки на пакеты на кольце DMA используются для обработки пакета.
- В конце концов, пакетные данные добавляются в очередь обработки, если очередь приема уже не заполнена.
- Считывает из гнезда вытягивает пакеты из очереди приема процесса.
- Если происходит обнюхивание пакетов, данные пакета дублируются и отправляются на любые фильтры, добавленные кодом обнюхивания пакетов.
Полный процесс перемещения, учета и отбрасывания данных (при необходимости) описан в сообщении в блоге, приведенном выше.
Теперь, если вы хотите быстрее обрабатывать сообщения, я полагаю, вы хотите сказать, что хотите сократить латентность обработки пакетов, правильно? Если это так, вам следует подумать об использовании SO_BUSYPOLL
, что может помочь уменьшить латентность обработки пакетов.
Увеличение буфера приема просто увеличивает количество пакетов, которые могут быть поставлены в очередь для сокета userland. Чтобы увеличить мощность обработки пакетов, вам необходимо тщательно отслеживать и настраивать каждый компонент сетевого стека. Возможно, вам понадобится использовать что-то вроде RPS для увеличения количества пакетов обработки процессоров.
Вы также захотите следить за каждым компонентом сетевого стека, чтобы обеспечить достаточную доступность буферов и вычислительной мощности процессора для обработки рабочей нагрузки вашего пакета.
@downvoter Вы меня дезориентируете. Я действительно правильно назвал имена опций, и трудно понять, к чему может обратиться рекомендация OP. – EJP