主頁(yè) > 知識(shí)庫(kù) > 淺談為什么磁盤慢會(huì)導(dǎo)致Linux負(fù)載飆升

淺談為什么磁盤慢會(huì)導(dǎo)致Linux負(fù)載飆升

熱門標(biāo)簽:解決方案 服務(wù)器配置 外呼系統(tǒng) 美團(tuán) 百度競(jìng)價(jià)點(diǎn)擊價(jià)格的計(jì)算公式 電話機(jī)器人搭建 硅谷的囚徒呼叫中心 家政服務(wù)網(wǎng)絡(luò)

 一、CPU利用率和負(fù)載率的區(qū)別

這里要區(qū)別CPU負(fù)載和CPU利用率,它們是不同的兩個(gè)概念,但它們的信息可以在同一個(gè)top命令中進(jìn)行顯示。CPU利用率顯示的是程序在運(yùn)行期間實(shí)時(shí)占用的CPU百分比,這是對(duì)一個(gè)時(shí)間段內(nèi)CPU使用狀況的統(tǒng)計(jì),通過(guò)這個(gè)指標(biāo)可以看出在某一個(gè)時(shí)間段內(nèi)CPU被占用的情況, 如果被占用時(shí)間很高,那么就需要考慮CPU是否已經(jīng)處于超負(fù)荷運(yùn)作。而CPU負(fù)載顯示的是在一段時(shí)間內(nèi)CPU正在處理以及等待CPU處理的進(jìn)程數(shù)之和的統(tǒng)計(jì)信息,也就是CPU使用隊(duì)列的長(zhǎng)度的統(tǒng)計(jì)信息。

CPU利用率高并不意味著負(fù)載就一定大,可能這個(gè)任務(wù)是一個(gè)CPU密集型的。一樣CPU低利用率的情況下是否會(huì)有高Load Average的情況產(chǎn)生呢?理解占有時(shí)間和使用時(shí)間就可以知道,當(dāng)CPU分配時(shí)間片以后,是否使用完全取決于使用者,因此完全可能出現(xiàn)低利用率高Load Average的情況。另外IO設(shè)備也可能導(dǎo)致CPU負(fù)載高。

由此來(lái)看,僅僅從CPU的使用率來(lái)判斷CPU是否處于一種超負(fù)荷的工作狀態(tài)還是不夠的,必須結(jié)合Load Average來(lái)全局的看CPU的使用情況。網(wǎng)上有個(gè)例子來(lái)說(shuō)明兩者的區(qū)別如下:某公用電話亭,有一個(gè)人在打電話,四個(gè)人在等待,每人限定使用電話一分鐘,若有人一分鐘之內(nèi)沒(méi)有打完電話,只能掛掉電話去排隊(duì),等待下一輪。電話在這里就相當(dāng)于CPU,而正在或等待打電話的人就相當(dāng)于任務(wù)數(shù)。在電話亭使用過(guò)程中,肯定會(huì)有人打完電話走掉,有人沒(méi)有打完電話而選擇重新排隊(duì),更會(huì)有新增的人在這兒排隊(duì),這個(gè)人數(shù)的變化就相當(dāng)于任務(wù)數(shù)的增減。為了統(tǒng)計(jì)平均負(fù)載情況,我們5秒鐘統(tǒng)計(jì)一次人數(shù),并在第1、5、15分鐘的時(shí)候?qū)y(tǒng)計(jì)情況取平均值,從而形成第1、5、15分鐘的平均負(fù)載。有的人拿起電話就打,一直打完1分鐘,而有的人可能前三十秒在找電話號(hào)碼,或者在猶豫要不要打,后三十秒才真正在打電話。如果把電話看作CPU,人數(shù)看作任務(wù),我們就說(shuō)前一個(gè)人(任務(wù))的CPU利用率高,后一個(gè)人(任務(wù))的CPU利用率低。當(dāng)然, CPU并不會(huì)在前三十秒工作,后三十秒歇著,CPU是一直在工作。只是說(shuō),有的程序涉及到大量的計(jì)算,所以CPU利用率就高,而有的程序牽涉到計(jì)算的部分很少,CPU利用率自然就低。但無(wú)論CPU的利用率是高是低,跟后面有多少任務(wù)在排隊(duì)沒(méi)有必然關(guān)系。

CPU數(shù)量和CPU核心數(shù)(即內(nèi)核數(shù))都會(huì)影響到CPU負(fù)載,因?yàn)槿蝿?wù)最終是要分配到CPU核心去處理的。兩塊CPU要比一塊CPU好,雙核要比單核好。因此,我們需要記住,除去CPU性能上的差異,CPU負(fù)載是基于內(nèi)核數(shù)來(lái)計(jì)算的,即“有多少內(nèi)核,即有多少負(fù)載”,如單核最好不要超過(guò)100%,也就是負(fù)載為1.00,如此類推。

