性能測試必備基礎知識(一)

来源:https://www.cnblogs.com/beyond-tester/archive/2023/11/28/17860921.html
-Advertisement-
Play Games

1. 平均負載 平均負載是指單位時間內,系統處於可運行狀態和不可中斷狀態的平均進程數,也就是平均活躍進程數,它和CPU使用率並沒有直接關係。 可運行狀態的進程是指正在使用CPU或者等待CPU資源的進程。當我們使用類似於"ps"命令時,這些進程通常以"R"狀態(Running或Runnable)顯示。 ...


1. 平均負載

平均負載是指單位時間內,系統處於可運行狀態和不可中斷狀態的平均進程數,也就是平均活躍進程數,它和CPU使用率並沒有直接關係。

可運行狀態的進程是指正在使用CPU或者等待CPU資源的進程。當我們使用類似於"ps"命令時,這些進程通常以"R"狀態(Running或Runnable)顯示。

不可中斷狀態的進程是指處於內核態關鍵流程中的進程,這些流程無法被中斷。例如,最常見的情況是等待硬體設備的I/O響應。這類進程在"ps"命令中以"D"狀態(Uninterruptible Sleep,也稱為Disk Sleep)顯示。

舉個例子,當一個進程正在進行磁碟讀寫操作時,為了保證數據的一致性,在收到磁碟響應之前,該進程不能被其他進程或中斷打斷。此時,該進程處於不可中斷狀態。如果該進程被打斷,可能會導致磁碟數據與進程數據不一致的問題。

因此,不可中斷狀態實際上是系統對進程和硬體設備的一種保護機制。

從理想角度來看,每個CPU都剛好運行一個進程將充分利用每個CPU的資源。例如,當平均負載為3時,對於只有3個CPU的系統而言,表示所有CPU都被完全占用。對於4個CPU的系統而言,意味著CPU有50%的空閑時間。而對於只有1個CPU的系統而言,意味著有一半的進程無法競爭到CPU資源。

所以可總結如下:

  1. 平均負載高於CPU核心數時,通常意味著系統負載較重。這可能是因為有更多的進程在競爭CPU資源,導致CPU使用率較高。如果平均負載遠高於CPU核心數,可能會導致進程排隊等待CPU,造成性能下降。

  2. 平均負載低於或接近CPU核心數時,通常表示系統負載較輕。這意味著CPU使用率相對較低,系統有足夠的處理能力來處理當前的工作負載。

2. 平均負載與CPU使用率之間關係

先說一個小慄子,假設一個系統有4個CPU核心,如果平均負載是2,表示平均活躍進程數為2。這並不直接告訴我們每個CPU核心的使用率是多少。可能有兩個CPU核心各自運行一個進程,而其他兩個CPU核心處於空閑狀態;也可能有一個CPU核心運行兩個進程,而其他三個CPU核心處於空閑狀態。因此,平均負載為2時,並不能確定具體的CPU使用率。

總結起來:

  1. CPU密集型進程:當系統中有大量的CPU密集型進程正在執行,它們會消耗大量的CPU資源,導致CPU使用率升高。同時,這些進程也會占用系統的可運行狀態,使得平均負載也升高。在這種情況下,CPU使用率和平均負載是一致的,都反映了系統的高負載狀態。

  2. I/O密集型進程:如果系統中有大量的I/O密集型進程,它們可能會頻繁地進行I/O操作並等待I/O響應。在等待I/O的過程中,進程不會占用CPU資源,因此CPU使用率可能相對較低。然而,這些等待I/O的進程會進入不可中斷狀態,導致平均負載升高。因此,在這種情況下,平均負載可能比CPU使用率更高。

  3. 大量等待CPU的進程調度:當系統中存在大量的進程在等待CPU調度時,它們可能會競爭有限的CPU資源。這會導致CPU使用率的升高,因為CPU正在不斷地被分配給各個進程。同時,這些等待CPU調度的進程會占用系統的可運行狀態,使得平均負載升高。因此,在這種情況下,CPU使用率和平均負載可能都比較高。

3. CPU上下文切換

CPU上下文切換是指操作系統在多任務環境下,將當前正在運行的進程或線程的上下文信息保存起來,並載入下一個即將運行的進程或線程的上下文信息的過程。

上下文是指進程或線程在執行過程中的狀態信息,包括程式計數器(記錄下一條要執行的指令地址)、寄存器的值、堆棧指針、打開的文件、記憶體映射等。上下文切換的目的是在多個進程或線程之間共用CPU時間,使得每個進程或線程都能得到適當的執行時間。

當一個進程或線程的時間片(時間片是操作系統分配給每個進程或線程的執行時間段)用完或發生某種事件(如I/O操作完成)時,操作系統會進行上下文切換,具體過程如下:

  1. 保存當前進程或線程的上下文信息:操作系統會將當前進程或線程的上下文信息保存到記憶體中,包括寄存器的值、程式計數器等。

  2. 載入下一個進程或線程的上下文信息:操作系統從就緒隊列中選擇下一個即將執行的進程或線程,並將其上下文信息從記憶體中載入到寄存器和其他相關硬體中。

  3. 切換到下一個進程或線程的執行:操作系統將控制權轉移到下一個進程或線程,使其開始執行。這個過程可能包括更新頁表、設置記憶體映射、打開文件等操作。

