Слишком много lsof не могут идентифицировать протокол

#java #linux #file #lsof

#java #linux #файл #lsof

Вопрос:

У меня есть Java-процесс / приложение. Когда я запускаю /usr/sbin/lsof -p в этом java-процессе, я вижу много «не удается идентифицировать протокол». Также, что интересно, файловые дескрипторы (FD) увеличиваются с очень постоянной скоростью. И те FD, которые создаются, имеют описание как «не удается идентифицировать протокол».

Итак, есть ли какой-либо способ инструментально / профилировать процесс Java, чтобы определить, кто создает так много FD. Любое подробное объяснение любого инструмента было бы действительно полезно.

Быстрый поиск в Google подсказывает мне, что strace — это один из способов, кроме IIUC, который покажет системные вызовы Linux, исходящие из процесса Java. Меня больше интересует, какая часть моего java-кода ведет себя плохо, чем какие системные вызовы генерируются.

Опять же, любые идеи / предложения были бы просто великолепны!

Ответ №1:

Lsof печатает can't identify protocol для полуоткрытых соединений TCP / IP: https://idea.popcount.org/2012-12-09-lsof-cant-identify-protocol /

Ответ №2:

Когда lsof печатает «Не удается идентифицировать протокол», это обычно относится к сокетам (в соответствующих выходных строках также должно быть указано «sock»).

Итак, где-то в вашем коде вы, вероятно, подключаете сокеты и не закрываете их должным образом (возможно, вам нужен блок finally).

Я предлагаю вам пошагово выполнить свой код с помощью отладчика (проще всего использовать вашу IDE, возможно, с удаленным отладчиком, если это необходимо), параллельно выполняя lsof. В конечном итоге вы сможете увидеть, какой поток / строка кода создает эти файловые дескрипторы.

См. Пункт 10.2.2 этого FAQ для получения более подробной информации о выводе Lsof.

Ответ №3:

Возможно, вы наблюдаете ошибку в JVM 1.6 с утечкой соединений при использовании SSL и имени хоста: http://bugs.sun.com/view_bug.do?bug_id=6745052