亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

Linux性能優(yōu)化之CPU

 

說(shuō)明:文章有點(diǎn)長(zhǎng),CPU性能主要觀測(cè)點(diǎn)的理論知識(shí)搬磚堆砌得較多,主要是為了大家對(duì)CPU性能主要觀測(cè)點(diǎn)有深入理解,這樣才能在性能調(diào)優(yōu)和排錯(cuò)的過(guò)程中把握方向,希望你能耐心讀完。當(dāng)然,如果你理論基礎(chǔ)扎實(shí)也可以跳過(guò)。


CPU物理信息

講一個(gè)很久以前的笑話,一個(gè)老板讓員工買(mǎi)幾臺(tái)服務(wù)器準(zhǔn)備玩玩虛擬化,服務(wù)器買(mǎi)回來(lái)之后,安裝VMware時(shí)卻發(fā)現(xiàn)CPU不支持虛擬化,把老板氣的指著那位員工鼻子罵。講這個(gè)笑話的目的是想讓大家知道了解服務(wù)器硬件特性的重要性。同一時(shí)期的市場(chǎng)上,一臺(tái)幾千元的服務(wù)器和一臺(tái)幾萬(wàn)元的服務(wù)器相比較,它們的性能肯定是不一樣的。觀察CPU性能,首先要關(guān)注的是一臺(tái)服務(wù)器上有幾個(gè)物理CPU,每個(gè)物理CPU有幾個(gè)核,每個(gè)核有幾個(gè)線程數(shù)。CPU邏輯核數(shù)通常是衡量服務(wù)器或虛擬機(jī)性能的重要指標(biāo)。

  1. 查看CPU物理匯總信息

執(zhí)行lscpu命令可以查看CPU物理匯總信息,CPU邏輯核數(shù)計(jì)算公式如下:

CPU(s)=Socket(s) X Core(s) per socket X Thread(s) per core

CPU(s): 總的邏輯CPU數(shù)或線程數(shù)

On-line CPU(s) list: 在線的各個(gè)邏輯CPU編號(hào)

Thread(s) per core: CPU每核的線程數(shù)

Core(s) per socket: 每個(gè)物理CPU核數(shù)

Socket(s): 物理CPU占用的槽位數(shù),有幾個(gè)表示有幾顆物理CPU

[root@linuxabc ~]# lscpu

Architecture: x86_64

CPU op-mode(s): 32-bit, 64-bit

Byte Order: Little Endian

CPU(s): 4

On-line CPU(s) list: 0-3

Thread(s) per core: 1

Core(s) per socket: 2

Socket(s): 2

NUMA node(s): 1

Vendor ID: GenuineIntel

CPU family: 6

Model: 61

Model name: Intel(R) Core(TM) i7-5600U CPU @ 2.60GHz

Stepping: 4

CPU MHz: 2593.997

BogoMIPS: 5187.99

Hypervisor vendor: VMware

Virtualization type: full

L1d cache: 32K

L1i cache: 32K

L2 cache: 256K

L3 cache: 4096K

NUMA node0 CPU(s): 0-3

Flags: fpu vme de pse tsc ...

  1. 查看CPU邏輯核數(shù)

判斷服務(wù)器的系統(tǒng)負(fù)載是否正常,需要參考CPU的邏輯核數(shù),不能簡(jiǎn)單地認(rèn)為只要系統(tǒng)負(fù)載的數(shù)值大于1就是系統(tǒng)負(fù)載高。

在線的CPU邏輯核數(shù):

[root@linuxabc ~]# nproc

4

CPU邏輯核數(shù):

[root@linuxabc ~]# nproc --all

4

  1. 查看CPU詳細(xì)信息

下面兩個(gè)命令可以查看CPU的詳細(xì)信息,沒(méi)有把命令執(zhí)行結(jié)果粘貼出來(lái)是因?yàn)槊钶敵鰞?nèi)容太多。dmidecode命令大家肯定不會(huì)陌生,不加任何參數(shù)將會(huì)顯示服務(wù)器的所有硬件信息,我們通常用這個(gè)命令來(lái)查看服務(wù)器的具體型號(hào)和序列號(hào),通過(guò)序列號(hào)可以在服務(wù)器廠家的官網(wǎng)查看是否在保。

[root@linuxabc ~]# cat /proc/cpuinfo

[root@linuxabc ~]# dmidecode -t processor


 

CPU性能主要觀測(cè)點(diǎn)

Linux性能優(yōu)化之CPU

 

運(yùn)行隊(duì)列統(tǒng)計(jì)

一個(gè)進(jìn)程要么是可運(yùn)行的,要么是阻塞的(正在等待一個(gè)事件的完成)。阻塞進(jìn)程可能正在等待I/O設(shè)備的數(shù)據(jù),或者是系統(tǒng)調(diào)用的結(jié)果。如果進(jìn)程是可運(yùn)行的,那就意味著它要和其它也是可運(yùn)行的進(jìn)程競(jìng)爭(zhēng)CPU時(shí)間。一個(gè)可運(yùn)行的進(jìn)程不一定會(huì)使用CPU,但是當(dāng)Linux進(jìn)程調(diào)度器決定下一個(gè)要運(yùn)行的進(jìn)程時(shí),它會(huì)從可運(yùn)行進(jìn)程隊(duì)列中挑選。如果進(jìn)程是可運(yùn)行的,同時(shí)又在等待使用處理器,這些進(jìn)程就構(gòu)成了運(yùn)行隊(duì)列,運(yùn)行隊(duì)列越長(zhǎng),處于等待狀態(tài)的進(jìn)程就越多。

Linux性能優(yōu)化之CPU

 

