Видя, что слишком много lsof не может определить протокол - PullRequest
22 голосов
/ 27 октября 2011


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

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

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

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

Ответы [ 3 ]

14 голосов
/ 09 декабря 2012

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

8 голосов
/ 27 октября 2011

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

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

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

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

1 голос
/ 04 апреля 2012

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

...