Проблема с Nio каналами ("сжирание процессорного времени")
От: babaev  
Дата: 11.08.06 10:16
Оценка:
Есть чат, в котором сообщения выдаются в Keep-Alive соединение. Быстро и трафик не тратится, но не об том.

Обрабатываются эти соединения при помощи NIO, создаются каналы, назначаются interestOps.

Некоторое время программа работает отлично, но потом ("потом" — это не фиксированное время, может через час, может — через двое суток) вдруг подскакивает использование процессора до 100%.

Это внешнее проявление, внутри, как я разобрался, происходит следующее. Есть _selector.select(), который выявляет ключи, которые требуют обработки. Обычно он блокируется до того момента, когда эти ключи появятся. Когда ключи появились, он возвращает положительное число (количество ключей).

Через время "Х" (которое "потом") этот селект начинает почему-то возвращать 0 и перестает блокироваться.

Я знаю ситуацию, когда это бывает — это когда назначаем всем без разбору SelectionKey.OP_WRITE. Но я очень аккуратно убираю этот ключ, когда запись очередного блока завершена.

Внимание, вопрос!

В каких еще ситуациях может возникнуть такая штука? Если эти ситуации никак не отследить (например, что-то жесткое вроде отсоединения кабеля — что будет?), то как корректно пересоздать selector? Чтобы сохранить все каналы, которые были созданы, и так далее...

Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.