java应用cpu使用率过高问题排查
?
---------------------------------------linux下如何定位代碼問題-------------------------------
1、先通過top命令找到消耗cpu很高的進程id假設是123
2、執行top -p 123單獨監控該進程
3、在第2步的監控界面輸入H,獲取當前進程下的所有線程信息
4、找到消耗cpu特別高的線程編號,假設是123
5、執行jstack 123456對當前的進程做dump,輸出所有的線程信息
6?將第4步得到的線程編號11354轉成16進制是0x7b
7?根據第6步得到的0x7b在第5步的線程信息里面去找對應線程內容
8?解讀線程信息,定位具體代碼位置
-----------------------------分割線----------------------------------------------
?
最近在壓力測試工作中碰到java應用某臺機器cpu比較高的情況,特地下筆記以后總結:
一個簡單的淘寶認證接口 需要插入讀寫數據庫2次。每次爬取數據,入庫。完成。
正常情況下:
應用使用cpu在 :50%--80%
壓力高--異常情況下:
cpu利用率在:90%---90%
在網上查了下,一般java應用cpu過高基本上是因為
1.程序計算比較密集
2.程序死循環
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?轉換為16進制,便于在jvm堆棧中查找。
printf "%x\n" 1896 ? ----768
通過jstack命令來查看下當前內存狀態:
?
?定位到cpu過高是IO讀寫太高 ,接下來就是找開發人員確認這段代碼是否可以優化。
?
方法二:
在做壓測的時候,開發給了一個工具 ?show-busy-java-threads.sh
在排查Java的CPU性能問題時,找出Java進程中消耗cpu多(top us值過高)的線程,查看它的線程棧,從而找出有性能問題的方法調用。
####截取一段
#!/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...................后面略其實就是個shell文件,把這個文件上傳到目標服務器(linux),記得更改文件的讀寫權限:?chmod -R 777 ?show-busy-java-threads.sh
接方法一 ?top之后,只需要下命令 :./show-busy-java-threads.sh -p pid ?后面CPU占用高的定位就分析出來了,具體如圖?
?
轉載于:https://www.cnblogs.com/Alexr/p/9361491.html
總結
以上是生活随笔為你收集整理的java应用cpu使用率过高问题排查的全部內容,希望文章能夠幫你解決所遇到的問題。