Linux系統下CPU性能問題分析案例(上)
作者:技術守護者
Iowait升高,第一反應會想到查看系統的 I/O情況,I/O又分為磁盤I/O和網絡I/O,這里先分析磁盤I/O。

關于CPU使用率相關重要指標,我們經常在使用top、dstat、vmstat等工具看到,這里解讀一下:
- user(通常縮寫為us),代表用戶態CPU時間。
- nice(通常縮寫為ni),代表低優先級用戶態CPU時間,nice可取值范圍是-20到19,數值越大,優先級反而越低,默認值是0。
- system(通常縮寫為sys),代表內核態CPU時間。
- idle(通常縮寫為id),代表空閑時間。注意,它不包括等待I/O的時間(iowait)。
- iowait(通常縮寫為wa),代表等待 I/O的CPU時間。
- irq(通常縮寫為hi),代表處理硬中斷的CPU時間。
- softirq(通常縮寫為si),代表處理軟中斷的CPU時間。
- steal(通常縮寫為st),代表當系統運行在虛擬機中的時候,虛擬機占用的CPU時間。
- guest(通常縮寫為guest),代表通過虛擬化運行其他操作系統的時間,也就是運行虛擬機的CPU時間。
- guest_nice(通常縮寫為gnice),代表以低優先級運行虛擬機的時間。
CPU的iowait突然升高,我該怎么處理?
分析過程
從上面的介紹可以看出,iowait升高,第一反應會想到查看系統的 I/O情況,I/O又分為磁盤I/O和網絡I/O,這里先分析磁盤I/O。
1、運行 dstat 命令,觀察 CPU 和 I/O 的使用情況

- 結果分析。
- 在iowait升高(wai)時,磁盤的讀請求(read)都很高,最高時1271M。
- 充分說明iowait的升高是磁盤I/O導致的,確切的說,是大量讀磁盤導致的。
2、通過pidstat查詢進程的I/O情況
# -d:統計進程的磁盤使用情況 1: 采集周期1s 10: 采集10次
pidstat -d 1 10
- 結果分析。
- 大量讀磁盤的進程名稱是app,而且app進程的pid在不停變化(短時進程?)
3、使用ps命令查看下app進程

- 結果分析。
- 進程的狀態是Z+,命令行參數<defunct>,進程變成僵尸進程了。
- 僵尸進程的產生和處理方法,這里暫不展開,有想了解的可以評論留言或者自行學習。
- app的是誰創建的,是下一步分析的重點。
4、查詢app進程的父進程

- 結果分析。
- pid為51780的父進程id是51688,進程名稱也是app。
5、使用perf命令采集性能事件分析app函數調用
# 錄制全局性能事件,如果只想錄制某個進程的,可以使用-p指定
# perf record -ag -p {pid} -- sleep 10 #采集指定pid所有cpu的性能事件,周期是10s
perf record -g
# 分析報告
perf report
- 分析結果。
- app進程正在對磁盤進行直接讀,也就是繞過了系統緩存,每個讀請求都會從磁盤直接讀。
思路總結
- 使用dstat命令查看系統I/O情況(dstat可以同時觀察cpu和磁盤的情況)。
- 使用pidstat命令可以定位到進程維度的磁盤讀寫情況,找出可疑進程。
- 使用ps、top等命令可以觀測到進程的狀態(D、R、S、Z、T等)。
- 使用pstree命令我們找出了app進程的父進程(子進程的pid一直在變)。
- 使用perf命令就可以對進程的函數調用關系分析了。
- 沒啥需要使用的啦。哈哈,點贊+收藏。
知識補充
進程狀態
- R 是Running或Runnable 的縮寫,表示進程在CPU的就緒隊列中,正在運行或者正在等待運行。
- D 是Disk Sleep的縮寫,也就是不可中斷狀態睡眠(Uninterruptible Sleep),一般表示進程正在跟硬件交互,并且交互過程不允許被其他進程或中斷打斷。
- Z 是Zombie的縮寫,進程實際上已經結束了,但是父進程還沒有回收它的資源(比如進程的描述符、PID 等)。
- S 是Interruptible Sleep的縮寫,也就是可中斷狀態睡眠,表示進程因為等待某個事件而被系統掛起。當進程等待的事件發生時,它會被喚醒并進入R狀態。
- I 是Idle的縮寫,也就是空閑狀態,用在不可中斷睡眠的內核線程上。
- T 或者 t,也就是Stopped或Traced的縮寫,表示進程處于暫停或者跟蹤狀態。
僵尸進程
- 一旦父進程沒有處理子進程的終止,還一直保持運行狀態,那么子進程就會一直處于僵尸狀態。
- 大量的僵尸進程會用盡PID進程號,導致新進程不能創建。
- 僵尸進程在父進程回收它的資源后就會消亡,或者在父進程退出后,由init進程回收后也會消亡。
責任編輯:姜華
來源:
今日頭條


























