java cpu过高排查_涨薪秘籍:JAVA项目排查cpu负载过高
背景
我負責的其中一個項目在空負載的情況下,CPU占用率依然保持著100%左右,線上、測試、開發(fā)的服務都一樣;是什么導致的呢?在開發(fā)環(huán)境我查看了請求流量,這個流量可以忽略但CPU占用率一直在60%-100%之間浮動。
分析問題
流量可以忽略,但CPU占用依然極其高說明不是請求多導致的資源占用,原因應該是項目本身自發(fā)導致的;自發(fā)包括定時任務與死循環(huán),而具體哪一段代碼現(xiàn)在也確定不了。現(xiàn)在我們就可以借助原生的jdk分析工具來定位是項目哪塊出現(xiàn)了問題(你可以用更高級的jprofilter等,一連接,問題一目了然),以下我就采用jdk自帶工具jstack、jstat 、jmap等來逐步定位。
定位問題
- 在Linux環(huán)境下用top查看cpu、內(nèi)存等資源占用情況(可采用: top -p pid 具體查看某個應用)。發(fā)現(xiàn)pid=4179的java應用占用cpu很高
- 查看pid=4179的應用各個線程占用cpu的時間片情況:ps -mp 4179 -o THREAD,tid,time (ps -mp pid -o THREAD,tid,time)。發(fā)現(xiàn)tid =4528的線程一直長時間占有著cpu并且占用率達100%
- 將 4528轉為16進制,便于在堆棧信息中查詢定位代碼塊:printf "%x" 4528,轉成16進制為 11b0
- 在堆棧信息中定位報錯代碼塊:jstack 4179|grep 11b0 -A 30 ( jstack pid|grep TID(16進制) -A 30 )
總結
從堆棧信息中我們可以看到是 WAITING導致,這個說明有一個線程長時間占用資源,而其他線程一直處于等待的狀態(tài)。最終定位出是在一個分布式鎖實現(xiàn)的模塊中有一個保持鎖的代碼塊有問題。然后通過優(yōu)化這個分布式鎖最終解決了這個問題。通過此次優(yōu)化,大大節(jié)省出了服務器資源(目前這個系統(tǒng)在線上是4臺集群,相當于節(jié)省了1*4 個cpu,如果是一個上百甚至上千的集群,那么這個資源占用是無法想象的),最主要的是避免了這種情況對系統(tǒng)本身的影響,避免了對正常請求的阻塞。
最后送給大家一個美女啦程序員很辛苦的偶爾需要犒勞一下自己
總結
以上是生活随笔為你收集整理的java cpu过高排查_涨薪秘籍:JAVA项目排查cpu负载过高的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python做自动化控制postman_
- 下一篇: java 十六进制转十进制_JAVA知识