2021-05-12 14:32:11
Linux下CPU使用率過高的排查方法
檢視CPU使用
在 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 "%xn" 執行緒號命令輸出該執行緒號對應的 16 進位制數位;
4)、PID進程在核心呼叫情況。如果是Java應用可通過 jstack 進程號 | grep 16進位制執行緒號 -A 10 命令找到 CPU 消耗最多的執行緒方法堆疊。
是非 Java 應用可使用 perf
perf top -p 7574
如果提示perf: command not found,使用yum install perf安裝。
perf是Linux 2.6+核心中的一個工具,在核心原始碼包中的位置 tools/perf。
perf利用Linux的trace特性,可以用於實時跟蹤,統計event計數(perf stat);或者使用取樣(perf record),報告(perf report|script|annotate)的使用方式進行診斷。
相關文章