CPU佔用太高問題排查

前幾天發現測試環境的CPU一直很高,因而就去排查了一下緣由,以前在程序管理裏面介紹過,能夠經過top命令查看linux系統進程的資源佔用。因而運行top命令以下:java

圖片描述

從上圖中能夠看到其中有一個線程的CPU很是高,PID是31461.雖然咱們知道了是一個java進程,也知道了PID號碼,可是咱們並不知道究竟是那部分代碼佔用的CPU較高,這個時候咱們就可使用 top -Hp Pid的命令,來查看具體佔用CPU資源的進程:linux

圖片描述

而後從線程的列表中找到CPU佔用最高的線程ID。好比說4244. 咱們知道佔用CPU高的進程是JAVA進程,那麼咱們就可使用jstack命令來查看java進程的棧信息,可是有個問題是jstack打出來的內容太多了,我怎麼肯定具體是哪一個棧的佔用CPU高呢? 這時就須要用到前面咱們找到的線程ID了。因爲jstack中使用的16進制,所以咱們須要把線程ID:4244 轉爲16進製爲1094.而後咱們可使用下面的命令查看這個線程對應棧信息:
jstack PID | grep -A 10 16進制線程ID:jstack 31461 | grep -A 10 1094:測試

[root@iZ23ozpjtzfZ ~]# jstack 31461 | grep -A 10 1094
"cat-TcpSocketSender" #243 daemon prio=5 os_prio=0 tid=0x00007f779c3be000 nid=0x1094 runnable [0x00007f7767a31000]
  java.lang.Thread.State: TIMED_WAITING (parking)
   at sun.misc.Unsafe.park(Native Method)
   - parking to wait for  <0x00000000f8b7f928> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
   at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
   at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
   at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)
   at com.dianping.cat.message.io.DefaultMessageQueue.poll(DefaultMessageQueue.java:49)
   at com.dianping.cat.message.io.TcpSocketSender.run(TcpSocketSender.java:176)
   at java.lang.Thread.run(Thread.java:748)
   at org.unidal.helper.Threads$RunnableThread.run(Threads.java:294

這樣就定位了問題所在,以後就能夠查看具體是什麼緣由致使這段代碼佔用CPU太高。spa

相關文章
相關標籤/搜索