我遇到了一個問題,我只能猜測哪個進程正在消耗CPU。
我的 psensor 所有核心的 CPU 使用率約為 80%。
我嘗試過htop
,top
並且ps -A -o pcpu,pid,cmd --sort +pcpu
(最後一個我什至嘗試使用 sudo 無濟於事)。
所有這些都表明罪魁禍首 pid(據我所知)僅使用了大約 7%...
當我對該 pid 發出 SIGKILL 訊號時,一切都會恢復正常。
為了測試,我在終端機上做了一個無限循環while true;do echo -n;done
,但我可以在 htop 清楚地看到;所以我猜造成麻煩的原因與此不相似...
所以我想知道是否有其他方法可以找到罪魁禍首而無需猜測?
再想一想,我想我想知道什麼計算psensor
和“系統負載指示器小程式”使用了能夠顯示該值但其他人無法顯示的值?
答案1
我對細節不夠熟悉,無法給出準確的提示,但我猜想實際引起的負載和顯示的 CPU 使用率之間有兩個差異來源:
該進程可能由多個執行緒組成,並且
top
可能無法將它們總結起來。您可以透過以下方式查看線程數:ps -eo pid,nlwp,%cpu,user,args
您
top
可以使用 切換線程處理H
。每個執行緒的CPU使用率通常相當低。該進程可能會導致大量 I/O。 I/O 等待時間是總體 CPU 負載的一部分,但可能不是進程 CPU 使用值的一部分。因此檢查
wait
中的值top
。它不會告訴您哪些過程會導致其達到何種程度,但如果該值較低,則它無法解釋其影響。
答案2
在 UNIX 系統上執行的程式碼分為核心程式碼或使用者態代碼。使用者態代碼總是附加到進程,因此如果 CPU 正忙於執行用戶態代碼,它會顯示在top
.內核程式碼通常附加到進程:如果核心正在執行系統調用,則內核內處理被視為屬於該進程。核心時間是實用程式報告的“系統時間” time
。
核心所做的一些事情不能直接針對一個行程進行計算。特別是,硬體中斷本質上並不屬於特定進程。例如,假設中斷是由網卡觸發的。核心執行程式碼讀取並解析網路資料包;到目前為止,還沒有涉及任何流程。該封包可能會透過防火牆規則被拒絕,在這種情況下,沒有進程可以要求該處理時間。如果某個進程最終接收到該資料包,則部分接收時間將顯示在該進程的標籤上,但不會顯示早期階段。
所以有可能擁有不屬於任何進程的CPU時間。但有時 CPU 時間是由某些進程間接造成的。例如,如果有一個進程將資料包發送到另一台機器並導致另一台機器進行回复,但防火牆阻止了回复資料包,那麼解析和丟棄回复資料包所花費的時間將不會追溯到該發送進程;但如果發送過程停止,導致遠端電腦停止回复,那麼核心將不再花時間拒絕資料包。當然,網路只是一個例子,核心還有很多其他方式可以做一些無法直接追蹤到某個進程的事情。
您沒有提供足夠的資訊來確定這就是正在發生的事情(如果沒有內核偵錯器,可能很難弄清楚),但這是一個合理的解釋。
答案3
如果不想使用 htop、ps、top,您可以使用 systemtap,獲取更多底層詳細信息