1. CPU 使用率
除了空閑時間外的其他時間占總 CPU 時間的百分比,就是CPU 使用率,即 1- 空閑時間/CPU 總時間。
當(dāng)計算 CPU 使用率時,我們通常使用 /proc/stat 文件中的數(shù)據(jù)。該文件提供了有關(guān) CPU 的計數(shù)器信息,包括各種狀態(tài)下的節(jié)拍數(shù)。通過 cat??/proc/stat 命令就可詳細查看其信息,其中各
列的含義如下:
-
user(通??s寫為 us),代表用戶態(tài) CPU 時間。注意,它不包括下面的 nice 時間,但包括了 guest 時間。
-
nice(通??s寫為 ni),代表低優(yōu)先級用戶態(tài) CPU 時間,也就是進程的 nice 值被調(diào)整為 1-19 之間時的 CPU 時間。這里注意,nice 可取值范圍是 -20 到 19,數(shù)值越大,優(yōu)先級反而越低。
-
system(通常縮寫為sys),代表內(nèi)核態(tài) CPU 時間。
-
idle(通??s寫為id),代表空閑時間。注意,它不包括等待 I/O 的時間(iowait)。
-
iowait(通??s寫為 wa),代表等待 I/O 的 CPU 時間。
-
irq(通??s寫為 hi),代表處理硬中斷的 CPU 時間。
-
softirq(通??s寫為 si),代表處理軟中斷的 CPU 時間。
-
steal(通常縮寫為 st),代表當(dāng)系統(tǒng)運行在虛擬機中的時候,被其他虛擬機占用的 CPU 時間。
-
guest(通??s寫為 guest),代表通過虛擬化運行其他操作系統(tǒng)的時間,也就是運行虛擬機的 CPU 時間。
-
guest_nice(通常縮寫為 gnice),代表以低優(yōu)先級運行虛擬機的時間。
2. 軟中斷
假設(shè)你正在使用一款音樂播放器應(yīng)用程序,同時還在進行其他任務(wù),如瀏覽網(wǎng)頁。在某個時刻,音樂播放器應(yīng)用程序需要通知你有一條新的消息到達。然而,應(yīng)用程序不能直接中斷你正在瀏覽的網(wǎng)頁,因為這會干擾你的體驗。因此,應(yīng)用程序使用軟中斷來通知你。
當(dāng)新的消息到達時,音樂播放器應(yīng)用程序觸發(fā)一個軟中斷,類似于發(fā)送一個"通知"。這個軟中斷會暫停當(dāng)前正在執(zhí)行的任務(wù)(瀏覽網(wǎng)頁),然后轉(zhuǎn)移控制權(quán)到應(yīng)用程序內(nèi)部的中斷處理程序。在中斷處理程序中,應(yīng)用程序可以執(zhí)行特定的操作,比如彈出一個消息通知,顯示新消息的內(nèi)容。
一旦中斷處理程序完成執(zhí)行,控制權(quán)將返回給瀏覽器應(yīng)用程序,你可以繼續(xù)瀏覽網(wǎng)頁,并在屏幕上看到新消息的通知。
這個例子中,軟中斷允許應(yīng)用程序在后臺處理事件,并以非侵入性的方式通知用戶。它提供了應(yīng)用程序與操作系統(tǒng)之間的通信和協(xié)調(diào),而無需直接中斷正在執(zhí)行的任務(wù)。軟中斷的關(guān)鍵特點是它由軟件觸發(fā)和處理,而不是由外部設(shè)備觸發(fā)。
在實際的計算機系統(tǒng)中,軟中斷用于各種目的,如處理網(wǎng)絡(luò)數(shù)據(jù)包、處理磁盤操作、定時器事件等。它們提供了一種有效的方式來處理異步事件,同時保持系統(tǒng)的響應(yīng)性和穩(wěn)定性。
網(wǎng)卡接收到數(shù)據(jù)包后,會通過硬件中斷的方式,通知內(nèi)核有新的數(shù)據(jù)到了。這時,內(nèi)核就應(yīng)該調(diào)用中斷處理程序來響應(yīng)它。網(wǎng)卡接收到數(shù)據(jù)包后,會通過硬件中斷的方式,通知內(nèi)核有新的數(shù)據(jù)到了。這時,內(nèi)核就應(yīng)該調(diào)用中斷處理程序來響應(yīng)它。最后再發(fā)送一個軟中斷信號,需要從內(nèi)存中找到網(wǎng)絡(luò)數(shù)據(jù),再按照網(wǎng)絡(luò)協(xié)議棧,對數(shù)據(jù)進行逐層解析和處理,直到把它送給應(yīng)用程序。
3. 內(nèi)存映射
在現(xiàn)代操作系統(tǒng)中,包括Linux,內(nèi)存管理采用了虛擬內(nèi)存的概念。每個進程都有自己的虛擬地址空間,它是一個抽象的地址空間,與實際的物理內(nèi)存地址是分離的。虛擬地址是由進程使用的,而不是直接映射到物理內(nèi)存。
內(nèi)存映射通過將虛擬內(nèi)存地址映射到物理內(nèi)存地址,將虛擬地址空間與物理內(nèi)存關(guān)聯(lián)起來。這樣,進程可以使用虛擬地址來訪問內(nèi)存,而無需關(guān)心實際的物理內(nèi)存位置。
為了實現(xiàn)這種映射,操作系統(tǒng)維護了一個頁表,它是一個數(shù)據(jù)結(jié)構(gòu),記錄了虛擬地址與物理地址之間的映射關(guān)系。每個進程都有自己的頁表,用于管理它的虛擬地址空間。
當(dāng)進程訪問一個虛擬地址時,操作系統(tǒng)會使用頁表查找對應(yīng)的物理地址。如果存在映射關(guān)系,操作系統(tǒng)將虛擬地址轉(zhuǎn)換為對應(yīng)的物理地址,以便在物理內(nèi)存中讀寫數(shù)據(jù)。如果沒有映射關(guān)系,則會觸發(fā)頁面錯誤(page fault),操作系統(tǒng)會根據(jù)情況從磁盤中加載數(shù)據(jù)到物理內(nèi)存,并更新頁表以建立映射關(guān)系。
內(nèi)存映射在文件操作中也使用了類似的機制。當(dāng)將文件內(nèi)容映射到進程的地址空間時,操作系統(tǒng)會將文件的內(nèi)容映射到一段虛擬地址空間,這樣進程就可以通過讀寫這些虛擬地址來實現(xiàn)對文件的訪問。
因此,內(nèi)存映射不僅用于將虛擬內(nèi)存地址映射到物理內(nèi)存地址,也用于將文件內(nèi)容映射到進程的地址空間中。頁表是維護這些映射關(guān)系的重要數(shù)據(jù)結(jié)構(gòu),它記錄了虛擬地址與物理地址之間的對應(yīng)關(guān)系。
?
4.?虛擬內(nèi)存空間分布
-
代碼段(Text Segment):
代碼段包含了可執(zhí)行程序的機器指令。它通常是只讀的,因為指令不應(yīng)該被修改。當(dāng)程序被加載到內(nèi)存中時,代碼段被映射到進程的虛擬內(nèi)存空間,以供執(zhí)行。 -
數(shù)據(jù)段(Data Segment):
數(shù)據(jù)段包含了全局變量和靜態(tài)變量的內(nèi)存空間。它通常是可讀寫的。數(shù)據(jù)段在程序運行時初始化,并且在整個程序的生命周期中保持不變。 -
堆(Heap):
堆是動態(tài)分配內(nèi)存的區(qū)域。在堆中,程序可以通過調(diào)用諸如malloc()和free()等函數(shù)來動態(tài)地分配和釋放內(nèi)存。堆的大小可以在運行時進行調(diào)整。 -
棧(Stack):
棧用于存儲局部變量、函數(shù)調(diào)用和函數(shù)參數(shù)。棧是以后進先出(LIFO)的方式進行管理的。每當(dāng)調(diào)用函數(shù)時,棧會分配一段內(nèi)存來存儲該函數(shù)的局部變量和其他相關(guān)信息。當(dāng)函數(shù)返回時,這些內(nèi)存將被釋放。 -
共享庫區(qū)域(Shared Library Region):
共享庫區(qū)域包含了共享庫的代碼和數(shù)據(jù)。這些庫可以由多個進程共享,以節(jié)省內(nèi)存空間。當(dāng)多個進程使用相同的共享庫時,它們可以將該庫映射到自己的虛擬內(nèi)存空間中,以便共享使用。 -
內(nèi)核空間(Kernel Space):
內(nèi)核空間是由操作系統(tǒng)內(nèi)核使用的虛擬內(nèi)存區(qū)域。它包含了操作系統(tǒng)內(nèi)核的代碼、數(shù)據(jù)和驅(qū)動程序等。用戶進程無法直接訪問內(nèi)核空間,需要通過系統(tǒng)調(diào)用等特定接口與內(nèi)核進行交互。
5. 內(nèi)存分配
內(nèi)存分配:
-
靜態(tài)分配:靜態(tài)分配是指在編譯時或程序啟動時就確定內(nèi)存的分配情況。例如,全局變量和靜態(tài)變量的內(nèi)存分配在程序加載時完成,并在整個程序的生命周期中保持不變。
-
動態(tài)分配:動態(tài)分配是在程序運行時根據(jù)需要動態(tài)分配和釋放內(nèi)存。常用的動態(tài)內(nèi)存分配函數(shù)是malloc()、calloc()和realloc()。這些函數(shù)允許你請求一定大小的內(nèi)存塊,并返回一個指向該內(nèi)存塊的指針。動態(tài)分配的內(nèi)存塊位于堆(Heap)區(qū)域。
內(nèi)存回收:
-
回收緩存,比如使用 LRU(Least Recently Used)算法,回收最近使用最少的內(nèi)存頁面;
-
回收不常訪問的內(nèi)存,把不常用的內(nèi)存通過交換分區(qū)直接寫到磁盤中;
-
殺死進程,內(nèi)存緊張時系統(tǒng)還會通過 OOM(Out of Memory),直接殺掉占用大量內(nèi)存的進程。
其中,第二種方式回收不常訪問的內(nèi)存時,會用到交換分區(qū)(以下簡稱 Swap)。Swap 其實就是把一塊磁盤空間當(dāng)成內(nèi)存來用。它可以把進程暫時不用的數(shù)據(jù)存儲到磁盤中(這個過程稱為換出),當(dāng)進程訪問這些內(nèi)存時,再從磁盤讀取這些數(shù)據(jù)到內(nèi)存中(這個過程稱為換入)。
不過要注意,通常只在內(nèi)存不足時,才會發(fā)生 Swap 交換。并且由于磁盤讀寫的速度遠比內(nèi)存慢,Swap 會導(dǎo)致嚴重的內(nèi)存性能問題。
第三種方式提到的 OOM(Out of Memory),其實是內(nèi)核的一種保護機制。它監(jiān)控進程的內(nèi)存使用情況,并且使用 oom_score 為每個進程的內(nèi)存使用情況進行評分:
-
一個進程消耗的內(nèi)存越大,oom_score 就越大;文章來源:http://www.zghlxwxcb.cn/news/detail-748656.html
-
一個進程運行占用的 CPU 越多,oom_score 就越小。文章來源地址http://www.zghlxwxcb.cn/news/detail-748656.html
到了這里,關(guān)于性能測試必備基礎(chǔ)知識(二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!