聊聊服务器的负载
負(fù)載可以說(shuō)是一個(gè)服務(wù)器是否正常的風(fēng)向標(biāo),當(dāng)接入的軟件運(yùn)行緩慢的時(shí)候,相信大部分人排查線上服務(wù)器第一件事就是要看下負(fù)載的高低?通過(guò)uptime命令可以直觀的看到系統(tǒng)1、5、15分鐘內(nèi)的平均負(fù)載值,本文簡(jiǎn)稱為負(fù)載。那么關(guān)于負(fù)載就有一些有意思的話題了。如什么是負(fù)載,如何判定負(fù)載的高低?那些原因?qū)е仑?fù)載升高?下面結(jié)合我的一些工作經(jīng)驗(yàn)簡(jiǎn)單聊一聊。
什么是負(fù)載?
在我最早接觸負(fù)載一詞的時(shí)候,大腦里的印象就是衡量服務(wù)器的繁忙程度,因此服務(wù)器的負(fù)載不能太高,高了的話服務(wù)器就忙不過(guò)來(lái)了。我對(duì)負(fù)載這樣的認(rèn)識(shí)一直大概保持了一年半,后來(lái)還是因?yàn)橛袀€(gè)原 因,于是去man了下uptime。
關(guān)于負(fù)載的解釋,uptime上有算是較為詳細(xì)的說(shuō)明:
System load averages is the average number of processes that are either in a runnable or uninterruptable state. A process in a runnable state is either using the CPU or waiting to use the CPU. A process in uninterruptable state is waiting for some I/O access, eg waiting for disk. The averages are taken over the three time intervals. Load averages are not normalized for the number of CPUs in a system, so a load average of 1 means a single CPU system is loaded all the time while on a 4 CPU system it means it was idle 75% of the time.
根據(jù)以上的描述,負(fù)載的概念就清晰起來(lái)了,首先負(fù)載是什么? 負(fù)載是一個(gè)平均進(jìn)程數(shù)。那么,是所有狀態(tài)下的進(jìn)程數(shù)嗎?不是的,對(duì)進(jìn)程的狀態(tài)有要求,就是進(jìn)程的狀態(tài)需要處于 runnable state(可運(yùn)行狀態(tài)) 和 uninterrupttable state(不可中斷狀態(tài))。
ok,現(xiàn)在的重點(diǎn)來(lái)到了這兩種狀態(tài)的進(jìn)程的理解上,何為 runnable 狀態(tài),上面也給出了清晰的解釋,就是要么進(jìn)程正在使用cpu,要么正在等待著使用cpu。對(duì)這句解釋稍作補(bǔ)充,在一個(gè)進(jìn)程的生命周期中,會(huì)有不同狀態(tài),處于runnable狀態(tài)的進(jìn)程代表著一切資源準(zhǔn)備就緒了(cpu資源除外),那么就會(huì)有兩種情況,一種是已經(jīng)獲得了cpu資源的,那么就代表著他正在使用cpu資源進(jìn)行運(yùn)行,另外一種就是他在排隊(duì)等待cpu資源。(進(jìn)程調(diào)度器會(huì)為使用cpu資源的進(jìn)程維護(hù)一個(gè)隊(duì)列)因?yàn)閘inux是多用戶多進(jìn)程系統(tǒng),進(jìn)程數(shù)量一般遠(yuǎn)大于cpu數(shù)量,因此cpu的資源是珍貴的,使用需要申請(qǐng)和排隊(duì)。
何為uninterruptable 狀態(tài)?,就是進(jìn)程正在等待一些IO的請(qǐng)求,諸如磁盤IO/網(wǎng)絡(luò)IO。說(shuō)實(shí)在的,對(duì)于這個(gè)理解我還只能停留在表面。uninterruptable和 interruptable都是進(jìn)程的sleep狀態(tài)。我們可以理解為進(jìn)程在睡覺(jué)(進(jìn)程要繼續(xù)運(yùn)行的條件和資源不充分,因此他們要睡覺(jué)),進(jìn)入這兩種狀態(tài)下,他們會(huì)立即釋放掉cpu資源,不同點(diǎn)在于,處于interruptable是一種淺睡,任何的風(fēng)吹草動(dòng)(信號(hào))都會(huì)驚醒他,然后他就會(huì)醒來(lái)接著干活。那么uninterruptable 就是一種沉睡,只有他等到的東西等來(lái)了他才醒來(lái)。
總結(jié)來(lái)說(shuō),負(fù)載數(shù)值即是處于runnable state 和uninterruptable state 的進(jìn)程數(shù)。可以大致理解為系統(tǒng)正在處理的進(jìn)程數(shù)。
如何判斷負(fù)載的高低?
記得畢業(yè)后剛?cè)肼殠讉€(gè)月的時(shí)候,適逢雙十一,上面分了幾臺(tái)小的服務(wù)器,讓盯梢負(fù)載。然后,我問(wèn)旭哥說(shuō)多高負(fù)載算高,旭哥說(shuō)超過(guò)1就很高了。所以,從此我就記住了,負(fù)載高于1就高了。直到有一次一個(gè)持有相同概念的同事被另外一個(gè)同事鄙視后,我偷偷弄明白了負(fù)載后,負(fù)載高于1就過(guò)載的說(shuō)法就不攻自破了。
關(guān)于負(fù)載過(guò)1就過(guò)載的說(shuō)法在只有一個(gè)cpu的情況下是可以理解的,因?yàn)橐粋€(gè)cpu同一時(shí)刻只能處理一個(gè)進(jìn)程,所以剛好是100%的滿負(fù)荷運(yùn)行。但是在一個(gè)四核的機(jī)器上,無(wú)異于其他三個(gè)cpu在空閑著。所以看負(fù)載是否過(guò)載,要有一個(gè)前提,那就是需要明確有幾個(gè)cpu,如果負(fù)載數(shù)長(zhǎng)時(shí)間高于cpu數(shù),那么就可以判斷為過(guò)載。
cat /proc/cpuinfo
以上命令可以查看cpu的個(gè)數(shù)。但這并不是說(shuō),我們都要線上的機(jī)器都要滿負(fù)荷的去跑,肯定是要有一定的余量的,至于余多少,可以根據(jù)自己業(yè)務(wù)的訪問(wèn)情況決定。
那些原因?qū)е仑?fù)載升高?
有了對(duì)負(fù)載本質(zhì)的了解,就不難分析出負(fù)載較高的情況了?導(dǎo)致負(fù)載升高的原因無(wú)非有兩個(gè)原因,一個(gè)是處于 runnable state 的進(jìn)程不斷增多,另一個(gè)是處于 uninterruptable state的進(jìn)程不斷增多。runnable state 增多一般是cpu資源不夠,而uninterruptable state增多大部分時(shí)間是磁盤IO成為瓶頸。
cpu資源不夠,為了方便理解,我們可以假設(shè)機(jī)器只有一個(gè)cpu,而每個(gè)進(jìn)程處理需要1s,但是每1s就會(huì)2個(gè)進(jìn)程需要處理,此時(shí)每1過(guò)1s就會(huì)累積一個(gè)進(jìn)程處理不掉,那么負(fù)載自然就不斷的增加
IO成為瓶頸,有的時(shí)候cpu利用率不是很高,但是負(fù)載依然會(huì)很高,比如大量的讀請(qǐng)求,導(dǎo)致磁盤io成為瓶頸,此時(shí)進(jìn)程在等待磁盤IO的同時(shí)是不可中斷的狀態(tài),因此仍然會(huì)參與負(fù)載值的計(jì)算,因此負(fù)載會(huì)變高
個(gè)人遇到的一些導(dǎo)致負(fù)載升高的原因
本人從事電商ERP系統(tǒng)開發(fā),服務(wù)器中安裝有mysql服務(wù)器,因此一般情況下,出問(wèn)題大部分是mysql中的一些問(wèn)題。
大量數(shù)據(jù)請(qǐng)求時(shí),包括搜索時(shí)全表掃描、以及大量的導(dǎo)出數(shù)據(jù)等。這種情況下一般大量的讀請(qǐng)求讓IO成為瓶頸,導(dǎo)致其他進(jìn)程也處理緩慢,因此隨著時(shí)間的增加負(fù)載就會(huì)升高
事務(wù)未提交,一般一些業(yè)務(wù)處理系統(tǒng),耦合關(guān)系強(qiáng),如訂單的出庫(kù)和庫(kù)存的關(guān)系,一般是需要原子性操作,這個(gè)時(shí)候一般會(huì)使用事務(wù)來(lái)進(jìn)行控制,但是不幸出現(xiàn)事務(wù)未提交的情況,會(huì)導(dǎo)致大量資源被鎖,其他請(qǐng)求處于長(zhǎng)時(shí)間等待的情況,這種情況也會(huì)導(dǎo)致負(fù)載升高
死鎖,mysql的死鎖檢測(cè)以及回滾都會(huì)有一定的時(shí)間,加之事務(wù)對(duì)資源的獨(dú)占,出現(xiàn)死鎖會(huì)出現(xiàn)短暫的擁堵現(xiàn)象,同時(shí)負(fù)載的短時(shí)間內(nèi)上升,不過(guò)后面繼續(xù)會(huì)下降。但是死鎖很頻繁的情況下,負(fù)載也會(huì)一直較高
內(nèi)存不足時(shí),mysql服務(wù)器是相當(dāng)耗費(fèi)內(nèi)存的,如果內(nèi)存不足導(dǎo)致交換分區(qū)長(zhǎng)時(shí)間使用的話,也會(huì)讓機(jī)器負(fù)載升高
其他導(dǎo)致的一些IO問(wèn)題,如磁盤損壞以及磁盤空間不足
總結(jié)
- 上一篇: 百度识图搜索与bing的简单比较
- 下一篇: 去哪网订机票(携程好还是去哪儿网?)