максимизация linux сырой пропускной способности сокета - PullRequest
0 голосов
/ 19 марта 2020

У меня есть простое приложение, которое получает пакеты фиксированного типа ethernet через необработанный сокет (транспортный протокол rnet) и отправляет два дубликата через другой интерфейс (через необработанный сокет):

recvfrom() //blocking 
//make duplicate 
//add tail
sendto(packet1);
sendto(packet2);

I хочу два увеличить пропускную способность. Мне нужно как минимум 4000 кадров в секунду, не могу изменить размер пакета. Как я могу достичь этого? Встраиваемая система (AM335x Так C), ядро ​​4.14.40 ... Как повысить производительность?

1 Ответ

0 голосов
/ 19 марта 2020

Несколько соображений:

  1. Я знаю, вы сказали, что вы не можете изменить «размер пакета», но использование буферизованных записей и нечастых сбросов может реально повысить производительность
  2. Вы можете включить jumbo frames
  3. Вы можете отключить Nagle

Обычно люди не хотят менять размеры своих пакетов, потому что они ожидают соответствия 1: 1 между их send () и recv (). Это не очень хорошая вещь, потому что TCP специально не гарантирует, что ваши send () и recv () будут иметь соответствие 1-1. Обычно они равны 1-1, но они не гарантируют 1012 *. Передача данных с включенным Nagle или через много переходов маршрутизатора или без включенного Path MTU Discovery делает отношение 1-1 менее вероятным.

Так что если вы используете буферизацию и каким-то образом кадрируете свои данные (EG 1: завершайте сообщения nul byte, если ваши данные иначе не могут иметь значение nul или EG 2: длина передачи в виде сетевых шортов или чего-то еще, так что вы знаете, сколько читать), вы, вероятно, убьете двух зайцев одним выстрелом - то есть получить лучшую скорость и лучшую надежность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...