Java項目排查cpu負載高

背景

  我負責的其中一個項目在空負載的狀況下,CPU佔用率依然保持着100%左右,線上、測試、開發的服務都同樣;是什麼致使的呢?在開發環境我查看了請求流量,這個流量能夠忽略但CPU佔用率一直在60%-100%之間浮動。java

分析問題

  流量能夠忽略,但CPU佔用依然極其高說明不是請求多致使的資源佔用,緣由應該是項目自己自發致使的;自發包括定時任務與死循環,而具體哪一段代碼如今也肯定不了。如今咱們就能夠藉助原生的jdk分析工具來定位是項目哪塊出現了問題(你能夠用更高級的jprofilter等,一鏈接,問題一目瞭然),如下我就採用jdk自帶工具jstack、jstat 、jmap等來逐步定位。服務器

定位問題

  • 在Linux環境下用top查看cpu、內存等資源佔用狀況(可採用: top -p pid 具體查看某個應用)。發現pid=4179的java應用佔用cpu很高  

     

  •  查看pid=4179的應用各個線程佔用cpu的時間片狀況:ps -mp 4179 -o THREAD,tid,time (ps -mp pid -o THREAD,tid,time)。發現tid =4528的線程一直長時間佔有着cpu而且佔用率達100%

         

  • 將 4528轉爲16進制,便於在堆棧信息中查詢定位代碼塊:printf "%x\n" 4528,轉成16進製爲 11b0
  • 在堆棧信息中定位報錯代碼塊:jstack 4179|grep 11b0 -A 30 ( jstack pid|grep TID(16進制) -A 30 )

     

總結

  從堆棧信息中咱們能夠看到是 WAITING致使,這個說明有一個線程長時間佔用資源,而其餘線程一直處於等待的狀態。最終定位出是在一個分佈式鎖實現的模塊中有一個保持鎖的代碼塊有問題。而後經過優化這個分佈式鎖最終解決了這個問題。經過這次優化,大大節省出了服務器資源(目前這個系統在線上是4臺集羣,至關於節省了1*4 個cpu,若是是一個上百甚至上千的集羣,那麼這個資源佔用是沒法想象的),最主要的是避免了這種狀況對系統自己的影響,避免了對正常請求的阻塞。分佈式

相關文章
相關標籤/搜索