上下文切換是一個開銷較大的操作,因為它涉及到大量的數據保存和載入操作。因此,減少上下文切換的次數對系統性能至關重要。一些常見的導致上下文切換的情況包括搶占式調度、I/O操作、中斷處理和多核處理器上的併發執行等。

3-1 進程上下文切換

進程上下文切換是操作系統在多任務環境下,從一個進程切換到另一個進程時所進行的上下文切換過程。它涉及保存和載入進程的上下文信息,以便在重新調度時能夠繼續執行進程。

進程上下文切換的過程如下:

  1. 保存當前進程的上下文:當操作系統需要切換到另一個進程時,它會先保存當前正在運行進程的上下文信息。這包括保存進程的程式計數器、寄存器的值、堆棧指針、打開的文件、記憶體映射等。這些信息通常保存在進程的控制塊(Process Control Block,PCB)中,PCB是操作系統用來管理進程的數據結構。

  2. 載入下一個進程的上下文:操作系統從就緒隊列中選擇下一個即將執行的進程,並載入該進程之前保存的上下文信息。這包括將進程的程式計數器、寄存器的值、堆棧指針等從其PCB中載入到相應的寄存器和硬體中。

  3. 切換到下一個進程的執行:一旦新進程的上下文信息載入完畢,操作系統會將控制權轉移到該進程,使其開始執行。這可能涉及更新頁表、設置記憶體映射、打開文件等操作,以確保新進程能夠正確地運行。

進程上下文切換是一個開銷較大的操作,因為它涉及大量的數據保存和載入。上下文切換的頻繁發生會導致系統性能下降。因此,優化上下文切換的效率對於提高系統的多任務處理能力至關重要。

進程上下文切換通常發生在以下情況下:

  1. 搶占式調度:當操作系統採用搶占式調度策略時,一個優先順序更高的進程可能會搶占正在執行的進程的CPU時間,從而導致上下文切換。

  2. I/O操作:當進程需要進行I/O操作時,例如等待磁碟讀寫完成,操作系統會將該進程切換出去,讓其他進程繼續執行。一旦I/O操作完成,操作系統會將該進程的上下文切換回來,使其繼續執行。

  3. 時間片用完:操作系統為每個進程分配一定的時間片,當一個進程的時間片用完時,操作系統會將其上下文保存並切換到下一個進程,以保證公平分配CPU時間。

  4. 進程間通信:在進程間通信的過程中,操作系統可能需要進行上下文切換,以便讓不同的進程能夠相互交互和共用數據。

  5. 進程在系統資源不足(比如記憶體不足)時,要等到資源滿足後才可以運行,這個時候進程也會被掛起,並由系統調度其他進程運行。
  6. 當進程通過睡眠函數 sleep 這樣的方法將自己主動掛起時,自然也會重新調度。

3-2 線程上下文切換

線程和進程最大的區別在於,線程是調度的基本單位,而進程是資源擁有的基本單位。在內核中的任務調度過程中,調度對象實際上是線程,而進程只是為線程提供了虛擬記憶體、全局變數等資源。因此,可以將線程視為進程的子任務。

當進程包含多個線程時,這些線程共用相同的虛擬記憶體和全局變數等資源。在上下文切換時,這些資源是不需要被修改的。

然而,線程也有自己的私有數據,例如棧和寄存器等。在上下文切換時,需要保存和載入線程的私有數據。

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

  1. 前後兩個線程屬於不同的進程:在這種情況下,由於資源不共用,線程的上下文切換過程與進程的上下文切換相似。

  2. 前後兩個線程屬於同一個進程:在這種情況下,由於虛擬記憶體是共用的,上下文切換時虛擬記憶體等資源保持不變,只需要切換線程的私有數據和寄存器等非共用數據。

可以看出,同一個進程內的線程切換相比多進程間的切換消耗更少的資源。這也是使用多線程代替多進程的一個優勢。

3-3 中斷上下文切換

中斷上下文切換是指當電腦系統發生硬體中斷或異常時,操作系統需要從當前正在執行的上下文中切換到中斷處理程式的上下文,併在中斷處理程式執行完畢後再切換回原來的上下文。中斷上下文切換是操作系統為了響應中斷事件而進行的一種上下文切換過程。

