Как на самом деле работают сокеты udp? - PullRequest
1 голос
/ 06 февраля 2012

Я пытаюсь свести манипуляции с пакетами к минимуму, чтобы повысить эффективность конкретной программы, над которой я работаю, но я борюсь со временем, которое требуется для отправки через сокет udp с помощью sendto / recvfrom. Я использую 2 очень простых процесса (приложения), один отправляет, другой получает.

Я хочу понять, как внутренне работает linux при использовании этих вызовов функций ...

Вот мои наблюдения: при отправке пакетов по адресу:

  • 10Kbps, время, необходимое для передачи сообщений из одного приложения в другое, составляет около 28us
  • 400 Кбит / с, время, необходимое для передачи сообщений из одного приложения в другое, составляет около 25us
  • 4 Мбит / с, время, необходимое для передачи сообщений из одного приложения в другое, составляет около 20us
  • 40 Мбит / с, время, необходимое для передачи сообщений из одного приложения в другое, составляет около 18us

При использовании разных процессоров время явно отличается и согласуется с этими наблюдениями. Должна быть какая-то настройка, которая позволяет некоторым чтениям очереди выполняться быстрее в зависимости от потока трафика в сокете ... как это можно контролировать?

При использовании узла только в качестве узла пересылки вход и выход занимает около 8us при использовании потока 400 Кбит / с, я хочу максимально приблизиться к этому значению. 25us неприемлемо и считается медленным (очевидно, что в любом случае это намного меньше, чем задержка между каждым пакетом ... но дело в том, чтобы в конечном итоге иметь возможность обрабатывать большее количество пакетов, следовательно, на этот раз нужно укоротить!). Есть ли что-нибудь быстрее, чем sendto / recvfrom (необходимо использовать 2 разных приложения (процесса), я знаю, что не могу использовать монолитный блок, поэтому мне нужна информация для отправки в сокет)?

...