性能分析(1)- Java 進程導致 CPU 使用率升高,問題怎么定位?


性能分析小案例系列,可以通過下面鏈接查看哦

https://www.cnblogs.com/poloyy/category/1814570.html

ps:這些分析小案例不能保證完全准確哦,是博主學習過程中的總結,僅做參考

 

前提

本機有一個很占用 CPU 的項目,放在了 Tomcat 下啟動着

 

如何定位

Jmeter 聚合報告

  • 可以看到平均響應時間不斷的上升,但是吞吐量(TPS)很低
  • 平均響應時間一般超過 1s,就要排除網絡有沒有瓶頸 

 

排查網絡是否有瓶頸

在 cmd ping 自己的服務器 ip 地址,看是否有很大的延時或丟包

可以看到,沒有丟包,而且延時也很低,證明網絡沒有問題

 

在服務器中,通過 top 查看是否有進程的用戶態(us)過高

top

  • 可以看到是 Java 進程導致 CPU 使用率賊高,已經占滿了四個 CPU 
  • 記住該進程 PID

 

通過 ps 命令確認具體是哪個進程

ps -aux | grep 2838

很明顯,就是我們 Java 程序所在的 Tomcat 進程啦

 

通過 top 查看 Java 進程的線程執行情況

2838 是進程 id 哦(pid)

top -Hp 2838

  • 上面的 PID 就是線程的 PID
  • 按照線程的 CPU 使用率從高到低排序

 

將排在前面的線程 PID 轉換成十六進制

printf "%x\n" 4808

 

打印 Java 線程棧的信息

jstack 2838 | grep 12c8 -A30
  • 2838:java 進程
  • 12c8:線程十六進制
  • -A30:打印 30 行

 

  • 包含:包名、類名、代碼行信息,可以快速定位到某行代碼導致該線程 CPU 使用率過高
  • jstack:JDK 自帶命令

 

分析思路過程

  • 使用 Jmeter 進行壓測,通過觀察聚合報告,發現 TPS 很低只有2.幾,但是響應時間很高
  • 響應時間很高首先要排查是否是網路原因,通過 ping 服務器的 IP 發現延時很低,不存在網絡問題
  • 通過 top 查看服務端的系統資源情況,發現用戶態 CPU 使用率比較高,即存在占用 CPU 高的進程,查看進程列表,發現一個 Java 進程的 CPU 占用率特別高
  • 通過 ps 命令確認該進程的詳細信息
  • 通過 top -Hp 查看該進程的所有線程信息
  • 將排在前面的 Java 線程號打印成 16 進制字符串
  • 通過 jstack 打印 Java 線程棧的信息,可以發現是某一行代碼的問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM