遇到服務(wù)器卡頓?老司機(jī)都會(huì)的CPU 性能分析,不允許你不會(huì)~
相信有工作幾年的測(cè)試人員,在做測(cè)試時(shí),一發(fā)現(xiàn)測(cè)試環(huán)境卡頓,就會(huì)想著去看服務(wù)器運(yùn)行狀態(tài)。怎么看?
可能大腦里第一反應(yīng)就是用‘top’,執(zhí)行 top 命令,看啥呢?

你看這個(gè),啥情況?有人能告訴我,為啥 CPU 使用率這么低,但是 load 值卻比較高嗎?
不知道原因,但是,知道現(xiàn)在系統(tǒng) load 值很高,所以服務(wù)器很卡。
今天,我們就來給大家介紹下,怎么看服務(wù)器運(yùn)行情況。
首先,看服務(wù)器的運(yùn)行情況,我們肯定會(huì)去看 CPU 的運(yùn)行情況。當(dāng)我們?cè)趫?zhí)行 top 命令的時(shí)候,我們會(huì)看到有一個(gè) %CPU(s) 這樣一行,這一行,就是顯示 CPU 的運(yùn)行情況(默認(rèn)間隔 3 秒鐘更新數(shù)據(jù)),其中
us:用戶態(tài),未改變優(yōu)先級(jí)的進(jìn)程占用 CPU 的百分比
sy:系統(tǒng)態(tài),內(nèi)核空間占用 CPU 百分比
ni:用戶態(tài)改變優(yōu)先級(jí)的進(jìn)程占用的 CPU 百分比
id:空閑的時(shí)間百分比
wa:空閑&等待 IO 的時(shí)間百分比
hi:硬中斷時(shí)間百分比
si:軟中斷時(shí)間百分比
st:虛擬化時(shí)被其余 vm 竊取的時(shí)間百分比
這些,我們得知道是什么意思。
然后,我們還需要知道,按下數(shù)字鍵 ‘1’,就會(huì)看到 %Cpu(0)..... 這樣多行,就可以知道當(dāng)前有多少個(gè)活躍的 CPU(邏輯)。
那么,接下來的問題就是這些數(shù)據(jù)分別代表什么意思?與 load 又是什么關(guān)系?
要想弄明白這兩個(gè)問題,我們得先知道 CPU 由哪些部分組成及他們之間是怎么工作的。
很多人說,CPU 是由三個(gè)部分組成,其實(shí),還不準(zhǔn)確,準(zhǔn)確來說,應(yīng)該是由 4 個(gè)重要部分組成:計(jì)算器、控制器、寄存器和時(shí)鐘。
計(jì)算器,顧名思義,就是 CPU 中進(jìn)行運(yùn)算的核心元件,CPU 實(shí)現(xiàn)的所有計(jì)算,都是由它來完成的。
控制器,就是 CPU 的指揮控制中心,是管理者,做一些指揮調(diào)度工作。
寄存器,這個(gè)買過電腦的同學(xué)應(yīng)該都熟悉,現(xiàn)在買電腦 CPU 都要看有幾級(jí)緩存,緩存大小。它是 CPU 中暫存數(shù)據(jù)的地方,待處理和已經(jīng)處理的數(shù)據(jù),都會(huì)暫存在這里。
時(shí)鐘,這個(gè)東西,你說它在吧,它又不在;不在吧,它又在。它做的就是時(shí)間片段計(jì)時(shí)的。計(jì)算器,在進(jìn)行計(jì)算的時(shí)候,都是有個(gè)時(shí)間片段的,時(shí)間片段到了,不管計(jì)算是否完成,計(jì)算器,都得去干其他事情,之后,再分配時(shí)間片段,來做未完成的事情。時(shí)鐘,就是這么霸道。