Linux里有一個(gè)/proc目錄,存放的是當(dāng)前運(yùn)行系統(tǒng)的虛擬映射,其中有一個(gè)文件為cpuinfo,這個(gè)文件里存放著CPU的信息。/proc/cpuinfo文件按邏輯CPU而非真實(shí)CPU分段落顯示信息,每個(gè)邏輯CPU的信息占用一個(gè)段落,第一個(gè)邏輯CPU標(biāo)識(shí)從0開(kāi)始。

$ cat /proc/cpuinfo 
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 63
model name      : Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz
stepping        : 2
microcode       : 0x36
cpu MHz         : 2399.998
cache size      : 20480 KB
physical id     : 0
siblings        : 2
core id         : 0
cpu cores       : 2
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 15
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr ......
bogomips        : 4799.99
clflush size    : 64
cache_alignment : 64
address sizes   : 42 bits physical, 48 bits virtual
power management:

要理解該文件中的CPU信息,有幾個(gè)相關(guān)的概念要知道,如:processor表示邏輯CPU的標(biāo)識(shí)、model name表示真實(shí)CPU的型號(hào)信息、physical id表示真實(shí)CPU和標(biāo)識(shí)、cpu cores表示真實(shí)CPU的內(nèi)核數(shù)等等。

邏輯CPU的描述:現(xiàn)在的服務(wù)器一般都使用了“超線程”(Hyper-Threading,簡(jiǎn)稱HT)技術(shù)來(lái)提高CPU的性能。超線程技術(shù)是在一顆CPU同時(shí)執(zhí)行多個(gè)程序而共同分享一顆CPU內(nèi)的資源,理論上要像兩顆CPU一樣在同一時(shí)間執(zhí)行兩個(gè)線程。雖然采用超線程技術(shù)能同時(shí)執(zhí)行兩個(gè)線程,但它并不象兩個(gè)真正的CPU那樣,每各CPU都具有獨(dú)立的資源。當(dāng)兩個(gè)線程都同時(shí)需要某一個(gè)資源時(shí),其中一個(gè)要暫時(shí)停止,并讓出資源,直到這些資源閑置后才能繼續(xù)。因此超線程的性能并不等于兩顆CPU的性能。具有超線程技術(shù)的CPU還有一些其它方面的限制。

二、CPU負(fù)載率的計(jì)算方式

Load average的概念源自UNIX系統(tǒng),雖然各家的公式不盡相同,但都是用于衡量正在使用CPU的進(jìn)行數(shù)量和正在等待CPU的進(jìn)程數(shù)量,一句話就是runable processes的數(shù)量。所以Load average可以作為CPU瓶頸的參考指標(biāo),如果大于CPU的數(shù)量,說(shuō)明CPU可能不夠用了。

但是,在Linux上有點(diǎn)差異!

Linux上的load average除了包括正在使用CPU的進(jìn)程數(shù)量和正在等待CPU的進(jìn)程數(shù)量之外,還包括uninterruptible sleep的進(jìn)程數(shù)量。通常等待IO設(shè)備、等待網(wǎng)絡(luò)的時(shí)候,進(jìn)程會(huì)處于uninterruptible sleep狀態(tài)。Linux設(shè)計(jì)者的邏輯是,uninterruptible sleep應(yīng)該都是很短暫的,很快就會(huì)恢復(fù)運(yùn)行,所以被等同于runnable。然而uninterruptible sleep即使再短暫也是sleep,何況現(xiàn)實(shí)世界中uninterruptible sleep未必很短暫,大量的、或長(zhǎng)時(shí)間的uninterruptible sleep通常意味著IO設(shè)備遇到了瓶頸。眾所周知,sleep狀態(tài)的進(jìn)程是不需要CPU的,即使所有的CPU都空閑,正在sleep的進(jìn)程也是運(yùn)行不了的,所以sleep進(jìn)程的數(shù)量絕對(duì)不適合用作衡量CPU負(fù)載的指標(biāo),Linux把uninterruptible sleep進(jìn)程算進(jìn)load average的做法直接顛覆了load average的本來(lái)意義。所以在Linux系統(tǒng)上,load average這個(gè)指標(biāo)基本失去了作用,因?yàn)槟悴恢浪硎裁匆馑?,?dāng)看到load average很高的時(shí)候,你不知道是runnable進(jìn)程太多還是uninterruptible sleep進(jìn)程太多,也就無(wú)法判斷是CPU不夠用還是IO設(shè)備有瓶頸。

從另一個(gè)方面來(lái)說(shuō),也就可以解釋為什么磁盤慢時(shí)(大量磁盤使用時(shí)),CPU負(fù)載會(huì)飆高了。基本上我碰到CPU負(fù)載高的情況就兩種情況:CPU本身處理太多任務(wù),再加上軟中斷和上下文切換太頻繁導(dǎo)致負(fù)載高;再就是磁盤太慢導(dǎo)致了不可中斷睡眠太多導(dǎo)致CPU負(fù)載高。

以上就是本文關(guān)于淺談為什么磁盤慢會(huì)導(dǎo)致Linux負(fù)載飆升的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

標(biāo)簽:撫州 韶關(guān) 防城港 南昌 邢臺(tái) 臨沂 烏蘭察布 北海

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺談為什么磁盤慢會(huì)導(dǎo)致Linux負(fù)載飆升》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266