性能工具通常會(huì)給出可運(yùn)行的進(jìn)程個(gè)數(shù)和等待I/O的阻塞進(jìn)程個(gè)數(shù)。另一種常見(jiàn)的系統(tǒng)統(tǒng)計(jì)是平均負(fù)載,系統(tǒng)的負(fù)載是指正在運(yùn)行的和可運(yùn)行的進(jìn)程總數(shù)。比如,如果正在運(yùn)行的進(jìn)程為1個(gè),而可運(yùn)行的進(jìn)程為2個(gè),那么系統(tǒng)負(fù)載就是3,平均負(fù)載是給定時(shí)間內(nèi)的負(fù)載量。Linux系統(tǒng)取平均負(fù)載時(shí)間為1分鐘,5分鐘和15分鐘。從而觀察到負(fù)載是如何隨時(shí)間變化。

 

上下文切換

Linux性能優(yōu)化之CPU

 

Linux是一個(gè)多任務(wù)操作系統(tǒng),它支持遠(yuǎn)大于CPU數(shù)量的任務(wù)同時(shí)運(yùn)行。當(dāng)然,這些任務(wù)實(shí)際上并不是真的在同時(shí)運(yùn)行,而是因?yàn)橄到y(tǒng)在很短的時(shí)間內(nèi),將CPU輪流分配給它們,造成多任務(wù)同時(shí)運(yùn)行的錯(cuò)覺(jué)。在每個(gè)任務(wù)運(yùn)行前,CPU都需要知道任務(wù)從哪里加載,又從哪里開(kāi)始運(yùn)行,也就是說(shuō)需要系統(tǒng)事先幫它設(shè)置好CPU寄存器和程序計(jì)數(shù)器(Program Counter, PC)。CPU寄存器是CPU內(nèi)置的容量小,但速度極快的內(nèi)存。而程序計(jì)數(shù)器,則是用來(lái)存儲(chǔ)CPU正在執(zhí)行的指令位置,或者即將執(zhí)行的下一條指令位置。它們都是CPU在執(zhí)行任何任務(wù)前必須得依賴環(huán)境,因此也被叫做CPU上下文。而這些保存下來(lái)的上下文,會(huì)存儲(chǔ)在內(nèi)核空間中,并在任務(wù)重新調(diào)度執(zhí)行時(shí)再次加載進(jìn)來(lái)。這樣就能保證任務(wù)原來(lái)的狀態(tài)不受影響,讓任務(wù)看起來(lái)還是連續(xù)運(yùn)行。

根據(jù)任務(wù)的不同,CPU的上下文切換可以可分為三種不同的場(chǎng)景:

(1)進(jìn)程上下文切換

Linux系統(tǒng)按照特權(quán)等級(jí),把進(jìn)程的運(yùn)行空間分為內(nèi)核空間和用戶空間,如下圖所示:

內(nèi)核空間(Ring 0)具有最高權(quán)限,可以直接訪問(wèn)所有資源。

用戶空間(Ring 3)只能訪問(wèn)受限資源,不能直接訪問(wèn)內(nèi)存等硬件設(shè)備,必須通過(guò)系統(tǒng)調(diào)用訪問(wèn)內(nèi)核空間,才能訪問(wèn)這些特權(quán)資源。

Linux性能優(yōu)化之CPU

 

換個(gè)角度看,也就是說(shuō),進(jìn)程既可以在用戶空間運(yùn)行,又可以在內(nèi)核空間中運(yùn)行。進(jìn)程在用戶空間運(yùn)行時(shí),被稱(chēng)為進(jìn)程的用戶態(tài),而陷入到內(nèi)核空間的時(shí)候,被稱(chēng)為進(jìn)程的內(nèi)核態(tài)。

從用戶態(tài)到內(nèi)核態(tài)的轉(zhuǎn)變,需要通過(guò)系統(tǒng)調(diào)用來(lái)完成。比如,當(dāng)我們查看文件內(nèi)容時(shí),就需要多次系統(tǒng)調(diào)用來(lái)完成:首先調(diào)用 open() 打開(kāi)文件,然后調(diào)用 read() 讀取文件內(nèi)容,并調(diào)用 write() 將內(nèi)容寫(xiě)到標(biāo)準(zhǔn)輸出,最后再調(diào)用 close() 關(guān)閉文件。

系統(tǒng)調(diào)用的過(guò)程有沒(méi)有發(fā)生CPU上下文的切換呢?答案自然是肯定的。

CPU寄存器里原來(lái)用戶態(tài)的指令位置,需要先保存起來(lái)。接著,為了執(zhí)行內(nèi)核態(tài)代碼,CPU寄存器需要更新為內(nèi)核態(tài)指令的新位置。最后才是跳轉(zhuǎn)到內(nèi)核態(tài)運(yùn)行內(nèi)核任務(wù)。而系統(tǒng)調(diào)用結(jié)束后,CPU寄存器需要恢復(fù)原來(lái)用戶保存的狀態(tài),然后再切換到用戶空間,繼續(xù)運(yùn)行進(jìn)程。所以,一次系統(tǒng)調(diào)用的過(guò)程,其實(shí)是發(fā)生了兩次CPU 上下文切換。不過(guò),需要注意的是,系統(tǒng)調(diào)用過(guò)程中,并不會(huì)涉及到虛擬內(nèi)存等進(jìn)程用戶態(tài)的資源,也不會(huì)切換進(jìn)程。這跟我們通常所說(shuō)的進(jìn)程上下文切換是不一樣的。

進(jìn)程上下文切換,是指從一個(gè)進(jìn)程切換到另一個(gè)進(jìn)程運(yùn)行,而系統(tǒng)調(diào)用過(guò)程中一直是在同一個(gè)進(jìn)程中在運(yùn)行。所以,系統(tǒng)調(diào)用過(guò)程通常稱(chēng)為特權(quán)模式切換,而不是上下文切換。但實(shí)際上,系統(tǒng)調(diào)用過(guò)程中,CPU 的上下文切換還是無(wú)法避免的。那么,進(jìn)程上下文切換跟系統(tǒng)調(diào)用又有什么區(qū)別呢?

