【笨問題】Linux 查程序 CPU 使用率 - ps 與 top 的差異
| | | 0 | |
分享處理智慧插座程式庫吃 CPU 問題學到的知識。
定期強迫重啟的計劃並沒有完全成功,原因是有時重啟後沒多久 CPU 就衝高,CPU 會一路飆高直到下回重啟。我決定換個戰術,使用 ps 指令定期查詢 CPU 使用狀況,發現 CPU 衝上來再觸發重啟動作。
今天巡田水時,發現 Docker 從昨天早上開始衝破 100%,但偵測及應變機制沒被觸發:

在 Host 用 top 查詢,確認該 Docker CPU% 高達 180% 以上:

用 docker exec -it <docker-name> /bin/bash 登入執行 ps 卻發現,PID 1 dotnet 的 %CPU 只有 49.6%!!

查了資料,這才發現我一直搞錯 ps 的 %CPU 定義! 它是 CPU 時間除以程序總執行時間(the CPU time used divided by the time the process has been running (cputime/realtime ratio), expressed as a percentage. 參考),並不是即時的 CPU 使用率!
在 Docker 中改用 top 指令,查到的 %CPU 就接近從 Host 觀察到的容器 CPU 使用率。

搞清楚這點,要抓即時 CPU 使用率就得換個方法。top -b -n 1 -p 1 可以以批次模式執行一次,並只查詢 PID 1 程序;tail -1 取顯示的最後一列,即 PID 1 的數值資料;awk '$1 == "1" { pring $9 }' 則是比對第一欄 PID == 1 時抓取第 9 欄 (%CPU) 數字。三者串在一起,即能抓到目前 Docker 核心程序的 CPU 使用率。

糾正了搞錯好久的觀念,學會 Linux 抓即時 CPU% 的技巧。
Comments
Be the first to post a comment