java应用cpu使用率过高问题排查
?
---------------------------------------linux下如何定位代碼問題-------------------------------
1、先通過top命令找到消耗cpu很高的進(jìn)程id假設(shè)是123
2、執(zhí)行top -p 123單獨(dú)監(jiān)控該進(jìn)程
3、在第2步的監(jiān)控界面輸入H,獲取當(dāng)前進(jìn)程下的所有線程信息
4、找到消耗cpu特別高的線程編號,假設(shè)是123
5、執(zhí)行jstack 123456對當(dāng)前的進(jìn)程做dump,輸出所有的線程信息
6?將第4步得到的線程編號11354轉(zhuǎn)成16進(jìn)制是0x7b
7?根據(jù)第6步得到的0x7b在第5步的線程信息里面去找對應(yīng)線程內(nèi)容
8?解讀線程信息,定位具體代碼位置
-----------------------------分割線----------------------------------------------
?
最近在壓力測試工作中碰到j(luò)ava應(yīng)用某臺機(jī)器cpu比較高的情況,特地下筆記以后總結(jié):
一個(gè)簡單的淘寶認(rèn)證接口 需要插入讀寫數(shù)據(jù)庫2次。每次爬取數(shù)據(jù),入庫。完成。
正常情況下:
應(yīng)用使用cpu在 :50%--80%
壓力高--異常情況下:
cpu利用率在:90%---90%
在網(wǎng)上查了下,一般java應(yīng)用cpu過高基本上是因?yàn)?/p>
1.程序計(jì)算比較密集
2.程序死循環(huán)
3.程序邏請求堵塞
4.IO讀寫太高?
方法一:
分析步驟:
1.登陸應(yīng)用機(jī)器,top -d 1命令查看 當(dāng)前占用cpu資源最多的,一般排名第一位肯定是java進(jìn)程
一般也可能存在多個(gè)java進(jìn)程?
?
觀察 top 消耗第一的資源是PID=1679的線程
2.查看進(jìn)程的哪個(gè)線程占用cpu比較高,取線上另外一臺正常情況下利用cpu比較高的應(yīng)用:通過
ps -mp pid -o THREAD,tid,time命令查看該進(jìn)程的線程情況
通過以上線程CPU切片 耗時(shí)在pid=1679 Tid =1896 耗時(shí) 1分59秒,4%CPU占用最大。時(shí)間最長。
TID為1679的線程利用cpu資源比較多,怎么能看到這個(gè)線程在干什么呢?
需要將1896?轉(zhuǎn)換為16進(jìn)制,便于在jvm堆棧中查找。
printf "%x\n" 1896 ? ----768
通過jstack命令來查看下當(dāng)前內(nèi)存狀態(tài):
?
?定位到cpu過高是IO讀寫太高 ,接下來就是找開發(fā)人員確認(rèn)這段代碼是否可以優(yōu)化。
?
方法二:
在做壓測的時(shí)候,開發(fā)給了一個(gè)工具 ?show-busy-java-threads.sh
在排查Java的CPU性能問題時(shí),找出Java進(jìn)程中消耗cpu多(top us值過高)的線程,查看它的線程棧,從而找出有性能問題的方法調(diào)用。
####截取一段
#!/bin/bash # @Function # Find out the highest cpu consumed threads of java, and print the stack of these threads. # # @Usage # $ ./show-busy-java-threads.sh # # @author Jerry Leereadonly PROG=`basename $0` readonly -a COMMAND_LINE=("$0" "$@")usage() {cat <<EOF Usage: ${PROG} [OPTION]... Find out the highest cpu consumed threads of java, and print the stack of these threads. Example: ${PROG} -c 10...................后面略其實(shí)就是個(gè)shell文件,把這個(gè)文件上傳到目標(biāo)服務(wù)器(linux),記得更改文件的讀寫權(quán)限:?chmod -R 777 ?show-busy-java-threads.sh
接方法一 ?top之后,只需要下命令 :./show-busy-java-threads.sh -p pid ?后面CPU占用高的定位就分析出來了,具體如圖?
?
轉(zhuǎn)載于:https://www.cnblogs.com/Alexr/p/9361491.html
總結(jié)
以上是生活随笔為你收集整理的java应用cpu使用率过高问题排查的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。