讀:本文翻譯自 Brendan Gregg 去年的一篇博客文章 “CPU Utilization is Wrong”,從標題就能想到這篇文章將會引起爭議。文章一上來就說,我們“人人皆用、處處使用,每個性能監控工具里都在用”的 top 命令里的 “%CPU” 指標,是不對的,其并非用于衡量 CPU 的繁忙程度的正確指標,作者譴責了一下眾人(或許也包括你我)的這一行為是具有很大的誤導性(deeply misleading)的,而且這種情況還在連年惡化。對于這么大一頂帽子,讓我們暫且按下躁動的心,聽聽作者是怎么深入闡釋他的觀點的。
可能你認為的 90% CPU 利用率意味著這樣的情形:
而實際卻可能是這樣的:
CPU 并非 90% 的時間都在忙著,很大一部分時間在等待,或者說“停頓(Stalled)”了。這種情況表示處理器流水線停頓,一般由資源競爭、數據依賴等原因造成。多數情況下表現為等待訪存操作,其中又以讀操作為主。在停頓周期內,不能執行指令,這意味著你的程序不往前走。
值得注意的是,圖中 “Stalled” 狀態所占的比例是作者依據生產環境中的典型場景計算而來,具有普遍現實意義。因此,大多時候 CPU 處于停頓狀態,而你卻不知道,因為 CPU 利用率這個指標沒有告訴你真相。通過進一步分析 CPU 停頓的原因,可以指導代碼優化,提高執行效率,這是我們深入理解CPU微架構的動力之一。
在 PMC(Performance Monitoring Counters) 的幫助下,我們能看到更多的 CPU 運行狀態信息。下圖中,perf 采集了10秒內全部 CPU 的運行狀態。
這里我們重點關注的核心度量指標是 IPC(instructions per cycle),它表示平均每個 CPU cycle 執行的指令數量,很顯然該數值越大性能越好。上圖中IPC 為 0.78,看起來還不錯,是不是 78% busy 呢?現代處理器一般有多條流水線,運行 perf 的那臺機器,IPC 的理論值可達到 4.0。
如果我們從 IPC的角度來看,這臺機器只運行到其處理器最高速度的 19.5%(0.78 / 4.0)。幸運的是,在處理器內部,有很多 PMU event,可用來幫助我們分析造成 CPU stall 的原因。用好 PMU 需要我們熟悉處理器微架構,可以參考 Intel SDM。
作者認為,性能工具中使用 %CPU 時都應該附帶上 IPC,或者將 %CPU 拆分為指令執行消耗 cycle(%INS) 和 stalled 的 cycle(%STL)。對應到 top,在 Linux 系統有一個能夠顯示每個處理器 IPC 的工具 tiptop:
這篇文章引起了大量留言:
http://www.brendangregg.com/blog/2017-05-09/cpu-utilization-is-wrong.html 的留言欄;
https://news.ycombinator.com/item?id=14301739
https://www.reddit.com/r/programming/comments/6a6v8g/cpu_utilization_is_wrong/
總結下作者的回答是:這里討論的并不是 iowait (那是磁盤IO),而且如果你已經確認是訪存密集型,是有些處理辦法(參考上面)。
那么 CPU 利用率指標是確確實實錯誤的,還是只是容易誤導?如作者前面所說,他認為許多人把高 CPU 利用率理解為瓶頸在 CPU 上,這一行為才是錯誤的;
其實單看 CPU 利用率并不清楚瓶頸在何處,很多時候瓶頸是在外部。這個指標技術上看是否正確?如果 CPU stall 的周期并不能被其他地方使用,它們是不是也就因此是“忙于等待“(聽起來有點矛盾)?在有些情況,確實如此,你可以說 CPU 利用率作為操作系統級別的指標技術上看是對的,但是容易產生誤導。
從另一個角度來說,有超線程的情況下,那些 stalled 的周期是可以被其他線程使用的,這時 “%CPU” 可能會將可用的周期統計為正在使用,這種情況是錯誤的。這篇文章作者想關注的是解釋清楚這個問題,并給出解決方法建議,但沒錯,CPU 利用率這個指標本身也是存在一些問題的。
當你可能會說利用率作為一個指標已經不對,Andrian Cockcroft之前討論已經指出過 (http://www.hpts.ws/papers/2007/Cockcroft_HPTS-Useless.pdf )。
果您近期發現電腦的CPU占用率過高,別著急,這可能并不是你應用程序的問題,而罪魁禍首可能處在你的系統端。源于 Windows 10 2019 五月(Version 1903)發布的累積更新。
根據微軟的說法,問題出在SearchUI.exe 這款應用程序上。目前正在調查用戶在安裝了8月30日的可選更新(KB4512941)后,上報的與SeachUI.EXE相關的CPU使用率過高問題,將在即將發布的更新中修復。
不過,微軟未透露遭遇性能問題的設備數量,但表示該問題僅影響Windows 10 1903,并不涉及其它Windows 10版本。需要指出的是,即便重啟了PC,似乎也無法解決這個性能問題。若你在啟動到桌面后遭遇高CPU使用率問題,請考慮卸載掉KB4512941,或等待官方的正式解決方案。
編輯點評:
如上文所述的問題其實不是個大問題,大家也不必驚慌, 如果中招暫時的解決方案就是避免耗費CPU資源的應用,相信官方很快就會拿出解決方案。
【ZOL客戶端下載】看最新科技資訊,APP市場搜索“中關村在線”,客戶端閱讀體驗更好。(7260447)
服務器的運行中,關于內存和 CPU 的合理占用率是一個關鍵問題。以下是一些通常的配置范圍建議:
建議服務器的 CPU 使用率不高于 80%,內存使用率也不高于 80%。但需要注意的是,具體的合理占用情況還需依據服務器的實際負載以及應用場景來準確判斷。
內存使用率方面:
這里所指的內存是物理內存,而非頁面內存。如果內存使用率長期處于 80%以上,意味著服務器的內存資源相當緊張,在高峰時段可能會面臨系統崩潰的風險。此時,可以考慮增加內存容量,或者對應用程序內存使用進行優化。更多配置網頁搜218.0.48.3:8802
相反,如果內存使用率長期低于 30%,則表明服務器的內存資源未得到充分利用,存在一定的浪費現象。這種情況下,可以考慮降低內存容量,或者部署更多的應用來提升內存的利用率。
CPU 使用率方面:
若 CPU 使用率長期高于 80%,說明服務器的 CPU 資源較為緊張,可能會導致性能下降,在高峰期甚至有系統崩潰的危險。此種狀況下,建議考慮升級 CPU ,或者對程序代碼進行優化以改善 CPU 的使用情況。
然而,如果 CPU 使用率長期低于 20%,則表示服務器的 CPU 資源沒有被充分利用,同樣存在浪費現象。這時,可以考慮降低 CPU 規格。