偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

CPU使用率低高負(fù)載的原因,看看這篇!

系統(tǒng) Linux
等待磁盤I/O完成的進(jìn)程過(guò)多,導(dǎo)致進(jìn)程隊(duì)列長(zhǎng)度過(guò)大,但是cpu運(yùn)行的進(jìn)程卻很少,這樣就體現(xiàn)到負(fù)載過(guò)大了,cpu使用率低。

[[277723]]

原因總結(jié)

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

下面內(nèi)容是具體的原理分析:

在分析負(fù)載為什么高之前先介紹下什么是負(fù)載、多任務(wù)操作系統(tǒng)、進(jìn)程調(diào)度等相關(guān)概念。

什么是負(fù)載

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

負(fù)載分為兩大部分:CPU負(fù)載、IO負(fù)載

例如,假設(shè)有一個(gè)進(jìn)行大規(guī)??茖W(xué)計(jì)算的程序,雖然該程序不會(huì)頻繁地從磁盤輸入輸出,但是處理完成需要相當(dāng)長(zhǎng)的時(shí)間。因?yàn)樵摮绦蛑饕挥脕?lái)做計(jì)算、邏輯判斷等處理,所以程序的處理速度主要依賴于cpu的計(jì)算速度。此類cpu負(fù)載的程序稱為“計(jì)算密集型程序”。

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

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

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

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

  1. uptime輸出中包含“load average”的數(shù)字  
  2. [root@localhost ~]# uptime  
  3. 11:16:38 up 2:06, 4 users, load average: 0.00, 0.02, 0.05  

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

進(jìn)程調(diào)度

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

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

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

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

  • 等待分配cpu資源的狀態(tài)。
  • 等待磁盤輸入輸出完畢的狀態(tài)。

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

 

下面舉例來(lái)說(shuō)明進(jìn)程狀態(tài)轉(zhuǎn)變:

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

  • 進(jìn)程A:running
  • 進(jìn)程B:running
  • 進(jìn)程C:running

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

  • 進(jìn)程A:running (正在運(yùn)行)
  • 進(jìn)程B:running
  • 進(jìn)程C:running

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

  • 進(jìn)程A:uninterruptible (等待磁盤輸入輸出/不可中斷狀態(tài))
  • 進(jìn)程B:running (正在運(yùn)行)
  • 進(jìn)程C:running

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

  • 進(jìn)程A:uninterruptible (等待磁盤輸入輸出/不可中斷狀態(tài))
  • 進(jìn)程B:interruptible (等待鍵盤輸入輸出/可中斷狀態(tài))
  • 進(jìn)程C:running (正在運(yùn)行)

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

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

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

負(fù)載的意義

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

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

  • 即便需要立即使用CPU,也還需等待其他進(jìn)程用完CPU
  • 即便需要繼續(xù)處理,也必須等待磁盤輸入輸出完成才能進(jìn)行

下面描述一種直觀感受的場(chǎng)景說(shuō)明為什么只有運(yùn)行態(tài)(running)和可中斷狀態(tài)(interruptible)才會(huì)被加入負(fù)載。

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

什么場(chǎng)景會(huì)造成CPU低而負(fù)載確很高呢?

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

  • 等待被授權(quán)予CPU運(yùn)行權(quán)限的進(jìn)程
  • 等待磁盤I/O完成的進(jìn)程

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

場(chǎng)景一:磁盤讀寫請(qǐng)求過(guò)多就會(huì)導(dǎo)致大量I/O等待

上面說(shuō)過(guò),cpu的工作效率要高于磁盤,而進(jìn)程在cpu上面運(yùn)行需要訪問(wèn)磁盤文件,這個(gè)時(shí)候cpu會(huì)向內(nèi)核發(fā)起調(diào)用文件的請(qǐng)求,讓內(nèi)核去磁盤取文件,這個(gè)時(shí)候會(huì)切換到其他進(jìn)程或者空閑,這個(gè)任務(wù)就會(huì)轉(zhuǎn)換為不可中斷睡眠狀態(tài)。當(dāng)這種讀寫請(qǐng)求過(guò)多就會(huì)導(dǎo)致不可中斷睡眠狀態(tài)的進(jìn)程過(guò)多,從而導(dǎo)致負(fù)載高,cpu低的情況。

場(chǎng)景二:MySQL中存在沒(méi)有索引的語(yǔ)句或存在死鎖等情況

我們都知道MySQL的數(shù)據(jù)是存儲(chǔ)在硬盤中,如果需要進(jìn)行sql查詢,需要先把數(shù)據(jù)從磁盤加載到內(nèi)存中。當(dāng)在數(shù)據(jù)特別大的時(shí)候,如果執(zhí)行的sql語(yǔ)句沒(méi)有索引,就會(huì)造成掃描表的行數(shù)過(guò)大導(dǎo)致I/O阻塞,或者是語(yǔ)句中存在死鎖,也會(huì)造成I/O阻塞,從而導(dǎo)致不可中斷睡眠進(jìn)程過(guò)多,導(dǎo)致負(fù)載過(guò)大。

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

場(chǎng)景三:外接硬盤故障,常見(jiàn)有掛了NFS,但是NFS server故障

比如我們的系統(tǒng)掛載了外接硬盤如NFS共享存儲(chǔ),經(jīng)常會(huì)有大量的讀寫請(qǐng)求去訪問(wèn)NFS存儲(chǔ)的文件,如果這個(gè)時(shí)候NFS Server故障,那么就會(huì)導(dǎo)致進(jìn)程讀寫請(qǐng)求一直獲取不到資源,從而進(jìn)程一直是不可中斷狀態(tài),造成負(fù)載很高。

結(jié)束語(yǔ):大概內(nèi)容就是這樣,如果有朋友遇到其他場(chǎng)景,歡迎留言補(bǔ)充。

 

責(zé)任編輯:龐桂玉 來(lái)源: segmentfault
相關(guān)推薦

2019-01-15 15:04:54

CPU電腦使用率

2020-07-08 07:00:00

LinuxCPU應(yīng)用程序

2017-03-23 19:27:55

LinuxCPUCPU利用率

2009-11-16 17:03:20

Oracle優(yōu)化CPU

2022-09-15 08:01:32

CPU使用率異步

2024-04-11 13:27:19

Linuxtop命令

2021-05-31 15:53:57

CPU Top命令

2021-08-10 11:45:57

topCPULinux

2012-07-03 09:57:11

閏秒Linux 服務(wù)器

2012-07-02 16:38:22

Linux服務(wù)器閏秒

2019-01-28 10:23:58

CPU使用率Linux

2022-06-06 10:20:59

CPUCPU 使用率CPU 負(fù)載

2022-07-23 21:31:24

KubernetesLinux開(kāi)源

2014-12-01 13:44:03

cgroupscpulimitlinux

2010-04-27 10:32:54

Oracle優(yōu)化CPU

2021-11-11 16:46:02

CPU使用率 .NET

2021-07-13 12:21:34

PythonRPC通信

2016-10-11 08:33:32

服務(wù)器使用率多線程

2010-04-12 11:21:35

Oracle優(yōu)化CPU

2010-01-18 10:13:08

VB.NET獲取CPU
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)