Какая задержка в TCP / UDP? - PullRequest
       50

Какая задержка в TCP / UDP?

3 голосов
/ 27 октября 2009

ПОМОГИТЕ ПОЖАЛУЙСТА! У меня есть приложение, которое требует максимально возможной обработки в реальном времени, и я продолжаю сталкиваться с этой необычной проблемой задержки как с TCP, так и с UDP. Задержка происходит, как по маслу, и она всегда одинакова (чаще всего от 15 до 16 мс). Это происходит при передаче на любую машину (даже локальную) и в любой сети (у нас их две).

Быстрое решение проблемы:

Я всегда использую winsock в C ++, скомпилированную в VS 2008 Pro, но я написал несколько программ для отправки и получения различными способами, используя как TCP, так и UDP. Я всегда использую промежуточную программу (запущенную локально или удаленно), написанную на разных языках (MATLAB, C #, C ++), для пересылки информации из одной программы в другую. Обе программы winsock работают на одной машине, поэтому они отображают временные метки для Tx и Rx с одинаковых часов. Я продолжаю наблюдать появление шаблона, при котором пакет пакетов будет передан, и затем перед следующим пакетом будет задержка около 15-16 миллисекунд, несмотря на то, что не запрограммирована никакая задержка. Иногда между каждым пакетом может быть 15-16 мс вместо пакет пакетов. В других случаях (редко) у меня будет другая задержка, например ~ 47 мс. Кажется, я всегда получаю пакеты обратно в течение миллисекунды после их передачи, хотя между передаваемыми пакетами наблюдается одинаковая задержка.

У меня есть подозрение, что winsock или NIC буферизуют пакеты перед каждой передачей, но я не нашел никаких доказательств. У меня есть гигабитное соединение с одной сетью, которая получает различные уровни трафика, но я также испытываю то же самое при запуске промежуточной программы в кластере с частной сетью без трафика (по крайней мере от пользователей) и 2-гигабитным соединением. Я даже почувствую эту задержку при локальном запуске промежуточной программы с отправляющей и принимающей программами.

Ответы [ 4 ]

4 голосов
/ 28 октября 2009

Я выяснил проблему сегодня утром, переписывая сервер на Java. Разрешение моих системных часов Windows составляет от 15 до 16 миллисекунд. Это означает, что каждый пакет, который показывает ту же миллисекунду, что и его время передачи, фактически отправляется с разными миллисекундами с интервалом в 16 миллисекунд, но мои временные метки увеличиваются каждые 15-16 миллисекунд, поэтому они выглядят одинаково.

Я пришел сюда, чтобы ответить на мой вопрос, и увидел ответ о повышении приоритета моей программы. Поэтому я запустил все три программы, зашел в диспетчер задач, поднял все три до приоритета «в реальном времени» (чего не было у других процессов) и запустил их. Я получил те же интервалы от 15 до 16 миллисекунд.

Спасибо за ответы.

2 голосов
/ 27 октября 2009

Всегда используется буферизация, и она зависит от оборудования / драйверов / ОС и т. Д. Планировщики пакетов также играют большую роль.

Если вам нужны гарантии в режиме реального времени, вам, вероятно, следует держаться подальше от Windows ...

0 голосов
/ 28 декабря 2012

О да, я знаю, что вы имеете в виду. Windows и ее буферы ... попробуйте настроить значения SO_SNDBUF на отправителе и SO_RCVBUF на стороне получателя. Также проверьте соответствующее сетевое оборудование (маршрутизаторы, коммутаторы, медиашлюзы) - устраните как можно больше между компьютерами, чтобы избежать задержки.

0 голосов
/ 28 октября 2009

Вероятно, вы видите задержку планировщика - ваше приложение ожидает, пока другие процессы завершат свои временные интервалы и освободят ЦП. Стандартные временные интервалы в многопроцессорных Windows - от 15 мс до 180 мс.

Вы можете попытаться повысить приоритет вашего приложения / потока.

...