CPU使用率低高負載的原因是什么

CPU使用率低高負載的原因是什么,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

10年積累的成都做網(wǎng)站、成都網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有凱里免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

原因總結(jié)

產(chǎn)生的原因一句話總結(jié)就是:等待磁盤I/O完成的進程過多,導致進程隊列長度過大,但是cpu運行的進程卻很少,這樣就體現(xiàn)到負載過大了,cpu使用率低。

下面內(nèi)容是具體的原理分析:
在分析負載為什么高之前先介紹下什么是負載、多任務(wù)操作系統(tǒng)、進程調(diào)度等相關(guān)概念。

什么是負載

什么是負載:負載就是cpu在一段時間內(nèi)正在處理以及等待cpu處理的進程數(shù)之和的統(tǒng)計信息,也就是cpu使用隊列的長度統(tǒng)計信息,這個數(shù)字越小越好(如果超過CPU核心*0.7就是不正常)

負載分為兩大部分:CPU負載、IO負載

例如,假設(shè)有一個進行大規(guī)??茖W計算的程序,雖然該程序不會頻繁地從磁盤輸入輸出,但是處理完成需要相當長的時間。因為該程序主要被用來做計算、邏輯判斷等處理,所以程序的處理速度主要依賴于cpu的計算速度。此類cpu負載的程序稱為“計算密集型程序”。

還有一類程序,主要從磁盤保存的大量數(shù)據(jù)中搜索找出任意文件。這個搜索程序的處理速度并不依賴于cpu,而是依賴于磁盤的讀取速度,也就是輸入輸出(input/output,I/O).磁盤越快,檢索花費的時間就越短。此類I/O負載的程序,稱為“I/O密集型程序”。

什么是多任務(wù)操作系統(tǒng)

Linux操作系統(tǒng)能夠同時處理幾個不同名稱的任務(wù)。但是同時運行多個任務(wù)的過程中,cpu和磁盤這些有限的硬件資源就需要被這些任務(wù)程序共享。即便很短的時間間隔內(nèi),需要一邊在這些任務(wù)之間進行切換到一邊進行處理,這就是多任務(wù)。

運行中的任務(wù)較少的情況下,系統(tǒng)并不是等待此類切換動作的發(fā)生。但是當任務(wù)增加時,例如任務(wù)A正在CPU上執(zhí)行計算,接下來如果任務(wù)B和C也想進行計算,那么就需要等待CPU空閑。也就是說,即便是運行處理某任務(wù),也要等到輪到他時才能運行,此類等待狀態(tài)就表現(xiàn)為程序運行延遲。

uptime輸出中包含“l(fā)oad average”的數(shù)字

[root@localhost ~]# uptime
11:16:38 up 2:06, 4 users, load average: 0.00, 0.02, 0.05

Load average從左邊起依次是過去1分鐘、5分鐘、15分鐘內(nèi),單位時間的等待任務(wù)數(shù),也就是表示平均有多少任務(wù)正處于等待狀態(tài)。在load average較高的情況下,這就說明等待運行的任務(wù)較多,因此輪到該任務(wù)運行的等待時間就會出現(xiàn)較大的延遲,即反映了此時負載較高。

進程調(diào)度

什么是進程調(diào)度:

進程調(diào)度也被一些人稱為cpu上下文切換意思是:CPU切換到另一個進程需要保存當前進程的狀態(tài)并恢復另一個進程的狀態(tài):當前運行任務(wù)轉(zhuǎn)為就緒(或者掛起、中斷)狀態(tài),另一個被選定的就緒任務(wù)成為當前任務(wù)。進程調(diào)度包括保存當前任務(wù)的運行環(huán)境,恢復將要運行任務(wù)的運行環(huán)境。

在linux內(nèi)核中,每一個進程都存在一個名為“進程描述符”的管理表。該進程描述符會調(diào)整為按照優(yōu)先級降序排序,已按合理的順序運行進程(任務(wù))。這個調(diào)整即為進程調(diào)度器的工作。

調(diào)度器劃分并管理進程的狀態(tài),如:

