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

来源: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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...