周一的清晨,当我寻着熟悉的节奏坐在工位前,打开一堆工具,准备开始敲我无谓的代码的时候,发现右边黄色的报警闪个不停,点开,又是机器load高的报警消息。
刚巧,记起几天前看到的一篇文章里面有个工具,可以更方便的定位load高的线程。
抓耳挠腮,翻找半天,诶,找到了:show-busy-java-threads。
把文件传到机器上面,然后看半天说明,有了以下的命令:
sudo ./show-busy-java-threads.sh -s /home/q/java/default/bin/jstack -p 25158 -c 5
然后,确实很好用,输出了几个占用CPU比较高的线程栈信息。比如:
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at java.net.SocketInputStream.read(SocketInputStream.java:127)
at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:196)
at redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:40)
at redis.clients.jedis.Protocol.process(Protocol.java:151)
at redis.clients.jedis.Protocol.read(Protocol.java:215)
at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340)
at redis.clients.jedis.Connection.getIntegerReply(Connection.java:265)
at redis.clients.jedis.Jedis.exists(Jedis.java:179)
发现每个线程都阻塞在了 java.net.SocketInputStream.socketRead0 这个方法上面。
有篇文章比较好:http://javaeesupportpatterns.blogspot.com/2011/04/javanetsocketinputstreamsocketread0.html