<ul class=">

  • 等待分配cpu資源的狀態(tài)。

  • 等待磁盤輸入輸出完畢的狀態(tài)。

下面在說一下進程的狀態(tài)區(qū)別:

狀態(tài)說明
運行態(tài)(running)只要cpu空閑,任何時候都可以運行
可中斷睡眠(interruptible)為恢復時間無法預(yù)測的長時間等待狀態(tài)。如,來自于鍵盤設(shè)備的輸入。
不可中斷睡眠:(uninterruptible)主要為短時間時的等待狀態(tài)。例如磁盤輸入輸出等待。被IO阻塞的進程
就緒態(tài)(runnable)響應(yīng)暫停信號而運行的中斷狀態(tài)。
僵死態(tài)(zombie)進程都是由父進程創(chuàng)建,并銷毀;在父進程沒有銷毀其子進程,被銷毀的時候,其子進程由于沒有父進程被銷毀,就會轉(zhuǎn)變?yōu)榻┧缿B(tài)。

下面舉例來說明進程狀態(tài)轉(zhuǎn)變:

這里有三個進程A、B、C同時運行。首先,每個進程在生成后都是可運行狀態(tài),也就是running狀態(tài)的開始,而不是現(xiàn)在運行狀態(tài),由于在linux內(nèi)核中無法區(qū)別正在運行的狀態(tài)和可運行的等待狀態(tài),下面將可運行狀態(tài)和正在運行狀態(tài)都稱為running狀態(tài)。

  • 進程A:running

  • 進程B:running

  • 進程C:running

running的三個進程立即成為調(diào)度對象。此時,假設(shè)調(diào)度器給進程A分配了CPU的運行權(quán)限。

  • 進程A:running (正在運行)

  • 進程B:running

  • 進程C:running

進程A分配了CPU,所以進程A開始處理。進程B和C則在此等待進程A遷出CPU。假設(shè)進程A進行若干計算之后,需要從磁盤讀取數(shù)據(jù)。那么在A發(fā)出讀取磁盤數(shù)據(jù)的請求之后,到請求數(shù)據(jù)到達之前,將不進行任何工作。此狀態(tài)稱為“因等待I/O操作結(jié)束而被阻塞”。在I/O完成處理前,進程A就一直處于等待中,就會轉(zhuǎn)為不可中斷睡眠狀態(tài)(uninterruptible),并不使用CPU。于是調(diào)度器查看進程B和進程C的優(yōu)先級計算結(jié)果,將CPU運行權(quán)限交給優(yōu)先級較高的一方。這里假設(shè)進程B的優(yōu)先級高于進程C。

  • 進程A:uninterruptible (等待磁盤輸入輸出/不可中斷狀態(tài))

  • 進程B:running (正在運行)

  • 進程C:running

進程B剛開始運行,就需要等待用戶的鍵盤輸入。于是B進入等待用戶鍵盤輸入狀態(tài),同樣被阻塞。結(jié)果就變成了進程A和進程B都是等待輸出,運行進程C。這時進程A和進程B都是等待狀態(tài),但是等待磁盤輸入輸出和等待鍵盤輸入為不同的狀態(tài)。等待鍵盤輸入是無限期的事件等待,而讀取磁盤則是必須短時間內(nèi)完成的事件等待,這是兩種不同的等待狀態(tài)。各進程狀態(tài)如下所示:

  • 進程A:uninterruptible (等待磁盤輸入輸出/不可中斷狀態(tài))

  • 進程B:interruptible (等待鍵盤輸入輸出/可中斷狀態(tài))

  • 進程C:running (正在運行)

這次假設(shè)進程C在運行的過程中,進程A請求的數(shù)據(jù)從磁盤到達了緩沖裝置。緊接著硬盤對內(nèi)核發(fā)起中斷信號,內(nèi)核知道磁盤讀取完成,將進程A恢復為可運行狀態(tài)。

進程A:running (正在運行)
進程B:interruptible (等待鍵盤輸入輸出/可中斷狀態(tài))
進程C:running (正在運行)

