這篇文章主要介紹了CPU利用率如何計(jì)算,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
創(chuàng)新互聯(lián)擁有一支富有激情的企業(yè)網(wǎng)站制作團(tuán)隊(duì),在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)深耕十載,專業(yè)且經(jīng)驗(yàn)豐富。十載網(wǎng)站優(yōu)化營(yíng)銷經(jīng)驗(yàn),我們已為上千多家中小企業(yè)提供了成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)解決方案,按需開(kāi)發(fā)網(wǎng)站,設(shè)計(jì)滿意,售后服務(wù)無(wú)憂。所有客戶皆提供一年免費(fèi)網(wǎng)站維護(hù)!
我們平時(shí)使用的CPU利用率方法是極具誤導(dǎo)性的,并且一年更甚一年。那么什么是CPU利用率?是你的CPU到底有多忙,是像“% CPU”這樣到處在用的指標(biāo)所顯示的那樣嗎?
在top命令里,你看到90%的CPU利用率是這樣:
然而它真正想表達(dá)的是這個(gè)意思:
Stall(這里譯作“怠速”)是說(shuō)這個(gè)處理器沒(méi)有在跑指令,比如在等待內(nèi)存I/O的時(shí)候。我上圖所畫的比例(“忙”與“怠速”之間)是我在真實(shí)生產(chǎn)環(huán)境中遇到的,并且你的CPU也很可能是處于“怠速”狀態(tài)。
這些對(duì)你有什么意義呢?理解CPU怠速多少,會(huì)直接影響到你在減少代碼或者減少內(nèi)存I/O的調(diào)優(yōu)工作。
那么真正的CPU利用率怎么算呢?
平時(shí)的CPU利用都是非空閑時(shí)間,即CPU不運(yùn)行idle線程(比如Windows里的空閑進(jìn)程)的時(shí)間。你的操作系統(tǒng)那會(huì)平時(shí)會(huì)在上下文切換的時(shí)候跟蹤它,但是假如一個(gè)非idle線程開(kāi)始運(yùn)行100毫秒后停止,那內(nèi)核會(huì)認(rèn)為后面這段時(shí)間CPU也在這個(gè)非idle線程上。
在老舊的分時(shí)系統(tǒng)里,這么算沒(méi)毛病。阿波羅登月艙的導(dǎo)航系統(tǒng)計(jì)算機(jī)將這里的idle線程叫做“DUMMY JOB”,工程師用利用它來(lái)測(cè)算計(jì)算機(jī)的利用率,可以參考之前我寫過(guò)的這樣一篇文章(鏈接地址:http://www.brendangregg.com/usemethod.html#Apollo)。
那么它有什么毛病呢?
現(xiàn)在的CPU比內(nèi)存已經(jīng)快了很多倍,但等待內(nèi)存的時(shí)間仍然被算進(jìn)CPU時(shí)間中。當(dāng)你在top命令中看到較高的“%CPU”的時(shí)候,你可能認(rèn)為它到達(dá)了一個(gè)性能瓶頸,就是散熱片和風(fēng)扇下面的那個(gè)CPU,但實(shí)際上,這是那一根根內(nèi)存條的鍋。
如何分辨CPU到底在忙啥?
使用性能監(jiān)測(cè)計(jì)數(shù)器(PMC)——一種能夠用perf或者其他工具命令查看的硬件計(jì)數(shù)器。比如,觀測(cè)整個(gè)系統(tǒng)10秒鐘:
# perf stat -a -- sleep 10 Performance counter stats for 'system wide': 641398.723351 task-clock (msec) # 64.116 CPUs utilized (100.00%) 379,651 context-switches # 0.592 K/sec (100.00%) 51,546 cpu-migrations # 0.080 K/sec (100.00%) 13,423,039 page-faults # 0.021 M/sec 1,433,972,173,374 cycles # 2.236 GHz (75.02%) 1,118,336,816,068 instructions # 0.78 insns per cycle (75.01%) 249,644,142,804 branches # 389.218 M/sec (75.01%) 7,791,449,769 branch-misses # 3.12% of all branches (75.01%)
10.003794539 seconds time elapsed |
這里的一個(gè)關(guān)鍵指標(biāo)就是instructions per cylce(IPC,每CPU周期執(zhí)行指令數(shù)),它能夠顯示每CPU周期內(nèi)每個(gè)CPU運(yùn)行了多少指令,越高說(shuō)明效率越高。上述示例中,這一值為0.78,但這并不說(shuō)明CPU利用率為78%,因?yàn)楝F(xiàn)代CPU的IPC最大值為4.0(新的已經(jīng)到了5.0),也就是4-wide。CPU在執(zhí)行指令時(shí),單個(gè)指令會(huì)被分割為多個(gè)步驟,比如取指令、解碼、執(zhí)行、內(nèi)存訪問(wèn)、寫寄存器等,這些命令如果在單個(gè)CPU周期內(nèi)最多執(zhí)行一個(gè),那么需要5個(gè)CPU周期來(lái)完成一條命令,IPC就是0.2,如果采用指令流水線,即3~5-wide的CPU,那么完美狀態(tài)下1個(gè)CPU周期就可以完成一條命令,IPC就是1。(譯者注:作者文中使用了CPU clock cycle表示通常所說(shuō)的CPU周期,為了避免與晶振時(shí)鐘周期混肴我并沒(méi)有將其譯為CPU時(shí)鐘周期。)
當(dāng)然,還有數(shù)百個(gè)其他你可以用來(lái)測(cè)量的性能計(jì)數(shù)器。
如果在虛擬化環(huán)境中,guest一般不能直接訪問(wèn)PMC,這取決于hypervisor是否支持。我最近寫的一篇The PMCsof EC2: Measuring(鏈接地址:http://www.brendangregg.com/blog/2017-05-04/the-pmcs-of-ec2.html) IPC展示了AWS EC2中基于Xen的虛擬機(jī)如何使用PMC。
最佳實(shí)踐
如果你的IPC小于1.0,你可能遇到了內(nèi)存操作密集型,軟件調(diào)優(yōu)策略可以有減少內(nèi)存I/O,增強(qiáng)內(nèi)存本地訪問(wèn)性,尤其是在NUMA系統(tǒng)上。硬件調(diào)優(yōu)策略則是使用CPU cache較大以及更快的內(nèi)存、總線和內(nèi)聯(lián)技術(shù)。三門峽婦科醫(yī)院http://www.smxrlyy.com/
如果你的IPC > 1.0,你可能是指令密集型??梢栽噲D減少指令的執(zhí)行數(shù)量,比如消除不必要的工作和緩存操作等,可以用一下CPU火焰圖(鏈接地址:http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html)。硬件調(diào)優(yōu)方面,可以嘗試高主頻、多核、超線程的CPU。
性能檢測(cè)產(chǎn)品應(yīng)該告訴你什么呢?
性能檢測(cè)工具都應(yīng)該顯示出每個(gè)進(jìn)程的IPC,或者是按照指令周期與怠速周期,比如%INS和%STL,下圖為L(zhǎng)inux中的tiptop命令:
tiptop - [root] Tasks: 96 total, 3 displayed screen 0: default
PID [ %CPU] %SYS P Mcycle Minstr IPC %MISS %BMIS %BUS COMMAND 3897 35.3 28.5 4 274.06 178.23 0.65 0.06 0.00 0.0 java 1319+ 5.5 2.6 6 87.32 125.55 1.44 0.34 0.26 0.0 nm-applet 900 0.9 0.0 6 25.91 55.55 2.14 0.12 0.21 0.0 dbus-daemo |
CPU利用率具有誤導(dǎo)性的其他理由
使得這個(gè)%CPU指標(biāo)錯(cuò)誤的理由除了CPU在內(nèi)存的怠速周期外,還有如下因素:
溫度也能使CPU進(jìn)入怠速;
Turboboost(睿頻)引起時(shí)鐘頻率變化;
SpeedStep引起時(shí)鐘頻率變化;
一分鐘內(nèi)的80%的平均利用率并不能表示100%的突發(fā)利用率(類似網(wǎng)絡(luò)QoS);
自旋鎖:CPU在很嚴(yán)肅地瞎忙;
Update: CPU利用率真的錯(cuò)了嗎?
自這篇文章發(fā)布以后,留言討論非常激烈,已經(jīng)有了上百條了。首先謝謝你們對(duì)這話題感興趣并花時(shí)間閱讀,但我在這里還是要統(tǒng)一回復(fù):我對(duì)disk的iowait并不關(guān)心(譯者注:PC CPU不能直接操作外部存儲(chǔ)),并且文中也已經(jīng)給出了內(nèi)存操作密集型的對(duì)應(yīng)調(diào)優(yōu)措施。
然而,CPU利用率到底是從本質(zhì)上錯(cuò)了還是僅僅是有誤導(dǎo)性了?我認(rèn)為需要人將高CPU利用率視為處理單元的瓶頸的事兒,是錯(cuò)的。那么這個(gè)指標(biāo)的計(jì)算方法從技術(shù)上講正確嗎?如果CPU在怠速期間不能被其他任何進(jìn)程使用,那么這不就是所謂的“使用等待”(聽(tīng)起來(lái)有點(diǎn)矛盾)。某些情況下,%CPU作為一個(gè)操作系統(tǒng)層面的指標(biāo)是技術(shù)正確但是容易誤導(dǎo)人的。在超線程中,怠速周期可以被其他線程使用,所以%CPU的算法也會(huì)將其算在內(nèi),而實(shí)際上并沒(méi)有利用。那樣是不對(duì)的,這篇文章中我強(qiáng)調(diào)的是解釋問(wèn)題并提出對(duì)策,并且,這個(gè)指標(biāo)也有技術(shù)上的問(wèn)題。
結(jié)論
CPU利用率已成為一個(gè)極具誤導(dǎo)性的指標(biāo):它算進(jìn)了等待主存的周期,而這類周期在現(xiàn)代的CPU負(fù)載中占據(jù)不少。如果使用額外指標(biāo),你就能搞清楚%CPU到底意味著什么,包括每CPU周期執(zhí)行指令數(shù)(IPC)。IPC < 1.0可能意味著你的應(yīng)用是內(nèi)存密集型,而IPC > 1.0則可能是指令密集型。我在之前的一篇文章,顯示%CPU的性能監(jiān)控產(chǎn)品也應(yīng)該顯示PMC測(cè)量指標(biāo),并給予充分解釋,這樣才不會(huì)誤導(dǎo)用戶。比如,它們可以一起顯示%CPU和IPC,或者指令周期與怠速周期。有了這些指標(biāo),開(kāi)發(fā)或管理人員才能在應(yīng)用和操作系統(tǒng)中選擇正確的調(diào)優(yōu)方式。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“CPU利用率如何計(jì)算”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!