java應用cpu使用率太高問題排查

 

---------------------------------------linux下如何定位代碼問題-------------------------------java

一、先經過top命令找到消耗cpu很高的進程id假設是123linux

二、執行top -p 123單獨監控該進程shell

三、在第2步的監控界面輸入H,獲取當前進程下的全部線程信息數據庫

四、找到消耗cpu特別高的線程編號,假設是123bash

五、執行jstack 123456對當前的進程作dump,輸出全部的線程信息服務器

6 將第4步獲得的線程編號11354轉成16進制是0x7bapp

7 根據第6步獲得的0x7b在第5步的線程信息裏面去找對應線程內容jvm

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

在排查JavaCPU性能問題時,找出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 Lee
 
readonly 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佔用高的定位就分析出來了,具體如圖

 

相關文章
相關標籤/搜索