此后進程C也會變?yōu)槟撤N等待狀態(tài)。如CPU的占用時間超出了上限、任務(wù)結(jié)束、進入I/O等待。一旦滿足這些條件,調(diào)度器就可以完成從進程C到進程A的進程狀態(tài)切換。

負載的意義

負載表示的是“等待進程的平均數(shù)”。在上面的進程狀態(tài)變換過程中,除了running狀態(tài),其他都是等待狀態(tài),那么其他狀態(tài)都會加入到負載等待進程中嗎?

事實證明,只有進程處于運行態(tài)(running)和不可中斷狀態(tài)(interruptible)才會被加入到負載等待進程中,也就是下面這兩種情況的進程才會表現(xiàn)為負載的值。

  • 即便需要立即使用CPU,也還需等待其他進程用完CPU

  • 即便需要繼續(xù)處理,也必須等待磁盤輸入輸出完成才能進行

下面描述一種直觀感受的場景說明為什么只有運行態(tài)(running)和可中斷狀態(tài)(interruptible)才會被加入負載。

如:在很占用CPU資源的處理中,例如在進行動畫編碼的過程中,雖然想進行其他相同類型的處理,結(jié)果系統(tǒng)反映卻變得很慢,還有從磁盤讀取大量數(shù)據(jù)時,系統(tǒng)的反映也同樣會變的很慢。但是另一方面,無論有多少等待鍵盤輸入輸出操作的進程,也不會讓系統(tǒng)響應(yīng)變慢。

什么場景會造成CPU低而負載確很高?

通過上面的具體分析負載的意義就很明顯了,負載總結(jié)為一句話就是:需要運行處理但又必須等待隊列前的進程處理完成的進程個數(shù)。具體來說,也就是如下兩種情況:

  • 等待被授權(quán)予CPU運行權(quán)限的進程

  • 等待磁盤I/O完成的進程

cpu低而負載高也就是說等待磁盤I/O完成的進程過多,就會導致隊列長度過大,這樣就體現(xiàn)到負載過大了,但實際是此時cpu被分配去執(zhí)行別的任務(wù)或空閑,具體場景有如下幾種。

場景一:磁盤讀寫請求過多就會導致大量I/O等待
上面說過,cpu的工作效率要高于磁盤,而進程在cpu上面運行需要訪問磁盤文件,這個時候cpu會向內(nèi)核發(fā)起調(diào)用文件的請求,讓內(nèi)核去磁盤取文件,這個時候會切換到其他進程或者空閑,這個任務(wù)就會轉(zhuǎn)換為不可中斷睡眠狀態(tài)。當這種讀寫請求過多就會導致不可中斷睡眠狀態(tài)的進程過多,從而導致負載高,cpu低的情況。

場景二:MySQL中存在沒有索引的語句或存在死鎖等情況
我們都知道MySQL的數(shù)據(jù)是存儲在硬盤中,如果需要進行sql查詢,需要先把數(shù)據(jù)從磁盤加載到內(nèi)存中。當在數(shù)據(jù)特別大的時候,如果執(zhí)行的sql語句沒有索引,就會造成掃描表的行數(shù)過大導致I/O阻塞,或者是語句中存在死鎖,也會造成I/O阻塞,從而導致不可中斷睡眠進程過多,導致負載過大。

具體解決方法可以在MySQL中運行show full processlist命令查看線程等待情況,把其中的語句拿出來進行優(yōu)化。

場景三:外接硬盤故障,常見有掛了NFS,但是NFS server故障
比如我們的系統(tǒng)掛載了外接硬盤如NFS共享存儲,經(jīng)常會有大量的讀寫請求去訪問NFS存儲的文件,如果這個時候NFS Server故障,那么就會導致進程讀寫請求一直獲取不到資源,從而進程一直是不可中斷狀態(tài),造成負載很高。

看完上述內(nèi)容,你們掌握CPU使用率低高負載的原因是什么的方法了嗎?如果還想學到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

網(wǎng)頁標題:CPU使用率低高負載的原因是什么
分享網(wǎng)址:http://bm7419.com/article18/goeodp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管企業(yè)網(wǎng)站制作、網(wǎng)頁設(shè)計公司、網(wǎng)站內(nèi)鏈、移動網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)