Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Java线程转储中的套接字信息_Java_Linux_Sockets_Thread Dump - Fatal编程技术网

Linux Java线程转储中的套接字信息

Linux Java线程转储中的套接字信息,java,linux,sockets,thread-dump,Java,Linux,Sockets,Thread Dump,在分析性能问题时,我每隔5秒进行一次连续的线程转储,并使用samurai线程转储分析器进行分析。注意,许多线程都处于可运行状态,在所有事件中都会持续进行堆栈下转储。但我找不到他们正在与哪个主机通信。我尝试使用命令ss-t-a,watch ss-tp和netstat-a inet-p,但无法将它们的结果与线程关联。有什么想法吗?提前谢谢 Thread dump 2/5 "TP-Processor125" prio=5 tid=0x25756 nid=0x649c RUNNABLE (JNI N

在分析性能问题时,我每隔5秒进行一次连续的线程转储,并使用samurai线程转储分析器进行分析。注意,许多线程都处于可运行状态,在所有事件中都会持续进行堆栈下转储。但我找不到他们正在与哪个主机通信。我尝试使用命令
ss-t-a
watch ss-tp
netstat-a inet-p
,但无法将它们的结果与线程关联。有什么想法吗?提前谢谢

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

nid实际上是底层操作系统的进程/线程ID(至少对于Linux是这样),尽管是十六进制的。转换为十进制pid并使用

lsof -p pid |grep -Ei 'tcp|socket'
要了解有关所用套接字连接的更多信息。但结果可能是,所有套接字都是由主线程打开的,在这种情况下,子线程只继承几个(多个),因此可能很难看到它连接到哪个线程


如果
lsof
没有显示主进程的线程(似乎确实没有),您可能必须解决查看
/proc//fd
tid是Java级别的线程id,nid是本机线程id。nid在不同操作系统上实际指的是。我建议使用VisualVM之类的工具连接到应用程序,并记下应用程序的PID。获得PID后,请尝试以下命令:

sudo netstat -nlpt
这将为您提供如下信息(带有远程/本地地址、PID和程序名):


这应该告诉您哪些连接是从Java程序打开的。

这是针对服务器还是客户机的?例如服务器套接字或客户端套接字?抱歉,我没有这些信息。我所拥有的只是从服务器获取的线程转储。它与许多接口交互,包括数据库、Web服务器。。。等等,上面写着“SocketInputStream.read”。可能是服务器套接字吗?转储有多大?您可以上传到Github或其他共享吗?我提供的只是线程转储。它只是转储时线程正在执行的堆栈跟踪。执行了此操作,但没有得到结果。不确定lsof只接受进程id而不是线程id。另外,当我将十六进制转换为十进制,并发出“ps-eLf | grep 25781”以获取线程详细信息时,不会得到任何结果。这里25781是十六进制nid(0x64b5)的十进制值。谢谢Majojo。但这种方法再次在pid级别上起作用。我想知道的是线程级别。Pid有许多线程,线程转储显示每个线程正在做什么。在unix中,ps-eLf命令列出线程和进程。如果我们知道进程id,我们可以运行“ps-eLf | grep 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