現象
壓測過程中,發現應用服務器CPU使用率比較高(80%)
這種現象產生的原因,一可能是接口性能非常好,比如響應時間10ms,TPS很高,此時CPU使用率很高是正常的,不需要做代碼層面的優化;還有一種情況就是接口性能不好,可能響應時間>200ms,TPS很低,這種情況下就需要定位問題並做優化了。
CPU消耗高的可能原因:
1、使用了復雜的算法,比如加密解密;
2、壓縮、解壓縮、序列化等操作;
3、代碼bug,比如死循環
案例
某接口測試結果如下:
![]()

從上面的結果來看,平均時間響應時間較長,TPS也不高,這種情況下很可能是存在問題的。
問題分析方法一 用top和jstack
1、通過top命令查看占用CPU高的進程pid,然后執行top -p pid,手動輸入H,可以查看應用程序內部的線程占用資源情況:

注:上圖中的pid對應的應該是堆棧日志中的nid,對應的是系統線程
2、將第1中占用CPU高的線程pid轉成16進制
(1)可以通過linux命令將十進制轉成16進制: printf "%x" 2662
(2)進制在線轉換:https://tool.lu/hexconvert/
3、用jstack獲取堆棧日志
4、用第2步中獲取的16進制去堆棧日志中查找,鏈路比較長且狀態是runnable的進程,並查看日志中是否有業務代碼,這樣應該可以找到CPU占用高的地方

問題分析方法二 Jprofiler
- jprofiler安裝
使用jprofiler之前需要分別在對應的windows機器和服務器安裝相同版本的jprofiler
windos安裝:安裝比較簡單,直接下一步即可
linux安裝:
(1)上傳安裝包,執行命令rpm -ivh jprofiler_linux_9_1_1.rpm
(2)tomcat/bin/catalina.sh文件配置JVM參數的地方添加:-agentpath:/opt/jprofiler11/bin/linux-x64/libjprofilerti.so=port=8849,nowait
- jprofiler配置
2、在彈出的窗口上選擇New Session --> Mew Remote Integration

3、選擇 應用是在本機還是遠程機器上。如下圖:

4、選擇JVM Vendor、版本選1.8,如下圖:

5、開始模式選擇下圖中的第一個

6、上圖中點擊下一步,填寫遠程tomcat安裝地址:

7、下一步后,下圖中填寫服務器中jprofiler安裝目錄

8、下一步配置遠程jprofile端口

9、上述信息都填寫完畢后,彈出窗口核對信息(注意:Please insert內容與我們之前寫到tomcat配置文件里面的內容完全一致)

10、核對完成后點擊下一步如下圖,選擇立即啟動

11、默認選中第二種啟動方式,我們也點擊這個選項

12、下圖中的Performance體現了當前占用的資源情況:

13、點擊ok開始連接,下圖中自動開始繪制圖表,說明已經連上遠程了。

- Jprofile分析使用
1、查看線程監控,可以看到線程有很多阻塞的。

2、查看CPU,使用率為100%。(說明當前阻塞不是主要問題,如果阻塞的話CPU不能100%打滿)

3、接着查看CPU views--Hot Spots (或者用Call Tree來看)

從上圖中我們能找到是某個接口的Gson.toJson序列化操作導致了cpu使用率高。