進(jìn)程是由內(nèi)核來(lái)管理和調(diào)度的,進(jìn)程的切換只能發(fā)生在內(nèi)核態(tài)。所以進(jìn)程的上下文不僅包括了虛擬內(nèi)存、棧、全局變量等用戶空間的資源,還包括了內(nèi)核堆棧、寄存器等內(nèi)核空間的狀態(tài)。因此,進(jìn)程的上下文切換就比系統(tǒng)調(diào)用時(shí)多了一步,在保存當(dāng)前進(jìn)程的內(nèi)核狀態(tài)和CPU寄存器之前,需要先把該進(jìn)程的虛擬內(nèi)存、棧等保存下來(lái),而加載了下一進(jìn)程的內(nèi)核態(tài)后,還需要刷新進(jìn)程的虛擬內(nèi)存和用戶棧。

如下圖所示,保存上下文和恢復(fù)上下文的過(guò)程并不是“免費(fèi)”的,需要內(nèi)核在CPU 上運(yùn)行才能完成。

Linux性能優(yōu)化之CPU

 

根據(jù)測(cè)試報(bào)告,每次上下文切換都需要幾十納秒到數(shù)微秒的CPU時(shí)間。這個(gè)時(shí)間還是相當(dāng)可觀的,特別是在進(jìn)程上下文切換次數(shù)較多的情況下,很容易導(dǎo)致CPU將大量時(shí)間耗費(fèi)在寄存器、內(nèi)核棧以及虛擬內(nèi)存等資源的保存和恢復(fù)上,進(jìn)而大大縮短了真正進(jìn)程運(yùn)行的時(shí)間。這也是導(dǎo)致平均負(fù)載升高的一個(gè)重要因素。在什么時(shí)候進(jìn)程上下文會(huì)進(jìn)行切換呢?

進(jìn)程切換時(shí)(或者說(shuō)進(jìn)程調(diào)度時(shí))才需要切換上下文,系統(tǒng)為每個(gè)CPU都維護(hù)了一個(gè)就緒隊(duì)列,將活躍進(jìn)程(即正在運(yùn)行和正在等待CPU的進(jìn)程)按照優(yōu)先級(jí)和等待CPU的時(shí)間排序,然后選擇最需要CPU的進(jìn)程,也就是優(yōu)先級(jí)最高和等待CPU時(shí)間最長(zhǎng)的進(jìn)程來(lái)運(yùn)行。

進(jìn)程在什么時(shí)候才會(huì)被調(diào)度到CPU上運(yùn)行呢?最容易想到的一個(gè)時(shí)機(jī),就是當(dāng)進(jìn)程執(zhí)行完終止了,它之前使用的CPU會(huì)釋放出來(lái),這個(gè)時(shí)候再?gòu)木途w隊(duì)列里,取一個(gè)新的進(jìn)程過(guò)來(lái)運(yùn)行。其實(shí)還有很多其它場(chǎng)景,也會(huì)觸發(fā)進(jìn)程調(diào)度。

場(chǎng)景一,為了保證所有進(jìn)程可以得到公平調(diào)度,CPU時(shí)間被劃分為一段段的時(shí)間片,這些時(shí)間片再被輪流分配給各個(gè)進(jìn)程。這樣,當(dāng)某個(gè)進(jìn)程的時(shí)間片耗盡了,就會(huì)被系統(tǒng)掛起,切換到其它正在等待CPU的進(jìn)程運(yùn)行。

場(chǎng)景二,進(jìn)程在系統(tǒng)資源不足,比如內(nèi)存不足時(shí),要等到資源滿足后才可以運(yùn)行,這個(gè)時(shí)候進(jìn)程也會(huì)被掛起,并由系統(tǒng)調(diào)度其他進(jìn)程運(yùn)行。

場(chǎng)景三,當(dāng)進(jìn)程通過(guò)睡眠函數(shù)sleep這樣的方法將自己主動(dòng)掛起時(shí),自然也會(huì)重新調(diào)度。

場(chǎng)景四,當(dāng)有優(yōu)先級(jí)更高的進(jìn)程運(yùn)行時(shí),為了保證高優(yōu)先級(jí)進(jìn)程的運(yùn)行,當(dāng)前進(jìn)程會(huì)被掛起,由高優(yōu)先級(jí)進(jìn)程來(lái)運(yùn)行。

最后一個(gè),發(fā)生硬件中斷時(shí),CPU上的進(jìn)程會(huì)被中斷掛起,轉(zhuǎn)而執(zhí)行內(nèi)核中的中斷服務(wù)程序。

了解這幾個(gè)場(chǎng)景是非常有必要的,因?yàn)橐坏┏霈F(xiàn)上下文切換的性能問(wèn)題,它們就是幕后兇手。

(2)線程上下文切換

線程與進(jìn)程最大的區(qū)別在于線程是調(diào)度的基本單位,而進(jìn)程則是資源擁有的基本單位。所謂內(nèi)核中的任務(wù)調(diào)度,實(shí)際上的調(diào)度對(duì)象是線程,而進(jìn)程只是給線程提供了虛擬內(nèi)存、全局變量等資源。所以對(duì)于線程和進(jìn)程,我們可以這么理解:

當(dāng)進(jìn)程只有一個(gè)線程時(shí),可以認(rèn)為進(jìn)程就等于線程。

當(dāng)進(jìn)程擁有多個(gè)線程時(shí),這些線程會(huì)共享相同的虛擬內(nèi)存和全局變量等資源。這些資源在上下文切換時(shí)是不需要修改的。

另外,線程也有自己的私有數(shù)據(jù),比如棧和寄存器等,這些在上下文切換時(shí)也是需要保存的。

線程的上下文切換可以分為兩種情況:

情況一, 前后兩個(gè)線程屬于不同進(jìn)程。此時(shí),因?yàn)橘Y源不共享,所以切換過(guò)程就跟進(jìn)程上下文切換是一樣。

