linux進程cpu使用率過高分析與排查


最近在工作中遇到一台生產的服務器CPU使用率過高報警,直線上升,基本上到了100%:

CPU使用率

看到報警后第一想到的就是使用top和ps -aux --sort=-pcpu|head -10 命令查看一下進程和CPU

top命令執行結果

發現最高的就是pid=2375的JAVA進程,需要進一步找到對應的線程(這里啰嗦一句就是:進程好比一個工廠,線程就好比工廠里面的一個工人)top -H p pid可以查看某個進程的線程信息:-H 顯示線程信息,-p指定pid :

發現CPU和內存都偏高的線程id(tid)有2377/2378/2379/2380這四個。使用jstack打印進程信息並導入指定日志文件,最后多執行幾次,可供分析的數據會多一些,如下:

jstack -F 2377 >/root/2377_err_1.log

jstack -F 2378 >/root/2378_err_1.log

jstack -F 2379 >/root/2379_err_1.log

jstack -F 2380 >/root/2380_err_1.log

再將線程十進制的線程id=2377轉換為十六進制,因為在導出的日志文件中他們存在的方式是nid=0x+16進制線程id.

printf "%x\n" 2377 輸出的是:949 對應nid=0x949

printf "%x\n" 2378 輸出的是:94a 對應nid=0x94a

printf "%x\n" 2379 輸出的是:94b 對應nid=0x94b

printf "%x\n" 2380 輸出的是:94c 對應nid=0x94c

這些信息都有了之后再回去分析剛才jstack導出的日志,可以在linux上使用:grep -A 10 nid 日志文件 (eg: grep -A 10 0x949 /root/2377_err_1.log ) 分析,也可以拿到本地分析.

 

再來看一下思路和基礎知識

在 Linux 系統下,使用 top 命令查看 CPU 使用情況。

%Cpu(s): 0.3 us, 0.1 sy, 0.0 ni, 99.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

us(user):表示 CPU 在用戶運行的時間百分比,通常用戶 CPU 高表示有應用程序比較繁忙。典型的用戶程序有:數據庫、Web 服務器等。

sy(sys):表示 CPU 在內核態運行的時間百分比(不包括中斷),通常內核態 CPU 越低越好,否則表示系統存在某些瓶頸。

ni(nice):表示用 nice 修正進程優先級的用戶進程執行的 CPU 時間。nice 是一個進程優先級的修正值,如果進程通過它修改了優先級,則會單獨統計 CPU 開銷。

id(idle):表示 CPU 處於空閑態的時間占比,此時,CPU 會執行一個特定的虛擬進程,名為 System Idle Process。

wa(iowait):表示 CPU 在等待 I/O 操作完成所花費的時間,通常該指標越低越好,否則表示 I/O 存在瓶頸,可以用 iostat 等命令做進一步分析。

hi(hardirq):表示 CPU 處理硬中斷所花費的時間。硬中斷是由外設硬件(如鍵盤控制器、硬件傳感器等)發出的,需要有中斷控制器參與,特點是快速執行。

si(softirq):表示 CPU 處理軟中斷所花費的時間。軟中斷是由軟件程序(如網絡收發、定時調度等)發出的中斷信號,特點是延遲執行。

st(steal):表示 CPU 被其他虛擬機占用的時間,僅出現在多虛擬機場景。如果該指標過高,可以檢查下宿主機或其他虛擬機是否異常。

排查用戶 CPU 使用率高
用戶 CPU 使用率反映了應用程序的繁忙程度

大概步驟如下

1)、通過 top 命令找到 CPU 消耗最多的進程號;
2)、通過 top -Hp 進程號命令找到 CPU 消耗最多的線程號(列名仍然為 PID);
3)、通過printf "%x\n" 線程號命令輸出該線程號對應的 16 進制數字;
4)、PID進程在內核調用情況。如果是Java應用可通過 jstack 進程號 | grep 16進制線程號 -A 10 命令找到 CPU 消耗最多的線程方法堆棧。
非 Java 應用可使用 perf
perf top -p pid_number

perf命令不存在,使用yum install perf安裝。

 


免責聲明!

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



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