Видя, что слишком много lsof не может определить протокол
У меня есть процесс / приложение Java. Когда я запускаю /usr/sbin/lsof -p для этого процесса Java, я вижу много "не могу определить протокол". Также, что интересно, файловые дескрипторы (FD) растут с очень постоянной скоростью. И те FD, которые создаются, имеют описание как "не может идентифицировать протокол".
Итак, есть ли способ инструментально / профилировать процесс Java, чтобы определить, кто создает столько FD. Любое подробное объяснение любого инструмента было бы действительно полезным.
Быстрый поиск в Google говорит мне, что strace - это один из способов, кроме IIUC, который покажет системные вызовы linux, выходящие из процесса java. Меня больше интересует, какая часть моего Java-кода ведет себя плохо, чем генерируются системные вызовы.
Опять же, любые идеи / предложения будут просто великолепны!
3 ответа
Lsof печатает can't identify protocol
для полуоткрытых соединений TCP/IP: https://idea.popcount.org/2012-12-09-lsof-cant-identify-protocol/
Когда lsof печатает "Can't Identify Protocol", это обычно относится к сокетам (в соответствующих выходных строках также должно быть написано "sock").
Итак, где-то в вашем коде вы, вероятно, подключаете сокеты и не закрываете их должным образом (возможно, вам нужен блок finally).
Я предлагаю вам пройтись по коду с помощью отладчика (проще всего использовать IDE, возможно, с удаленным отладчиком, если это необходимо), одновременно запуская lsof бок о бок. В конечном итоге вы сможете увидеть, какой поток / строка кода создает эти файловые дескрипторы.
Смотрите пункт 10.2.2 этого FAQ для более подробной информации о выводе Lsof.
Возможно, вы наблюдаете ошибку в JVM 1.6 с утечкой соединений при использовании SSL и имени хоста: http://bugs.sun.com/view_bug.do?bug_id=6745052