情況二,前后兩個(gè)線程屬于同一個(gè)進(jìn)程。此時(shí),因?yàn)樘摂M內(nèi)存是共享的,所以在切換時(shí),虛擬內(nèi)存這些資源就保持不動(dòng),只需要切換線程的私有數(shù)據(jù)、寄存器等不共享的數(shù)據(jù)。

同為上下文切換,但同進(jìn)程內(nèi)的線程切換,要比多進(jìn)程間的切換消耗更少的資源,這正是多線程代替多進(jìn)程的優(yōu)勢(shì)之一。

(3)中斷上下文切換

為了快速響應(yīng)硬件的事件,中斷處理會(huì)打斷進(jìn)程的正常調(diào)度和執(zhí)行,轉(zhuǎn)而調(diào)用中斷處理程序,響應(yīng)設(shè)備事件。而在打斷其他進(jìn)程時(shí),就需要將進(jìn)程當(dāng)前的狀態(tài)保存下來(lái),這樣在中斷結(jié)束后,進(jìn)程仍然可以從原來(lái)的狀態(tài)恢復(fù)運(yùn)行。

對(duì)同一個(gè)CPU來(lái)說(shuō),中斷處理比進(jìn)程擁有更高的優(yōu)先級(jí),所以中斷上下文切換并不會(huì)與進(jìn)程上下文切換同時(shí)發(fā)生。同樣道理,由于中斷會(huì)打斷正常進(jìn)程的調(diào)度和執(zhí)行,所以大部分中斷處理程序都短小精悍,以便盡可能快地執(zhí)行結(jié)束。

另外,跟進(jìn)程上下文切換一樣,中斷上下文切換也需要消耗CPU,切換次數(shù)過(guò)多也會(huì)耗費(fèi)大量的CPU,甚至嚴(yán)重降低系統(tǒng)的整體性能。所以,當(dāng)你發(fā)現(xiàn)中斷次數(shù)過(guò)多時(shí),就需要注意去排查它是否會(huì)給你的系統(tǒng)帶來(lái)嚴(yán)重的性能問(wèn)題。

為了保證公平地給每個(gè)進(jìn)程分配處理器時(shí)間,內(nèi)核周期性地中斷正在運(yùn)行的進(jìn)程,在適當(dāng)?shù)那闆r下,內(nèi)核調(diào)度器會(huì)決定開(kāi)始另一個(gè)進(jìn)程,而不是讓當(dāng)前進(jìn)程繼續(xù)執(zhí)行。每次這種周期性中斷或決定發(fā)生時(shí),系統(tǒng)都可能進(jìn)行上下文切換。每秒定時(shí)中斷的次數(shù)和物理架構(gòu)和內(nèi)核版本有關(guān)。一個(gè)檢查中斷頻率的簡(jiǎn)單方法是查看/proc/interrupts文件,它可以確定已知時(shí)長(zhǎng)內(nèi)發(fā)生的中斷次數(shù)。

 

中斷

中斷是指由于CPU接收到外圍硬件(相對(duì)于CPU與內(nèi)存而言)的異步信號(hào)或者來(lái)自軟件的同步信號(hào)而進(jìn)行相應(yīng)的硬/軟件處理。

Linux性能優(yōu)化之CPU

 

硬中斷:外圍硬件發(fā)給CPU或者內(nèi)存的異步信號(hào)就是硬中斷信號(hào)。簡(jiǎn)言之,外設(shè)對(duì)CPU的中斷。

軟中斷:由軟件本身發(fā)給操作系統(tǒng)內(nèi)核的中斷信號(hào),稱(chēng)之為軟中斷。通常是由硬中斷處理程序或進(jìn)程調(diào)度程序?qū)Σ僮飨到y(tǒng)內(nèi)核的中斷,也就是我們常說(shuō)的系統(tǒng)調(diào)用。

硬中斷與軟中斷之區(qū)別與聯(lián)系:

硬中斷是有外設(shè)硬件發(fā)出的,需要有中斷控制器參與。其過(guò)程是外設(shè)偵測(cè)到變化,告知中斷控制器,中斷控制器通過(guò)CPU或內(nèi)存的中斷腳通知CPU,然后硬件進(jìn)行程序計(jì)數(shù)器及堆棧寄存器之現(xiàn)場(chǎng)保存工作,這會(huì)引發(fā)上下文切換,并根據(jù)中斷向量調(diào)用硬中斷處理程序進(jìn)行中斷處理。

軟中斷則通常是由硬中斷處理程序或者進(jìn)程調(diào)度程序等軟件程序發(fā)出的中斷信號(hào),無(wú)需中斷控制器參與,直接以一個(gè)CPU指令形式指示CPU進(jìn)行程序計(jì)數(shù)器及堆棧寄存器現(xiàn)場(chǎng)保存工作,這會(huì)引發(fā)上下文切換,并調(diào)用相應(yīng)的軟中斷處理程序進(jìn)行中斷處理,即我們通常所言之系統(tǒng)調(diào)用。

硬中斷直接以硬件的方式引發(fā),處理速度快。軟中斷以軟件指令之方式適合于對(duì)響應(yīng)速度要求不是特別嚴(yán)格的場(chǎng)景。

硬中斷通過(guò)設(shè)置CPU的屏蔽位可進(jìn)行屏蔽,軟中斷則由于是指令方式給出,不能屏蔽。

硬中斷發(fā)生后,通常會(huì)在硬中斷處理程序中調(diào)用一個(gè)軟中斷來(lái)進(jìn)行后續(xù)工作的處理。

硬中斷和軟中斷均會(huì)引起上下文切換(進(jìn)程/線程之切換),進(jìn)程切換的過(guò)程是差不多的。

