30 секунд задержки на сокете Java? - PullRequest
0 голосов
/ 12 октября 2011

На моем TCP-сервере, который написан на Java, иногда случайный клиент имеет задержку от 5 до 60 секунд.На сервере достаточно свободного места и процессора, когда это происходит.Когда это происходит, сокет уже открыт.

Это происходит случайным образом с определенными клиентами.Процесс java продолжается, как если бы данные были отправлены, но сервер не отправляет и не получает данные физически.

Я отключил Nagle, но не вижу, как Nagle может вызвать такую ​​задержку.

Я не очень конкретен, потому что я запутался в этом.Чем теоретически это может быть вызвано?

Другое дело: когда у одного из клиентов такой плохой лаг, у других клиентов все в порядке.И все они находятся на одном интерфейсе Ethernet сервера.Я не могу объяснить такую ​​вещь.

Ответы [ 2 ]

4 голосов
/ 12 октября 2011

Одна из причин - забыть сбросить OutputStream клиенту.Java или соответствующая ОС могут подождать, пока больше данных не заполнит пакет.

4 голосов
/ 12 октября 2011

Что теоретически может вызвать это?

Теоретические причины включают в себя:

  • Ошибка в клиентском коде. Трудно сказать, что это было бы, не глядя на код, но я бы заподозрил проблему с потоками, уведомлениями или синхронизацией.

  • Ошибка в коде сервера. Трудно сказать, что бы это было ... как указано выше.

  • Ошибка JVM. Вряд ли.

  • Ошибка операционной системы. Вряд ли.

  • Проблема с сетью. Возможно, между клиентом и сервером существует ненадежный или неправильно настроенный коммутатор / шлюз / межсетевой экран. Возможно, есть проблема с сетью и виртуализацией.

Я думаю, вам нужно использовать что-то вроде WireShark, чтобы увидеть, можете ли вы видеть, когда пакеты передаются по проводам, и так далее. Это должно помочь немного сузить его.


Это происходит случайным образом с определенными клиентами. Процесс Java продолжается, как если бы данные были отправлены, но сервер не отправляет / не получает данные физически.

Есть еще несколько вопросов, которые можно задать себе:

  • Это происходит только с «определенными» клиентами. Так в чем же их отличие?

  • Процесс Java продолжается «как если бы» данные были отправлены. Так почему же он считает, что данные отправлены?

  • Сервер не отправляет / не получает данные «физически». Что вы подразумеваете под «физически»? Почему вы знаете / считаете, что это так? Поток сервера заблокирован для чтения? Или это заблокировано в прослушивании? Получены ли вообще данные на сервере?

...