---------------------------------------linux下如何定位代碼問題-------------------------------
1借嗽、先通過top命令找到消耗cpu很高的進程id假設是123
2浆竭、執(zhí)行top -p 123單獨監(jiān)控該進程
3兆蕉、在第2步的監(jiān)控界面輸入H虎韵,獲取當前進程下的所有線程信息
4包蓝、找到消耗cpu特別高的線程編號测萎,假設是123
5硅瞧、執(zhí)行jstack 123456對當前的進程做dump腕唧,輸出所有的線程信息
6 將第4步得到的線程編號11354轉(zhuǎn)成16進制是0x7b
7 根據(jù)第6步得到的0x7b在第5步的線程信息里面去找對應線程內(nèi)容
8 解讀線程信息颂暇,定位具體代碼位置
-----------------------------分割線----------------------------------------------
最近在壓力測試工作中碰到java應用某臺機器cpu比較高的情況,特地下筆記以后總結(jié):
一個簡單的淘寶認證接口 需要插入讀寫數(shù)據(jù)庫2次。每次爬取數(shù)據(jù)县爬,入庫捌省。完成。
正常情況下:
應用使用cpu在 :50%--80%
壓力高--異常情況下:
cpu利用率在:90%---90%
在網(wǎng)上查了下祝高,一般java應用cpu過高基本上是因為
1.程序計算比較密集
2.程序死循環(huán)
3.程序邏請求堵塞
4.IO讀寫太高
方法一:
分析步驟:
1.登陸應用機器,top -d 1命令查看 當前占用cpu資源最多的陆蟆,一般排名第一位肯定是java進程
一般也可能存在多個java進程
觀察 top 消耗第一的資源是PID=1679的線程
2.查看進程的哪個線程占用cpu比較高,取線上另外一臺正常情況下利用cpu比較高的應用:通過
ps -mp pid -o THREAD,tid,time命令查看該進程的線程情況
通過以上線程CPU切片 耗時在pid=1679 Tid =1896 耗時 1分59秒,4%CPU占用最大像棘。時間最長。
TID為1679的線程利用cpu資源比較多烟零,怎么能看到這個線程在干什么呢?
需要將1896 轉(zhuǎn)換為16進制,便于在jvm堆棧中查找毫胜。
printf "%x\n" 1896 ----768
通過jstack命令來查看下當前內(nèi)存狀態(tài):
定位到cpu過高是IO讀寫太高 ,接下來就是找開發(fā)人員確認這段代碼是否可以優(yōu)化。
方法二:
在做壓測的時候,開發(fā)給了一個工具 show-busy-java-threads.sh
在排查Java的CPU性能問題時缺脉,找出Java進程中消耗cpu多(top us值過高)的線程,查看它的線程棧,從而找出有性能問題的方法調(diào)用瞬沦。
截取一段
...................后面略
其實就是個shell文件,把這個文件上傳到目標服務器(linux),記得更改文件的讀寫權(quán)限: chmod -R 777 show-busy-java-threads.sh
附:腳本鏈接https://download.csdn.net/download/qq_34944965/13780146
接方法一 top之后叠赐,只需要下命令 :./show-busy-java-threads.sh -p pid 后面CPU占用高的定位就分析出來了赛不,具體如圖
————————————————
版權(quán)聲明:本文為CSDN博主「小轱轆.」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議殿较,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_34944965/article/details/81107419