CPU周期性地從硬件設(shè)備接收中斷,當(dāng)設(shè)備有事件需要內(nèi)核處理時(shí),就會(huì)觸發(fā)中斷。比如,如果磁盤(pán)控制器剛剛完成從驅(qū)動(dòng)器取數(shù)據(jù)塊的操作,并準(zhǔn)備好提供給內(nèi)核,那么磁盤(pán)控制器就會(huì)觸發(fā)一個(gè)硬中斷。對(duì)內(nèi)核收到的每個(gè)中斷,如果已經(jīng)有響應(yīng)的已注冊(cè)的中斷處理程序,就運(yùn)行該程序,否則忽略這個(gè)中斷。這些中斷處理程序在系統(tǒng)中具有很高的運(yùn)行優(yōu)先級(jí),并且通常執(zhí)行速度也很快。有時(shí),中斷處理程序有工作要做,但是又不需要高優(yōu)先級(jí),因此它可以啟動(dòng)軟中斷處理程序。如果有很多中斷,內(nèi)核會(huì)花大量的事件服務(wù)這些中斷。查看/proc/interrupts文件可以顯示出哪些CPU上觸發(fā)了哪些中斷。

 

CPU使用率

Linux性能優(yōu)化之CPU

 

CPU使用率是個(gè)簡(jiǎn)單的概念,在任何給定的時(shí)間,CPU可以執(zhí)行以下八件事情中的一個(gè):

CPU可以是空閑的,這意味著處理器實(shí)際上沒(méi)有做任何工作,并且等待有任務(wù)可執(zhí)行。

CPU可以運(yùn)行用戶代碼,即指定的“用戶”時(shí)間。

CPU可以執(zhí)行Linux內(nèi)核中的應(yīng)用程序代碼,這就是“系統(tǒng)”時(shí)間。

CPU可以執(zhí)行”比較友好“的或者優(yōu)先級(jí)被設(shè)置為低于一般進(jìn)程的用戶代碼。

CPU可以處于I/O等待狀態(tài),即系統(tǒng)正在等待I/O(如磁盤(pán)或網(wǎng)絡(luò))完成。

CPU可以處于irq狀態(tài),即它正在用高優(yōu)先級(jí)代碼處理硬件中斷。

CPU可以處于軟irq模式,即系統(tǒng)正在執(zhí)行同樣由中斷觸發(fā)的內(nèi)核代碼,只不過(guò)其運(yùn)行于較低優(yōu)先級(jí)(下半部代碼)。此情景出現(xiàn)的條件為:發(fā)生設(shè)備中斷時(shí),而內(nèi)核在將其移交給用戶空間之前必須對(duì)其進(jìn)行一些處理(比如,處理網(wǎng)絡(luò)包)。

管理程序(hypervisor)為另一個(gè)虛擬進(jìn)程提供服務(wù)而等待虛擬 CPU 的百分比。

大多數(shù)性能工具將這些數(shù)值表示為占CPU總時(shí)間的百分比,這些時(shí)間的范圍從0%到100%,但全部加起來(lái)等于100%。一個(gè)具有高“系統(tǒng)”百分百的系統(tǒng)表明其大部分時(shí)間都消耗在了內(nèi)核上。像oprofile一樣的工具可以幫助確定時(shí)間都消耗在了哪里。具有高“用戶”時(shí)間的系統(tǒng)則將其大部分時(shí)間都用來(lái)運(yùn)行應(yīng)用程序。如果系統(tǒng)在應(yīng)該工作的時(shí)候花費(fèi)了大量的時(shí)間處于iowait狀態(tài),那它很可能在等待來(lái)自設(shè)備的I/O,導(dǎo)致速度變慢的原因可能是磁盤(pán),網(wǎng)卡或其它設(shè)備。


CPU性能工具

Linux性能優(yōu)化之CPU

 

選擇使用系統(tǒng)性能工具時(shí),通常會(huì)使用系統(tǒng)已經(jīng)默認(rèn)安裝的工具,使用性能工具通常要注意以下幾個(gè)方面:

第一:所選擇的工具最好已經(jīng)安裝好。在管理比較規(guī)范的企業(yè)中,在產(chǎn)品環(huán)境對(duì)服務(wù)器的任何人為變動(dòng)都是要計(jì)劃一個(gè)時(shí)間窗口,準(zhǔn)備好變動(dòng)的步驟,并獲得上級(jí)的批準(zhǔn),安裝性能工具也不例外。

第二:所選擇的工具占用系統(tǒng)開(kāi)銷(xiāo)要小。通常來(lái)說(shuō)系統(tǒng)默認(rèn)安裝的性能工具所占用的系統(tǒng)開(kāi)銷(xiāo)都是比較小的,如果你使用了一個(gè)新的性能工具,一定要事先測(cè)試這個(gè)工具在運(yùn)行時(shí)占用的系統(tǒng)資源開(kāi)銷(xiāo)情況,否則在產(chǎn)品環(huán)境使用,可能會(huì)因?yàn)檫@個(gè)工具占用的系統(tǒng)開(kāi)銷(xiāo)較大而導(dǎo)致系統(tǒng)資源更加緊張。

第三:對(duì)所選擇的工具要非常熟悉。這樣才能更好地分析系統(tǒng)性能,把工具的作用發(fā)揮到極致。

下面介紹的有些工具不僅僅可以觀察CPU性能,有的還可以觀察內(nèi)存和磁盤(pán)I/O,本篇文章側(cè)重點(diǎn)在CPU性能分析:

 

top(系統(tǒng)性能匯總)

top命令是查看系統(tǒng)性能時(shí)最常用的系統(tǒng)性能工具,它實(shí)時(shí)地顯示當(dāng)前系統(tǒng)性能匯總信息。從cpu性能來(lái)講,top命令可以觀察到以下幾點(diǎn):

第一:系統(tǒng)平均負(fù)載(Load Average)

通過(guò)觀察系統(tǒng)負(fù)載(1分鐘/5分鐘/15分鐘)的平均值,可以判斷系統(tǒng)負(fù)載是否正常,經(jīng)過(guò)一定的時(shí)間觀察之后,通過(guò)對(duì)比它們?nèi)齻€(gè)的平均值,可以大致判斷系統(tǒng)負(fù)載的趨勢(shì)。

第二:CPU使用率。

CPU使用率計(jì)算公式如下:

