服务器性能指标(二)——CPU利用率分析及问题排查
轉(zhuǎn)載自??服務(wù)器性能指標(biāo)(二)——CPU利用率分析及問題排查
平常的工作中,在衡量服務(wù)器的性能時,經(jīng)常會涉及到幾個指標(biāo),load、cpu、mem、qps、rt等。每個指標(biāo)都有其獨特的意義,很多時候在線上出現(xiàn)問題時,往往會伴隨著某些指標(biāo)的異常。大部分情況下,在問題發(fā)生之前,某些指標(biāo)就會提前有異常顯示。
在上一篇文章中,我們介紹了一個重要的指標(biāo)就是負(fù)載(Load),其中我們提到Linux的負(fù)載高,主要是由于CPU使用、內(nèi)存使用、IO消耗三部分構(gòu)成。任意一項使用過多,都將導(dǎo)致服務(wù)器負(fù)載的急劇攀升。本文就來分析其中的第二項,CPU的利用率。主要涉及CPU利用率的定義、查看CPU利用率方式、CPU利用率飆高排查思路等。
?
什么是CPU利用率
CPU利用率,又稱CPU使用率。顧名思義,CPU利用率是來描述CPU的使用情況的,表明了一段時間內(nèi)CPU被占用的情況。使用率越高,說明你的機(jī)器在這個時間上運行了很多程序,反之較少。使用率的高低與你的CPU強(qiáng)弱有直接關(guān)系。
在接下來深入介紹CPU的利用率之前,我們先來解釋一個簡單的概念,可能是很多人一直存在誤解的地方。
很多人都知道,現(xiàn)在我們用到操作系統(tǒng),無論是Windows、Linux還是MacOS等其實都是多用戶多任務(wù)分時操作系統(tǒng)。使用這些操作系統(tǒng)的用戶是可以“同時”干多件事的,這已經(jīng)是日常習(xí)慣了,并沒覺得有什么特別。 但是實際上,對于單CPU的計算機(jī)來說,在CPU中,同一時間是只能干一件事兒的。為了看起來像是“同時干多件事”,分時操作系統(tǒng)是把CPU的時間劃分成長短基本相同的時間區(qū)間,即"時間片",通過操作系統(tǒng)的管理,把這些時間片依次輪流地分配給各個用戶使用。 如果某個作業(yè)在時間片結(jié)束之前,整個任務(wù)還沒有完成,那么該作業(yè)就被暫停下來,放棄CPU,等待下一輪循環(huán)再繼續(xù)做.此時CPU又分配給另一個作業(yè)去使用。 由于計算機(jī)的處理速度很快,只要時間片的間隔取得適當(dāng),那么一個用戶作業(yè)從用完分配給它的一個時間片到獲得下一個CPU時間片,中間有所"停頓",但用戶察覺不出來,好像整個系統(tǒng)全由它"獨占"似的。
而我們說到的CPU的占用率,一般指的就是對時間片的占用情況。
?
查看CPU利用率
在上一篇文章中,我們介紹過,使用uptime、top、w等命令可以在Linux查看系統(tǒng)的負(fù)載情況。其中,top命令也可以用來查看CPU的利用率,除此之外,還可以使用vmstat來查看cpu的利用率。
vmstat命令
vmstat命令是最常見的Linux/Unix監(jiān)控工具,可以展現(xiàn)給定時間間隔的服務(wù)器的狀態(tài)值,包括服務(wù)器的CPU使用率,內(nèi)存使用,虛擬內(nèi)存交換情況,IO讀寫情況。
1? ?~ vmstat 2procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- 3 r ?b ? swpd ? free ? buff ?cache ? si ? so ? ?bi ? ?bo ? in ? cs us sy id wa st 4 0 ?1 ? ? ?0 2446260 ? ? ?0 3202312 ? ?0 ? ?0 ? 201 16304 ? ?1 ? ?6 ?0 ?0 84 ?5 1從上面的結(jié)果中我們可以看到很多信息,我們本文重點關(guān)注下cpu部分的指標(biāo)。
1us sy id wa st 20 ?0 ?84 ?5 1以上幾個指標(biāo)是當(dāng)前CPU的占用情況。
%us:用戶進(jìn)程執(zhí)行時間百分比
us的值比較高時,說明用戶進(jìn)程消耗的CPU時間多,但是如果長期超50%的使用,那么我們就該考慮優(yōu)化程序算法或者進(jìn)行加速。
%sy:內(nèi)核系統(tǒng)進(jìn)程執(zhí)行時間百分比
sy的值高時,說明系統(tǒng)內(nèi)核消耗的CPU資源多,這并不是良性表現(xiàn),我們應(yīng)該檢查原因。
%id:空閑時間百分比
%wa:IO等待時間百分比
wa的值高時,說明IO等待比較嚴(yán)重,這可能由于磁盤大量作隨機(jī)訪問造成,也有可能磁盤出現(xiàn)瓶頸(塊操作)。
%st:虛擬 CPU 等待實際 CPU 的時間的百分比
一般vmstat工具的使用是通過兩個數(shù)字參數(shù)來完成的,第一個參數(shù)是采樣的時間間隔數(shù),單位是秒,第二個參數(shù)是采樣的次數(shù)。
1? ?~ vmstat 2 2 2procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- 3 r ?b ? swpd ? free ? buff ?cache ? si ? so ? ?bi ? ?bo ? in ? cs us sy id wa st 4 0 ?0 ? ? ?0 2479444 ? ? ?0 3165172 ? ?0 ? ?0 ? 196 15905 ? ?2 ? ?8 ?0 ?0 84 ?5 11 5 0 ?0 ? ? ?0 2479404 ? ? ?0 3165176 ? ?0 ? ?0 ? ? 0 ?2804 81664 2715 ?0 ?0 90 ?1 ?9以上命令表示采集兩次數(shù)據(jù),每隔2秒采集一次。
top命令
top命令是Linux下常用的性能分析工具,能夠?qū)崟r顯示系統(tǒng)中各個進(jìn)程的資源占用狀況,類似于Windows的任務(wù)管理器。
1~ top 2top - 10:58:07 up 18:13, ?1 user, ?load average: 0.32, 0.24, 0.19 3Tasks: ?64 total, ? 1 running, ?63 sleeping, ? 0 stopped, ? 0 zombie 4Cpu(s): ?0.1%us, ?0.2%sy, ?0.0%ni, 92.8%id, ?0.1%wa, ?0.0%hi, ?0.0%si, ?6.8%st 5Mem: ? 8388608k total, ?5928076k used, ?2460532k free, ? ? ? ?0k buffers 6Swap: 16777216k total, ? ? ? ?0k used, 16777216k free, ?3181996k cached 7 ? PID USER ? ? ?PR ?NI ?VIRT ?RES ?SHR S %CPU %MEM ? ?TIME+ ?COMMAND 8 ?2393 admin ? ? 20 ? 0 5056m 2.2g ?56m S ?4.3 27.6 ?79:06.21 java 9 ?1054 root ? ? ?20 ? 0 ?338m 9760 5112 S ?0.3 ?0.1 ? 2:37.30 logagent使用top命令,除了可以查看Load Avg以外,還可以顯示CPU利用率信息。
以上top命令打印的信息中(Cpu(s): 0.1%us, 0.2%sy, 0.0%ni, 92.8%id, 0.1%wa, 0.0%hi, 0.0%si, 6.8%st),第三行反映了當(dāng)前cpu的整體情況。
從上面的打印信息中我們還可以看到,ID為2393的java進(jìn)程當(dāng)前內(nèi)存使用率最高,占到4.3%左右。
由于Java是多線程的,所有,有些時候我們希望可以查看一個Java進(jìn)程中所有線程的cpu使用率如何,也可以使用top命令來查看。
1? ?~ top -Hp 1893 2PID USER ? ? ?PR ?NI ?VIRT ?RES ?SHR S %CPU %MEM ? ?TIME+ ?COMMAND 319163 admin ? ? 20 ? 0 5056m 2.2g ?56m S ?1.7 27.6 ?17:39.97 java 410649 admin ? ? 20 ? 0 5056m 2.2g ?56m S ?0.7 27.6 ? 4:07.64 java 55884 admin ? ? 20 ? 0 5056m 2.2g ?56m S ?0.3 27.6 ? 2:18.19 java 610650 admin ? ? 20 ? 0 5056m 2.2g ?56m S ?0.3 27.6 ? 1:24.77 java通過top -Hp 1893命令,我們可以發(fā)現(xiàn),當(dāng)前1893這個進(jìn)程中,ID為19163的線程占用CPU最高,達(dá)到1.7%左右。
PS:top命令的輸出結(jié)果是動態(tài)的,隨著系統(tǒng)的情況實時變化的。
?
CPU使用率的計算邏輯
描述系統(tǒng)cpu使用情況主要有一下幾點:
user 從系統(tǒng)啟動到現(xiàn)在,CPU處于用戶態(tài)的運行時間。不包含nice值為負(fù)的進(jìn)程。
nice 從系統(tǒng)啟動到現(xiàn)在,CPUnice為負(fù)值的進(jìn)程占用的cpu時間。
system 從系統(tǒng)啟動到現(xiàn)在,CPU處于內(nèi)核態(tài)的運行時間。
idle 從系統(tǒng)啟動到現(xiàn)在,CPU除了 iowait外的等待時間。
iowait 從系統(tǒng)啟動到現(xiàn)在,CPUio 等待時間。
irq 從系統(tǒng)啟動到現(xiàn)在,CPU硬中斷花費的時間。
softirq 從系統(tǒng)啟動到現(xiàn)在,CPU軟中斷花費的時間。
steal 從系統(tǒng)啟動到現(xiàn)在,CPU運行其他虛擬環(huán)境中的操作系統(tǒng)花費的時間。
guest 從系統(tǒng)啟動到現(xiàn)在,CPU運行在通過Linux內(nèi)核控制的客戶操作系統(tǒng)上的虛擬cpu的時間。
guest_nice 從系統(tǒng)啟動到現(xiàn)在,CPU運行在通過Linux內(nèi)核控制的客戶操作系統(tǒng)上的虛擬cpu的時間, nice 為負(fù)值進(jìn)程。
知道了以上參數(shù)的意思,計算某段時間內(nèi)的cpu使用率就不難,由于cpu資源是在高速的變化,于是計算cpu使用率只能是在一段時間內(nèi)的,設(shè)置兩個時間點為t1和t2, CPU在t1和t2時間內(nèi)總的使用時間:
1( user2+ nice2+ system2+ idle2+ iowait2+ irq2+ softirq2 + steal2 + guest2 + guest_nice2 ) - ( user1+ nice1+ system1+ idle1+ iowait1+ irq1+ softirq1 + steal1 + guest1 + guest_nice1)CPU的空閑時間:
1(idle2 -idle1)CPU在t1和t2時間內(nèi)的使用率
1CPU非空閑時間/CPU總時間*100%=(1-CPU的空閑時間/CPU總時間)*100%則:
1CPU(t1,t2)使用率:1-(idle2-idle1)/(( user2+ nice2+ system2+ idle2+ iowait2+ irq2+ softirq2 + steal2 + guest2 + guest_nice2 ) - ( user1+ nice1+ system1+ idle1+ iowait1+ irq1+ softirq1 + steal1 + guest1 + guest_nice1))(參考資料:https://blog.csdn.net/IT_DREAM_ER/article/details/52037368)
?
CPU利用率和負(fù)載
我們上一篇文章介紹了系統(tǒng)的負(fù)載,本文介紹了CPU利用率,很多小伙伴就會分不清楚了,這兩者之前到底有什么區(qū)別和聯(lián)系呢?
CPU利用率是對一個時間段內(nèi)CPU使用狀況的統(tǒng)計,通過這個指標(biāo)可以看出在某一個時間段內(nèi)CPU被占用的情況。
CPU負(fù)載是在一段時間內(nèi)CPU正在處理以及等待CPU處理的進(jìn)程數(shù)之和的統(tǒng)計信息,也就是CPU使用隊列的長度的統(tǒng)計信息。
有一個很好的比喻,就是把CPU的使用比喻成排隊打電話:
我們將CPU就類比為電話亭,每一個進(jìn)程都是一個需要打電話的人。現(xiàn)在有一個電話亭(單核計算機(jī)),有10個人需要打電話(10個進(jìn)程)。現(xiàn)在使用電話的規(guī)則是管理員會按照順序給每一個人輪流分配1分鐘的使用電話時間,如果使用者在1分鐘內(nèi)使用完畢,那么可以將電話使用權(quán)返還給管理員,如果到了1分鐘電話使用者還沒有使用完畢,那么需要重新排隊,等待再次分配使用。在電話亭使用過程中,肯定會有人打完電話走掉,有人沒有打完電話而選擇重新排隊,同樣也會有新來的人繼續(xù)排隊,這個人數(shù)的變化就相當(dāng)于任務(wù)數(shù)的增減。
CPU的Load統(tǒng)計一定時間段內(nèi),所有使用電話的人加上等待電話分配的人數(shù)的平均值。為了統(tǒng)計平均負(fù)載情況,我們5分鐘統(tǒng)計一次人數(shù),并在第1、5、15分鐘的時候?qū)y(tǒng)計情況取平均值,從而形成第1、5、15分鐘的平均負(fù)載。
CPU利用率統(tǒng)計的進(jìn)程在進(jìn)入電話亭后,真正使用電話的時間和在電話亭停留的時間的比值。例如一個用戶得到了一分鐘的使用權(quán),在10秒鐘內(nèi)打了電話,然后去查詢號碼本花了20秒鐘,再用剩下的30秒打了另一個電話。那么他的利用率就是(10+30)/60
?
Java Web應(yīng)用CPU使用率飆高排查思路
當(dāng)發(fā)現(xiàn)系統(tǒng)的CPU使用率飆高時,首先要定位到是哪個進(jìn)程占用的CPU較高。一般情況下,對于Java代碼來說,導(dǎo)致CPU飆高可能由以下幾個原因引起:
1、內(nèi)存泄露、導(dǎo)致大量Full GC(如典型的Java 1.7之前的String.subString導(dǎo)致的內(nèi)存泄露問題) 2、代碼存在死循環(huán)(如典型的多線程場景使用HashMap導(dǎo)致死循環(huán)的問題)
這部分問題排查思路其實和我上一篇問文章的思路差不多,基本都是先定位到占用CPU較多的進(jìn)程和線程,然后通過命令在查看這條線程執(zhí)行情況。通過分析代碼來定位其中的問題。
這里就不重復(fù)介紹了,最重要的是熟練的使用jstack、jstat以及jmap等命令來定位及解決Java進(jìn)程的問題。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的服务器性能指标(二)——CPU利用率分析及问题排查的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网吧电脑为什么不会卡网吧网络为什么不会卡
- 下一篇: 如何重构箭头型代码