昨天,我们在Debian上运行的tomcat 6服务器出现了一个奇怪的问题:随着时间的推移,第二次长时间冻结/中断的时间增加了。在冻结期,我们所有独立的Web应用程序都没有响应。中断具有很高的规律性,在一个小时的过程中,中断阶段变得比活动阶段更长,直到我们重新启动服务器以解决问题为止。现在,我们想找出它是什么,或者找到一种解决方案来找出它再次发生的情况!
在每个中断阶段,tomcat线程之一会100%使用24个内核中的一个,因此我们假设该线程所做的任何事情都会冻结整个tomcat。可悲的是,我们不知道该线程正在处理什么。
将其放入我们广泛的日志文件条目中并找到JVM线程将很容易,但是如果它是一个不受我们完全控制的线程怎么办?同步TID / Java-Thread- ID快照带来的烦恼又如何呢?这就引出了我的核心问题:
是否有办法从已知的Linux TID获取JVM线程名称/ ID?
我的希望很小,但是也许对JVM有一个跨进程调用,或者还有一个我尚未考虑的想法。
我们已经在该服务器上运行了Yourkit探查器,但是在中断阶段,它无法记录任何内容,因此我们找不到有问题的线程。
采用 jstack <PID>
jstack <PID>
"Thread-0" prio=10 tid=0x00002aaab01c3800 nid=0x246d runnable [0x00000000423c7000] ^ name ^ Java thread id ^ native (OS) thread id