1

Мне сказали увеличить размер буфера TCP, чтобы быстрее обрабатывать сообщения. Мой вопрос, независимо от того, какой буфер я использую для сообщения TCP (ByteBuffer, DirectByteBuffer и т. Д.), Когда процессор получает прерывание от NIC, чтобы обрабатывать сетевой запрос для чтения данных сокета, поддерживает ли OS буфер в памяти вне адресного пространства процесса запроса (Ig процесс, который прослушивает сокет)Буфер TCP в адресном пространстве памяти процесса?

или

любым способом, процессор получает данные по сети, он всегда будет записан в буфер адресного пространства только и не буфера (в том числе «ПРИЕМ -Q 'и' Send-Q 'команды netstat) за пределами адресного пространства поддерживается для этого сообщения?

ответ

-1

Вам сообщают, что размеры буферов посылаются или получаются. Они связаны с сокетом в TCP-части ядра. См. setsockopt() и SO_RCVBUF и SO_SNDBUF.

+0

@downvoter Вы меня дезориентируете. Я действительно правильно назвал имена опций, и трудно понять, к чему может обратиться рекомендация OP. – EJP

-1

См: http://linux.die.net/man/3/setsockopt

Варианты SO_SNDBUF и SO_RCVBUF. Если вы напрямую используете C-API, вызов сам устанавливает. Если вы используете какую-то структуру, посмотрите, как установить параметры сокета. Это действительно буфер на стороне ядра, а не один из ваших процессов. Он определяет, сколько ячеек может содержать ядро ​​для вас, чтобы выбрали из вызова для чтения/получения. Он также влияет на механизм TCP-протокола flow control.

+0

@downvoter Пожалуйста, объясните. Этот ответ не только корректен, но и поддерживается ссылкой. – EJP

0

Процесс, с помощью которого сетевой стек Linux получает данные, немного сложнее. Я написал comprehensive guide to the Linux network stack, который объясняет все, что вам нужно знать, начиная с драйвера устройства, до очереди приема сокета в пользовательской программе.

Есть много мест буферы поддерживаются в ядре:

  1. ДМА кольцо, где пакеты написаны NIC после того, как они прибыли.
  2. Ссылки на пакеты на кольце DMA используются для обработки пакета.
  3. В конце концов, пакетные данные добавляются в очередь обработки, если очередь приема уже не заполнена.
  4. Считывает из гнезда вытягивает пакеты из очереди приема процесса.
  5. Если происходит обнюхивание пакетов, данные пакета дублируются и отправляются на любые фильтры, добавленные кодом обнюхивания пакетов.

Полный процесс перемещения, учета и отбрасывания данных (при необходимости) описан в сообщении в блоге, приведенном выше.

Теперь, если вы хотите быстрее обрабатывать сообщения, я полагаю, вы хотите сказать, что хотите сократить латентность обработки пакетов, правильно? Если это так, вам следует подумать об использовании SO_BUSYPOLL, что может помочь уменьшить латентность обработки пакетов.

Увеличение буфера приема просто увеличивает количество пакетов, которые могут быть поставлены в очередь для сокета userland. Чтобы увеличить мощность обработки пакетов, вам необходимо тщательно отслеживать и настраивать каждый компонент сетевого стека. Возможно, вам понадобится использовать что-то вроде RPS для увеличения количества пакетов обработки процессоров.

Вы также захотите следить за каждым компонентом сетевого стека, чтобы обеспечить достаточную доступность буферов и вычислительной мощности процессора для обработки рабочей нагрузки вашего пакета.