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