一、現象:
壓測過程中,發現應用服務器的CPU使用率比較高(>80%或者>90%)
一般分為兩種情況:
1、接口的性能非常好,比如響應時間<10ms,tps很高,此事CPU使用率高是正常的,不需要優化
2、接口性能不好,比如響應時間>200ms,tps很低,此時考慮優化
二、找到占用CPU比較高的線程
方法一:
1、輸入top命令,找到占用CPU最高的進程號

2、輸入命令:top -p pid

3、按H,出現進程的線程,默認按照CPU從高到低排序

4、把線程pid轉換成十六進制,根據轉換的十六進制去dump文件中找到對應nid的線程號,對代碼進行分析
printf "%x\n" 1512:把十進制的1512轉換成十六進制

總結:該方法適用於有固定的一個或幾個線程占用CPU比較高
二、jprofiler分析:
1、在windows(本機)上安裝jprofiler客戶端

windows安裝步驟:雙擊-下一步(略)
2、生成客戶端秘鑰:雙擊KeyGen.exe-->點擊Generate


3、Linux應用服務器上安裝jprofiler服務端
3.1 將jprofiler_linux_11_0.rpm上傳至linux服務器上,並添加可執行權限

3.2 執行命令rpm -ivh jprofiler_linux_11_0.rpm安裝jprofiler,默認安裝在/opt/jprofiler11目錄下

3.3 在tomcat/bin/catalina.sh文件配置jvm參數的地方添加
-agentpath:/opt/jprofiler11/bin/linux-x64/libjprofilerti.so=port=8849,nowait

4、jprofiler使用步驟
4.1 雙擊JProfiler客戶端-->StartCenter-->NewSession-->New Remote Integration

4.2 選擇監控的系統,點擊Next

4.3 選擇JVM版本信息:

4.4 選擇是否等待jprofiler界面

4.5 配置監控系統的ip

4.6 配置jprofiler的目錄

4.7 配置jprofiler的端口號

4.8 Next-->Finish


4.9 選擇模式


5、點擊Detach,斷開連接

6、點擊StartCenter,選擇之前建立的連接,再次監控

7、點擊CPU views-->點擊Hot Spots-->點擊record CPU,即可查看哪個類下的哪個函數占用CPU時間較長


三、CPU消耗過高可能的原因:
1、使用了復雜的算法,比如加密、解密
2、壓縮、解壓、序列化等操作
3、代碼中有Bug,比如死循環