us+sy+ni+id+wa+hi+si+st=100%

us:用戶態(tài)使用的cpu時(shí)間的百分比

sy:系統(tǒng)態(tài)使用的cpu時(shí)間的百分比

ni:用于nice操作,所占用 CPU 總時(shí)間的百分比

id:空閑的cpu時(shí)間比

wa:cpu等待磁盤(pán)寫(xiě)入完成時(shí)間

hi:硬中斷消耗時(shí)間

si:軟中斷消耗時(shí)間

st:虛擬機(jī)偷取時(shí)間

通過(guò)觀察上面各個(gè)選項(xiàng)的百分比,可以給我們指出排查CPU性能瓶頸問(wèn)題的大致方向。如果wa比較高,通常意味著磁盤(pán)的讀寫(xiě)性能問(wèn)題。如果hi比較高,可能與系統(tǒng)硬中斷有關(guān),如果us比較高,應(yīng)該是用戶程序?qū)е翪PU性能問(wèn)題。

系統(tǒng)負(fù)載和CPU使用率沒(méi)有直接關(guān)系,系統(tǒng)負(fù)載高不一定CPU使用率高,反之,CPU使用率高不一定系統(tǒng)負(fù)載高。系統(tǒng)負(fù)載和進(jìn)程運(yùn)行隊(duì)列相關(guān),它是正在運(yùn)行的和可運(yùn)行的進(jìn)程總數(shù);CPU使用率是程序在運(yùn)行期間實(shí)時(shí)占用CPU百分比。

系統(tǒng)負(fù)載理想值:在長(zhǎng)期的生成實(shí)踐中,大家以CPU的總邏輯核數(shù)(或線程數(shù))和系統(tǒng)負(fù)載大小進(jìn)行對(duì)比作為判斷系統(tǒng)負(fù)載是否正常的依據(jù),比如,一臺(tái)服務(wù)器有4個(gè)邏輯核,如果系統(tǒng)負(fù)載小于4,通常情況下我們認(rèn)為系統(tǒng)負(fù)載是正常的;如果系統(tǒng)負(fù)載大于4,系統(tǒng)可能存在潛在的性能問(wèn)題。

CPU使用率理想值:如果CPU使用率長(zhǎng)時(shí)間處在60% ~ 80%以上,通常可能存在系統(tǒng)性能瓶頸問(wèn)題。在生產(chǎn)環(huán)境,可能由于業(yè)務(wù)流量的原因在某個(gè)時(shí)間段CPU使用率會(huì)升高,如果從監(jiān)控系統(tǒng)發(fā)現(xiàn)峰值一直存在,且超過(guò)80%,就要考慮擴(kuò)容了。

第三:占用CPU資源最高的進(jìn)程。

當(dāng)CPU使用率或平均負(fù)載達(dá)到警戒線而觸發(fā)告警之后,系統(tǒng)管理員通常首先要做的是查找CPU使用率最高的進(jìn)程,如果它是系統(tǒng)進(jìn)程,可能就需要重啟這個(gè)進(jìn)程或進(jìn)一步排查根本原因。如果是應(yīng)用進(jìn)程,就需要及時(shí)聯(lián)系業(yè)務(wù)運(yùn)維人員檢查,在生產(chǎn)實(shí)踐中,我們有時(shí)發(fā)現(xiàn)系統(tǒng)審計(jì)守護(hù)進(jìn)程(auditd)和發(fā)送郵件守護(hù)進(jìn)程(sendmail&postfix)運(yùn)行異常導(dǎo)致系統(tǒng)負(fù)載較高,重啟之后問(wèn)題解決。

第四:占用CPU最高的線程。

當(dāng)需要查看某個(gè)進(jìn)程的每個(gè)線程的CPU使用率時(shí),意味著需要更深層次地調(diào)查根本原因,通常是程序代碼級(jí)別的原因。在給開(kāi)發(fā)部門(mén)發(fā)郵件之前,我們需要提供充分的證據(jù)表明這是應(yīng)用代碼級(jí)別的問(wèn)題。

top命令選項(xiàng)

-H 表示以線程方式顯示

-p process ID 查看某個(gè)進(jìn)程占用的系統(tǒng)資源狀況,參數(shù)后面跟的時(shí)進(jìn)程號(hào)

-u username 查看某個(gè)用戶占用的系統(tǒng)資源狀況,參數(shù)后面跟的時(shí)用戶名

-i 不顯示未使用任何CPU的進(jìn)程

-d delay 統(tǒng)計(jì)數(shù)據(jù)更新的時(shí)間間隔

-n interations 退出前的迭代次數(shù)。

用法示例

示例一:top命令默認(rèn)輸出。

從top命令的默認(rèn)輸出結(jié)果,我們可以看到系統(tǒng)負(fù)載,CPU使用率和占用CPU最多的進(jìn)程。

[root@linuxabc ~]# top

Linux性能優(yōu)化之CPU

 

示例二:查看占用CPU最多的線程。

通過(guò)top命令的默認(rèn)輸出,我們可以找到占用CPU最多的進(jìn)程,然后根據(jù)下面的命令查看某個(gè)進(jìn)程中占用CPU最多的線程,下面的命令輸出僅僅是命令示例,其實(shí)這個(gè)進(jìn)程的線程本身占用CPU很低。

[root@linuxabc ~]# top -Hp 1351

Linux性能優(yōu)化之CPU

 


mpstat(多處理器統(tǒng)計(jì))

mpstat命令比較簡(jiǎn)單,它展示了隨著時(shí)間變化的CPU使用率,如果你有多個(gè)CPU,mpstat還能夠把CPU使用率按處理器進(jìn)行區(qū)分,因此你可以發(fā)現(xiàn)與其它處理器對(duì)比,是否某個(gè)處理器的CPU使用率比較高,你也可以選擇想要監(jiān)控的單個(gè)CPU,也可以對(duì)所有的CPU進(jìn)行監(jiān)控。

