sun.rmi.transport.tcp.TCPTransport использует 100% CPU - PullRequest
2 голосов
/ 15 февраля 2012

Я разрабатываю коммуникационную библиотеку, основанную на неблокирующих SocketChannels NIO, чтобы я мог использовать select, чтобы поддерживать низкий уровень загрузки процессора (и быстрее реагировать на другие события).SocketChannel создаются внешне для моего потока и добавляются в список, который он обрабатывает, помечая их как неблокирующие и добавляя их в Selector для операций READ (и WRITE, когда это необходимо, но в моей проблеме этого не происходит).

У меня есть небольшое приложение Swing для локальных тестов, которое может быть клиентом или сервером: клиент подключается к серверу, и они могут отправлять друг другу сообщения.Довольно простой и отлично работает, за исключением процессора, который достигает 100% (50% для каждого jvm), как только устанавливается соединение между клиентом и сервером.

Запуск jvisualvm показывает мне, что sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run() использует98% времени приложения, считая только 3 вызова метода!Трассировка принудительного стека показывает, что она блокируется при операции read на FilteredInputStream, на Socket.

Я немного озадачен, поскольку не использую RMI (хотя я понимаю NIOи RMI может совместно использовать «транспортную» часть кода).Я видел несколько похожих вопросов, но каждый из них специально использовал RMI, а я нет.Ответы, которые я видел, состоят в том, что этот ConnectionHandler.run() метод отвечает за маршалинг / демаршаллинг, когда я получаю 100% CPU без сетевого трафика.Я могу только вывести активное ожидание на сокеты, но это звучит странно, особенно с неблокирующими SocketChannel ...

Любая идея будет принята с благодарностью!

1 Ответ

2 голосов
/ 17 февраля 2012

Я отслеживал использование ЦП до select(int timeout), что немедленно возвращает 0, независимо от значения timeout.В моем понимании эта функция заключалась в том, что она будет блокироваться до тех пор, пока не появится выбранная операция или не истечет время ожидания (как сказано в Javadoc).

Однако, если обнаружится этот другой пост StackOverflow , которыйвозникла та же проблема: OP_CONNECT операция должна быть отменена после подтверждения соединения.

Большое спасибо @Alexander и @EJP за разъяснения по поводу OP_WRITE / OP_CONNECTсходство.

...