2016-01-07 7 views
3

При анализе проблемы с производительностью я занимался непрерывными потоками потоков за каждые 5 секунд и анализировался с помощью анализатора дампов samurai. Отмечено, что многие потоки находятся в состоянии runnable с дампом ниже стека непрерывно во всех случаях. Но я не мог найти, с каким хостом они общаются. Я пробовал использовать команды ss -t -a, watch ss -tp и netstat -A inet -p, но не смог связать их результаты с нитью. Есть идеи? Заранее спасибо.Информация о сокетах из дампа нити Linux-Java

Thread dump 2/5 "TP-Processor125" prio=5 tid=0x25756 nid=0x649c RUNNABLE (JNI Native Code) - stats: cpu=828 blk=-1 wait=-1      java.lang.Thread.State: RUNNABLE      
    at java.net.SocketInputStream.socketRead0(Native Method)      
    at java.net.SocketInputStream.read(SocketInputStream.java:152)      
    at java.net.SocketInputStream.read(SocketInputStream.java:122)      
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)      
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:275)      
    at java.io.BufferedInputStream.read(BufferedInputStream.java:334)      
    at org.apache.jk.common.ChannelSocket.read(ChannelSocket.java:628) 
     at org.apache.jk.common.ChannelSocket.receive(ChannelSocket.java:566) 
     at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:693) 
     at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:898) 
     at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690) 
     at java.lang.Thread.run(Thread.java:745)      Locked synchronizers: count = 0 
+0

Это для сервера или клиента? Например. серверный сокет или клиентский сокет? – MojoJojo

+0

Извините, у меня нет этой информации. Все, что у меня есть, это только дамп потока, взятый с сервера. Он взаимодействует со многими интерфейсами, включая DB, Webserver ... и т. Д. Он говорит «SocketInputStream.read». Может быть, это серверный сокет? –

+0

Насколько велика свалка? Можете ли вы загрузить в Github или какую-то другую часть? – MojoJojo

ответ

2

nid на самом деле процесс/нить идентификатор базовой ОС (по крайней мере для Linux), хотя и в шестнадцатеричном виде. Преобразуйте в десятичный пид и используйте

lsof -p pid |grep -Ei 'tcp|socket' 

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

Если lsof не показывает нить основного процесса (похоже, это действительно не так), вам, возможно, придется решить, глядя в /proc/<pid>/fd.

+0

Сделал это, но не получил результат. Не уверен, что lsof принимает только идентификатор процесса, а не идентификатор потока. Кроме того, когда я конвертирую hex в десятичный код и выдаю 'ps -eLf | grep 25781 ', чтобы получить детальную информацию о потоке, не получив никакого результата. Здесь 25781 - десятичное значение для Hex nid (0x64b5). –

1

tid - это идентификатор потока уровня Java, а nid - собственный идентификатор потока. То, что на самом деле относится к различным ОС, - somewhat confusing. Я бы рекомендовал подключиться к вашему приложению с помощью такого инструмента, как Visual VM, и отметить PID приложения. Если у вас есть PID, попробуйте следующую команду:

sudo netstat -nlpt 

Это должно дать вам кое-что, как показано ниже (с удаленного/локального адреса и PID и имя программы):

Active Internet connections (only servers) 
Proto Recv-Q Send-Q Local Address   Foreign Address   State  PID/Program name 
tcp  0  0 127.0.1.1:53   0.0.0.0:*    LISTEN  1144/dnsmasq  
tcp  0  0 127.0.0.1:631   0.0.0.0:*    LISTEN  661/cupsd  
tcp6  0  0 ::1:631     :::*     LISTEN  661/cupsd 

Это должно сказать вам, какие соединения открыты из вашей Java-программы.

+0

Спасибо Маджо Джоджо. Но этот подход снова говорит на уровне pid. То, что я хочу знать, находится на уровне нитей. Pid имеет много потоков, а дамп потока показывает, что делает каждый поток. В unix команды ps -eLf перечисляют потоки вместе с процессом. Если мы знаем идентификатор процесса, мы можем запустить «ps -eLf | grep pid ', чтобы узнать список тем. В моем дампе потока многие потоки считывают данные из сокета, но я не мог определить, что это за сокет. Надеюсь, я ясно понимаю свой вопрос. –