運(yùn)行mpstat命令可以幫助觀察是否所有的CPU使用率是均勻的,如果只有其中一個(gè)CPU使用率比較高,通常意味著這是一個(gè)問(wèn)題,我們需要進(jìn)一步調(diào)查是那個(gè)進(jìn)程或線程引起的。通過(guò)mpstat命令的各個(gè)選項(xiàng)輸出,可以幫助我們確定排查的方向。

mpstat命令格式:

mpstat [-P { cpu | ALL ] [ delay { count } ]

命令選項(xiàng) -P 可以指定對(duì)某個(gè)或全部CPU進(jìn)行監(jiān)控

dely指定了采樣間隔

count指定了采樣次數(shù)

mpstat性能統(tǒng)計(jì)信息:

cpu:處理器編號(hào)。關(guān)鍵字all表示統(tǒng)計(jì)數(shù)據(jù)是作為所有處理器之間的平均值計(jì)算的

%user:在用戶級(jí)別(應(yīng)用程序)執(zhí)行時(shí)發(fā)生的CPU使用率百分比

%nice:顯示在用戶級(jí)別,用于nice操作,所占用 CPU 總時(shí)間的百分比

%system:在系統(tǒng)級(jí)(內(nèi)核)執(zhí)行時(shí)發(fā)生的CPU使用率百分比。請(qǐng)注意這不包括硬件和軟件中斷所花費(fèi)的時(shí)間

%iowait:CPU等待I/O所花費(fèi)的時(shí)間百分比

%irq:CPU處理硬件中斷所花費(fèi)的時(shí)間百分比

%softirq:CPU因軟件中斷服務(wù)所花費(fèi)的時(shí)間百分比

%steal:管理程序(hypervisor)為另一個(gè)虛擬進(jìn)程提供服務(wù)而等待虛擬 CPU 的百分比

%guest:CPU運(yùn)行虛擬處理器所花費(fèi)的時(shí)間百分比

%gnice:CPU運(yùn)行“niced guest”所花費(fèi)的時(shí)間百分比

%idle:CPU空閑且系統(tǒng)沒(méi)有磁盤(pán)I/O請(qǐng)求的時(shí)間百分比

用法示例

示例一:顯示每隔1秒鐘刷新3次的所有CPU性能統(tǒng)計(jì)信息。

[root@linuxabc ~]# mpstat -P ALL 1 3

Linux性能優(yōu)化之CPU

 

示例二:顯示每隔1秒鐘刷新5次的CPU編號(hào)為0的性能統(tǒng)計(jì)信息。

[root@linuxabc ~]# mpstat -P 0 1 5

Linux性能優(yōu)化之CPU

 


vmstat(虛擬內(nèi)存統(tǒng)計(jì))

vmstat提供了一個(gè)低開(kāi)銷(xiāo)的良好系統(tǒng)性能視圖。是在系統(tǒng)負(fù)載非常高的服務(wù)器上觀察系統(tǒng)性能的好工具。vmstat有兩種運(yùn)行模式,分別是采樣模式和平均模式,如果不指定參數(shù),則vmstat統(tǒng)計(jì)工作于平均模式,vmstat顯示從系統(tǒng)啟動(dòng)以來(lái)所有統(tǒng)計(jì)數(shù)據(jù)的均值。如果指定了延遲,第一個(gè)采樣仍然是系統(tǒng)啟動(dòng)以來(lái)的均值,之后vmstat按延遲秒數(shù)采樣系統(tǒng)并顯示系統(tǒng)統(tǒng)計(jì)信息。

vmstat指的是虛擬內(nèi)存統(tǒng)計(jì),但它不僅能統(tǒng)計(jì)系統(tǒng)的虛擬內(nèi)存性能信息,還能獲取整個(gè)系統(tǒng)性能的總體信息,與CPU相關(guān)的包括:

正在運(yùn)行的進(jìn)程個(gè)數(shù)

CPU的使用情況

CPU接收中斷次數(shù)

調(diào)度器執(zhí)行的上下文切換次數(shù)

vmstat命令格式:

vmstat [ -n [ -s ] [ delay [ count ] ]

命令選項(xiàng):

-n 默認(rèn)情況下,vmstat定期顯示每個(gè)性能統(tǒng)計(jì)數(shù)據(jù)的列標(biāo)題。本選項(xiàng)禁止該特性,因此初始列標(biāo)題之后,只顯示性能數(shù)據(jù)。

-s 本選項(xiàng)一次性輸出vmstat收集的系統(tǒng)統(tǒng)計(jì)的詳細(xì)信息。該信息為系統(tǒng)啟動(dòng)后的總數(shù)據(jù)

delay 延遲秒數(shù),采樣的間隔時(shí)間

count 采樣次數(shù)

CPU性能統(tǒng)計(jì)信息:

vmstat命令提供的各種統(tǒng)計(jì)輸出信息,讓我們能跟蹤系統(tǒng)性能的不同方面,在這里只解釋用CPU性能相關(guān)的輸出。

r: 當(dāng)前可運(yùn)行的進(jìn)程數(shù)。這些進(jìn)程沒(méi)有等待I/O,而是已經(jīng)準(zhǔn)備好運(yùn)行。理想狀態(tài)下,可運(yùn)行的進(jìn)程數(shù)應(yīng)與可用CPU的數(shù)量相等。

b:等待I/O完成的被阻塞進(jìn)程數(shù)。

forks:創(chuàng)建新進(jìn)程的次數(shù)。

in: 系統(tǒng)發(fā)生中斷的次數(shù)。

cs: 系統(tǒng)發(fā)生上下文切換的次數(shù)。

us: 用戶進(jìn)程消耗的總CPU時(shí)間的百分比(包括“nice"時(shí)間)

sy: 系統(tǒng)代碼消耗的總CPU時(shí)間的百分比,其中包括消耗在系統(tǒng),硬中斷和軟中斷的時(shí)間。

wa: 等待I/O消耗的總CPU時(shí)間的百分比

id:系統(tǒng)空閑時(shí)間的總cpu時(shí)間的百分比

用法示例

示例一:vmstat默認(rèn)輸出。

如果vmstat運(yùn)行時(shí)沒(méi)有使用命令行參數(shù),顯示的將是自系統(tǒng)啟動(dòng)后它記錄下的統(tǒng)計(jì)信息的均值。通過(guò)觀察"CPU“列下面的us,sy,sa和id對(duì)應(yīng)的值,可以判斷CPU的工作狀態(tài),下面的示例告訴我們CPU基本處于空閑狀態(tài)。

[root@linuxabc ~]# vmstat

Linux性能優(yōu)化之CPU

 

示例二:vmstat工作于采樣模式。

vmstat是一個(gè)記錄系統(tǒng)在一定負(fù)載或測(cè)試條件下行為的好工具,這樣就能夠用于查看系統(tǒng)對(duì)負(fù)載和各種系統(tǒng)事件是如何反應(yīng)的。在下面的例子中,在in列和cs列能分別看到中斷和上線文切換的次數(shù)。上下文切換的數(shù)量小于中斷的數(shù)量。調(diào)度器切換進(jìn)程的次數(shù)少于定時(shí)器中斷觸發(fā)的次數(shù)。這很可能是因?yàn)橄到y(tǒng)級(jí)別上是空閑的,在定時(shí)器中斷觸發(fā)的大多數(shù)時(shí)候,調(diào)度器沒(méi)有任何工作要做,因此它不需要從空閑進(jìn)程切換出去。

[root@linuxabc ~]# vmstat 1 10

Linux性能優(yōu)化之CPU

 

示例三:一次性輸出vmstat收集的系統(tǒng)統(tǒng)計(jì)的詳細(xì)信息。

在下面的vmstat命令輸出中,我們可以看到有一組和”CPU ticks“相關(guān)的統(tǒng)計(jì)數(shù)據(jù),它顯示了全部的CPU ticks的分布情況。”CPU ticks"顯示的是自系統(tǒng)啟動(dòng)的cpu時(shí)間,這里的“tick"是一個(gè)時(shí)間單位。另外,我們還可以看到中斷和上下文切換的總數(shù),forks也值得我們注意,它表示的是從系統(tǒng)啟動(dòng)開(kāi)始,已經(jīng)創(chuàng)建的新進(jìn)程的數(shù)量。

[root@linuxabc ~]# vmstat -s

Linux性能優(yōu)化之CPU

 


sar(系統(tǒng)活動(dòng)報(bào)告

sar使用低開(kāi)銷(xiāo)的,記錄系統(tǒng)執(zhí)行情況信息的方法,r將收集到的系統(tǒng)性能數(shù)據(jù)記錄到二進(jìn)制文件。sar既可以顯示當(dāng)前系統(tǒng)的實(shí)時(shí)信息,也可以回訪之前收集的歷史信息。

sar能把不同類(lèi)型的時(shí)間戳系統(tǒng)數(shù)據(jù)保存到日志文件,以便日后檢索和審查。當(dāng)試圖找出特定服務(wù)器在特定時(shí)間出現(xiàn)故障的原因時(shí),這個(gè)特性是sar最大的亮點(diǎn)。

sar命令格式:

sar [ options ] [ delay [ mount ] ]

命令選項(xiàng):

-P { cpu | ALL }

-q 報(bào)告機(jī)器的運(yùn)行隊(duì)列長(zhǎng)度和平均負(fù)載

-u 報(bào)告系統(tǒng)的CPU使用情況(該項(xiàng)為默認(rèn)輸出)

-w 報(bào)告系統(tǒng)發(fā)生的上下文切換次數(shù)

-o filename 指定保存性能統(tǒng)計(jì)信息的二進(jìn)制輸出文件名

-f filename 從指定性能統(tǒng)計(jì)信息的文件名讀取信息

delay 需要等待的采樣間隔時(shí)間

count 記錄的樣本總數(shù)

CPU性能統(tǒng)計(jì)信息:

CPU: all表示所有CPU

%user:顯示在用戶級(jí)別(Application)運(yùn)行使用CPU總時(shí)間的百分比

%nice: 顯示在用戶級(jí)別,用于nice操作,所占用CPU總時(shí)間的百分比

%system:在核心級(jí)別(kernel)運(yùn)行所使用CPU總時(shí)間的百分比

%iowait:顯示用于等待I/O操作占用CPU總時(shí)間的百分比

%steal: 管理程序(hypervisor)為另一個(gè)虛擬進(jìn)程提供服務(wù)而等待虛擬CPU的百分比

%idle: 顯示 CPU 空閑時(shí)間占用CPU總時(shí)間的百分比

用法示例

示例一:sar命令默認(rèn)輸出歷史的CPU性能統(tǒng)計(jì)信息。

[root@linuxabc ~]# sar

Linux性能優(yōu)化之CPU

 

示例二:每隔1秒進(jìn)行10次實(shí)時(shí)CPU性能采樣。

[root@linuxabc ~]# sar 1 10

Linux性能優(yōu)化之CPU

 

示例三:查看CPU實(shí)時(shí)運(yùn)行隊(duì)列長(zhǎng)度,上下文切換和平均負(fù)載。

下面的命令每隔1秒進(jìn)行2次實(shí)時(shí)CPU性能采樣,可以看到每秒鐘的上下文切換數(shù),創(chuàng)建的進(jìn)程數(shù)和系統(tǒng)負(fù)載。從最后的平均負(fù)載來(lái)看有290個(gè)進(jìn)程在內(nèi)存中,但是沒(méi)有在CPU中運(yùn)行,也沒(méi)有等待運(yùn)行的進(jìn)程。

[root@linuxabc ~]# sar -w -q 1 2

Linux性能優(yōu)化之CPU

 

#LinuxABC# #Linux#


------ END ------

分享到:
標(biāo)簽:Linux
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定