Зависание селектора Java NIO (jdk1.6_20) - PullRequest
1 голос
/ 07 августа 2011

Я использую jdk1.6_20 на Linux 2.6.Я наблюдаю поведение, при котором селектор NIO после вызова Selector.select(timeout) не может проснуться в течение времени ожидания (timeout=5 sec).Возвращается намного позже, задержка на пару секунд (2 ~ 10 секунд).Похоже, что это часто происходит в течение первых нескольких минут запуска приложения и стабилизируется позже.Так как наш сервер бьется с клиентом по сердцу, селектор не может вовремя проснуться, он пропускает биение, и узел отключает нас.

Любая помощь приветствуется.Спасибо.

Ответы [ 4 ]

2 голосов
/ 07 августа 2011

Из Javadoc для Selector.select(long):

Этот метод не предлагает гарантий в реальном времени: он планирует тайм-аут, как если бы вызывал Object.wait (long) метод.

Поскольку время запуска приложения может сильно нагружать систему, это может привести к задержкам включения.

Для решения: переключиться на Selector.selectNow() как неблокирующая операция и обработка повторов в коде вашего приложения.

0 голосов
/ 15 апреля 2012

хм ... на самом деле история на этом не останавливается .. мы не используем инкрементные cms ... поэтому во время параллельной фазы не происходит отказ от процессора ... у нас 2 сервера приложений на одном хосте с 16 ядрамии каждый из них имеет 4 параллельных потока CMS, кроме потоков приложений, число которых приблизительно равно 45–60. Следовательно, наиболее вероятны шансы нехватки ресурсов процессора, особенно потому, что мы видим, что каждый раз, когда селектор задерживается, он составляет 100–200 миллисекунд сразу послефаза одновременной отметки ..

0 голосов
/ 08 августа 2011

не может проснуться в течение времени ожидания (тайм-аут = 5 секунд).

Он не должен «просыпаться в течение тайм-аута». Предполагается, что он пробуждается после истечения времени ожидания. Если вы должны послать сердцебиение в течение 5 секунд, время ожидания 5 секунд слишком велико. Я бы сделал это 2,5 с в этом случае.

0 голосов
/ 07 августа 2011

Неважно, что такое timeout, как только клиент подключается, селектор должен немедленно проснуться. Поэтому у вас есть более серьезные ошибки.

...