在前一段的工作中遇到了JVM STW的问题,当时使用strace命令来查看JVM系统调用,本文将之前的操作步骤记录下来。
确定Java进程ID
ps -aux | grep "java"
结果如下,黄框内的就是进程的PID
image
确定JVM线程ID
JVM中有很多线程,我们这里主要找控制safepoint的线程,也就是VM Thread。这里我们使用Jstack命令将JVM所有的进程都打出来,然后寻找其中的VM Thread。这里的nid就是线程ID(16进制表示),如图:
image
strace attch线程
182970是16进制线程ID转换过来的10进制格式,然后使用strace命令attach到该线程,就可以看到该线程的系统调用,加上-T参数后,每行会打印出来每条系统调用的耗时,单位是微秒。
image
总结
strace是一个运维经常用到的命令,常被用到来检测进程问题,往往一些比较诡异的问题可以通过strace找到有问题的系统调用,进而找到问题原因。
网友评论