這張圖,相信很多同學(xué)都見過,非常形象的描述了 CPU 內(nèi)部元件之間的關(guān)系。
接下來,我們就來想一下你們公司的產(chǎn)品服務(wù)器,是不是在一臺(tái)服務(wù)器上部署產(chǎn)品服務(wù),服務(wù)運(yùn)行起來,普通用戶通過操作端,進(jìn)行操作,從而驅(qū)動(dòng)你們產(chǎn)品的服務(wù)進(jìn)行計(jì)算,輸出結(jié)果給用戶。這個(gè)計(jì)算,就是在 CPU 內(nèi)完成的。
開發(fā)人員,在實(shí)現(xiàn)產(chǎn)品經(jīng)理要求的功能時(shí),就會(huì)寫一些代碼,這些代碼,有的是要自身邏輯運(yùn)算,有的是需要調(diào)系統(tǒng)底層能力支撐,調(diào)了系統(tǒng)底層的,我們說要使用系統(tǒng)內(nèi)核,要用到 CPU 的 sy 系統(tǒng)態(tài),不用調(diào)系統(tǒng)底層的,我們就說是用 CPU 的 us 用戶態(tài),
從非內(nèi)核進(jìn)入內(nèi)核,再從內(nèi)核處理完出來到非內(nèi)核,這是不是要來回的切換。就好比公司的核心保密區(qū)和非保密區(qū),你要進(jìn)進(jìn)出出,是不是都有嚴(yán)格的審查。這個(gè)類比到 CPU,我們叫上下文切換。而這個(gè)切換,我們也分自愿上下文切換和非自愿上下文切換,這個(gè)大家應(yīng)該很好理解,主動(dòng)的進(jìn)進(jìn)出出就是自愿上下文,被迫進(jìn)進(jìn)出出就是非自愿上下文切換。還有我們前面說的時(shí)鐘片段,這些,就與 CPU 的 si 軟中斷,和 CPU 的 hi 硬中斷關(guān)聯(lián)上了。
在 CPU 進(jìn)行計(jì)算時(shí),你是不是要給一些資源(如:原始數(shù)據(jù)),進(jìn)入 CPU,計(jì)算完之后,再把結(jié)果從 CPU 中轉(zhuǎn)移出來,這個(gè)資源的進(jìn)\出,就是資源的 I/O,等待這些資源的時(shí)間,就是 CPU 的 wa 等待時(shí)間百分比。
一臺(tái)服務(wù)器并不會(huì)只部署一個(gè)應(yīng)用服務(wù),當(dāng)有多個(gè)應(yīng)用服務(wù)在運(yùn)行時(shí),你認(rèn)為現(xiàn)在的服務(wù)器是讓它們串行,還是并行?相信不用我說答案,大家都會(huì)說肯定是并行,那你們?cè)傧胂?,并行,插?duì)是不是有可能。這種,服務(wù)間進(jìn)程插隊(duì)的情況,就是 CPU 的 ni 進(jìn)程優(yōu)先級(jí)切換。
當(dāng)沒有用戶使用你們的產(chǎn)品的時(shí)候,服務(wù)器在歇息,次數(shù)就是 CPU 的 id 空閑時(shí)間百分比。
好了,大家是否理解了呢?可以對(duì)照著第 1 張圖,檢驗(yàn)一下,看自己是否弄明白了哦!
第二個(gè)問題,CPU 的數(shù)據(jù)與 load 值之間到底什么關(guān)系?load 值很大,CPU 的數(shù)據(jù)就一定高嗎?
相信,很多人,在沒有看過文章第 1 張圖之前,肯定會(huì)認(rèn)為是對(duì)的,load 值大,CPU 的使用率就一定高。因?yàn)?,普通的認(rèn)識(shí)是,CPU 的 us + sy 的值越接近 100,說明 CPU 越繁忙,load 值就應(yīng)該高,相反,就應(yīng)該低。其實(shí),在這個(gè)里面,存在一個(gè)誤區(qū)。
現(xiàn)在 Linux 服務(wù)器的內(nèi)核,絕大多數(shù)都已經(jīng)升級(jí),超過了 2.6 版本。在 2.6 版的內(nèi)核中,已經(jīng)把 load 值的計(jì)算方法調(diào)整為,所有不可中斷睡眠狀態(tài)的進(jìn)程,即 load average = CPU 負(fù)載 +Disk 負(fù)載 + 網(wǎng)絡(luò)負(fù)載 + 其余外設(shè)負(fù)載,從第 1 張圖看,就是包含了我們的 wa 等待負(fù)載值。
所以,第 1 張圖中,我們能分析出,目前的服務(wù)器存在 I/O 問題,是因?yàn)榉?wù)器頻繁在執(zhí)行數(shù)據(jù)換進(jìn)換出,導(dǎo)致 CPU 的 wa 等待資源時(shí)間過長(zhǎng),從而出現(xiàn) load 值過高,系統(tǒng)比較卡頓。
聲明:本文為檸檬班Allen老師原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處!