Обмен данными через сокет Java nio для двух процессов, расположенных на одном или двух компьютерах - PullRequest
1 голос
/ 18 ноября 2011

Я новичок в сети и задаю простой вопрос, который меня очень смущает. Я надеюсь, что люди, которые имеют много сетевых знаний, могут помочь.

Я постоянно отправляю сообщения из процесса A в процесс B. Если A и B расположены на одной машине, средняя сквозная задержка составляет ~ 6 мс; если A и B расположены на двух машинах в локальной сети (соединенных очень простым маршрутизатором), средняя сквозная задержка составляет ~ 176 мс. Процесс A и процесс B взаимодействуют с использованием неблокирующего сокета Java. Каждое сообщение занимает 10 КБ, и копии одного сообщения отправляются разным получателям.

Еще один тест - изменение количества копий сообщений. В этом тесте есть три процесса (A, B и C), в которых процесс A отправляет процессу B, а процесс B отправляет процессу C. Если отправлена ​​одна копия сообщения, задержка End2End составляет ~ 10 мс; если две копии сообщений отправляются последовательно (20 КБ), задержка end2end составляет 147 мс; если четыре копии сообщений отправляются одна за другой (40 КБ), задержка end2end составляет ~ 800 мс. Каждые 1000 мс отправляется новое сообщение.

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

Часть кода находится по этой ссылке: Как позволить селектору изменить этот ключ сокет-канала в java nio

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

Ответы [ 2 ]

1 голос
/ 18 ноября 2011

Время как для локальной машины, так и для всей сети кажется немного медленным для такого количества данных. Конечно, это также зависит от того, какая обработка данных выполняется и выполняется ли она синхронно или асинхронно. Например, замедление, когда несколько запросов отправляются подряд, можно объяснить асинхронной обработкой данных. Если данные извлекаются из запроса и помещаются в очередь для «обработки» и ответ немедленно отправляется, то это может быть относительно быстро. Если последующие запросы должны блокироваться во время обработки очереди перед возвратом, это может объяснить замедление. Но сейчас я просто размышляю.

Скорость запроса по сети, очевидно, зависит от физического расстояния, количества прыжков и т. Д. Но цифры, по-видимому, указывают, что в целом он медленнее, чем должен быть. И наиболее вероятная причина состоит в том, что логика в коде не верна ... но без дополнительной информации нелегко угадать причины (по крайней мере, для меня).

Из любопытства я просто выполнил несколько быстрых тестов, которые отправляли сообщения через сокеты на моем локальном компьютере, причем каждый запрос был 10 КБ (пакет ответа намного меньше). Среднее время приема-передачи составило всего 0,22 мс. Аналогичный тест для сервера в двух прыжках в сети в среднем составлял 1,9 мс за один прием. Это было с использованием TCP / IP. При использовании UDP к серверу через два прыжка время составляло в среднем 1,7 мс.

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

Более ценно, однако, вы можете использовать ping, чтобы получить базовый показатель того, как долго вы ожидаете, что это займет. Вы можете указать размер пакета для ping (опция -s или, возможно, -l в зависимости от используемой версии). Проверка связи с теми же двумя машинами, на которых я запускал другой тест, подтвердила, что время имело смысл.

0 голосов
/ 18 ноября 2011

Через сеть всегда медленнее, чем внутри данного процессора.

...