下麵是中斷上下文切換的詳細過程:

  1. 中斷觸發:電腦系統中的硬體設備(如時鐘、鍵盤、磁碟等)或異常條件(如除零錯誤、頁錯誤等)觸發了中斷信號,通知操作系統需要進行相應的處理。這會導致當前正在執行的指令被暫停。

  2. 保存當前上下文:在響應中斷前,操作系統會保存當前正在執行的任務的上下文信息。這包括保存程式計數器、寄存器的值、堆棧指針等。這些信息通常保存在被中斷任務的內核棧或專用的中斷棧中。

  3. 切換到中斷處理程式:一旦當前上下文保存完畢,操作系統會切換到中斷處理程式的上下文。中斷處理程式是預先定義好的用於處理特定中斷的代碼段。操作系統會根據中斷類型和優先順序選擇相應的中斷處理程式。

  4. 中斷處理程式執行:操作系統開始執行中斷處理程式,處理中斷事件。中斷處理程式根據中斷類型進行相應的處理,可能包括讀取輸入設備的數據、處理異常錯誤、更新系統狀態等。

  5. 恢複原上下文:一旦中斷處理程式執行完畢,操作系統會從中斷處理程式的上下文中恢複原來被中斷任務的上下文。它會將之前保存的程式計數器、寄存器的值、堆棧指針等信息恢復到相應的寄存器和硬體中。

  6. 繼續執行被中斷任務:一旦原上下文恢復完畢,操作系統會繼續執行被中斷的任務。它會從中斷發生時的位置繼續執行指令,使任務在中斷處理後繼續正常運行。

  7.  

與進程上下文切換不同,中斷上下文切換並不牽涉到進程的用戶態(User Mode)。當發生中斷時,即使當前正在執行的進程處於用戶態,操作系統也不需要保存和恢復該進程的虛擬記憶體、全局變數等用戶態資源。

中斷上下文只包括內核態(Kernel Mode)中斷服務程式執行所必需的狀態。這些狀態包括CPU寄存器的值、內核堆棧的指針、硬體中斷參數等。這些信息足夠操作系統在中斷處理程式中進行必要的操作,而不需要涉及進程的用戶態資源。

換句話說,中斷上下文切換僅涉及到內核態的數據和狀態,因為中斷處理程式運行在內核態中。它是為了響應硬體中斷而發生的,目的是儘快處理中斷事件並返回到被中斷的任務。

這種區分是為了提高中斷響應的效率。通過僅保存和恢復與中斷處理相關的內核態數據,可以減少上下文切換的開銷,從而更快地響應中斷並恢復正常的執行。

中斷上下文切換的過程需要保存和恢復大量的上下文信息,因此會引入一定的開銷。優化中斷上下文切換的方式是減少保存和恢復的上下文信息量,以提高系統的響應速度。

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 電腦安全和數據隱私是現代應用程式設計中至關重要的方面。為了確保數據的機密性和完整性,常常需要使用加密和解密演算法。C++是一種廣泛使用的編程語言,提供了許多加密和解密演算法的實現。本文將介紹一些在C++中常用的加密與解密演算法,這其中包括Xor異或、BASE64、AES、MD5、SHA256、RSA等。 ...
  • 位運算 題目背景 題目由 daiyulong20120222 創作(me) 並由 QBW1117完善以及數據 。 題目描述 給定兩個數\(x,y\) ,在給定一個位運算符號 \(c\)。 請你列出 \(x,y\) 進行 \(c\) 位運算是的算數豎式式。 註: 豎式這麼列: 顯示出兩個數的完整二進位 ...
  • 主要介紹了第一個Spring MVC程式的環境搭建、父子項目結構、Tomcat配置、配置文件。對DispatcherServlet的講解,2個核心類型:1.RequestMappingHandlerMapping 2.RequestMappingHandlerAdapter,視圖解析器ViewRes... ...
  • matplotlib是基於python生態開發的一個可視化繪圖庫,它的出現讓python在數據分析及機器學習方面占了重要的一部分,目前很多數據分析及機器學習相關方面的工程都有使用到這個庫,並且由於其簡單易用,安裝簡單等方面的優勢深得廣大開發者的喜愛。 ...
  • HtmlAgilityPack是一個.NET平臺下的HTML解析庫,它可以將HTML文本轉換為DOM文檔對象,方便我們對HTML文本進行操作和分析。HtmlAgilityPack支持XPath語法,可以通過XPath表達式來獲取DOM節點,同時還提供了一些方便的API,可以實現HTML文本的解析、修 ...
  • MVC 的過濾器(Filters)也翻譯為“篩選器”。但是老周更喜歡翻譯為“過濾器”,意思上更好理解。 既然都叫過濾器了,就是在MVC的操作方法調用前後進行特殊處理的類型。比如: a、此調用是否已授權? b、在模型綁定之前要不要修改數據源?(可能含有兒童不宜的數據) c、在調用MVC方法前要不要改一 ...
  • 需要有的知識點: c# 基礎以及c#高級基礎 Ado.net 基礎 SqlServer 以及MySQL (都需要高級部分) Asp.net Mvc Core 基礎 1. 新手的煩惱 (1) SQL 拼不對,錯還不會找 (2) 開發效率低 (3) 如果發現欄位需要重命名,得挨個地方去修改 (4) 老闆 ...
  • 在 .NET Core 中,日誌是一個非常重要的組件,它可以幫助我們記錄應用程式的運行情況,以便在出現問題時進行排查。在本文中,我們將介紹五個優秀的 .NET Core 日誌框架,它們分別是 Serilog、NLog、Log4Net、Microsoft.Extensions.Logging 和 Lo ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...