CPU背景關系
在每個任務運行前,CPU 都需要知道任務從哪里加載、又從哪里開始運行,也就是說,需要系統事先幫它設定好 CPU 暫存器和程式計數器(Program Counter,PC),
CPU 暫存器,是 CPU 內置的容量小、但速度極快的記憶體,而程式計數器,則是用來存盤 CPU 正在執行的指令位置、或者即將執行的下一條指令位置,它們都是 CPU 在運行任何任務前,必須的依賴環境,因此也被叫做 CPU 背景關系,
CPU 背景關系切換
- 就是先把前一個任務的 CPU 背景關系(也就是 CPU 暫存器和程式計數器)保存起來
- 加載新任務的背景關系到這些暫存器和程式計數器
- 跳轉到程式計數器所指的新位置,運行新任務,
根據任務的不同,CPU 的背景關系切換就可以分為幾個不同的場景,也就是行程背景關系切換、執行緒背景關系切換以及中斷背景關系切換,
行程和執行緒
行程是資源分配和執行的基本單位;執行緒是任務調度和運行的基本單位,執行緒沒有資源,行程給指標提供虛擬記憶體、堆疊、變數等共享資源,而執行緒可以共享行程的資源,
行程背景關系切換
Linux 按照特權等級,把行程的運行空間分為內核空間和用戶空間,
CPU 特權等級的 Ring 0 和 Ring 3,
內核空間(Ring 0)具有最高權限,可以直接訪問所有資源;用戶空間(Ring 3)只能訪問受限資源,不能直接訪問記憶體等硬體設備,必須通過系統呼叫陷入到內核中,才能訪問這些特權資源,
行程既可以在用戶空間運行,又可以在內核空間中運行,行程在用戶空間運行時,被稱為行程的用戶態,而陷入內核空間的時候,被稱為行程的內核態,從用戶態到內核態的轉變,需要通過系統呼叫來完成,
一次系統呼叫的程序,其實是發生了兩次 CPU 背景關系切換,
執行緒背景關系切換
執行緒的背景關系切換其實就可以分為兩種情況
- 前后兩個執行緒屬于不同行程,此時,因為資源不共享,所以切換程序就跟行程背景關系切換是一樣,
- 前后兩個執行緒屬于同一個行程,此時,因為虛擬記憶體是共享的,所以在切換時,虛擬記憶體這些資源就保持不動,只需要切換執行緒的私有資料、暫存器等不共享的資料,
中斷背景關系切換
為了快速回應硬體的事件,中斷處理會打斷行程的正常調度和執行,轉而呼叫中斷處理程式,回應設備事件,而在打斷其他行程時,就需要將行程當前的狀態保存下來,這樣在中斷結束后,行程仍然可以從原來的狀態恢復運行,
對同一個 CPU 來說,中斷處理比行程擁有更高的優先級,所以中斷背景關系切換并不會與行程背景關系切換同時發生,同樣道理,由于中斷會打斷正常行程的調度和執行,所以大部分中斷處理程式都短小精悍,以便盡可能快的執行結束,
中斷只會發生在內核態
查看中斷型別
從/proc/interrupts 這個只讀檔案中讀取,/proc 實際上是 Linux 的一個虛擬檔案系統,用于內核空間與用戶空間之間的通信,/proc/interrupts 就是這種通信機制的一部分,提供了一個只讀的中斷使用情況,
Vmstat
vmstat 是一個常用的系統性能分析工具,主要用來分析系統的記憶體使用情況,也常用來分析 CPU 背景關系切換和中斷的次數,
// 5s 輸出間隔
[root@k8s ~]# vmstat 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
4 0 0 1150604 194172 2888576 0 0 4 238 77 35 61 3 36 0 0
2 0 0 1147236 194172 2888812 0 0 0 96 3977 4630 69 4 27 0 0
cs(context switch)是每秒背景關系切換的次數,
in(interrupt)則是每秒中斷的次數
r(Running or Runnable)是就緒佇列的長度,也就是正在運行和等待 CPU 的行程數,
b(Blocked)則是處于不可中斷睡眠狀態的行程數,
Pidstat -w
pidstat給它加上 -w 選項,就可以查看每個行程背景關系切換的情況了,
// -w引數表示輸出行程切換指標,而-u引數則表示輸出CPU使用指標
// pidstat 默認顯示行程的指標資料,加上 -t 引數后,才會輸出執行緒的指標,
pidstat 5 -w -u
Linux 3.10.0-1062.4.1.el7.x86_64 (instance-010oj085) 04/04/2020 _x86_64_ (2 CPU)
04:49:06 PM UID PID cswch/s nvcswch/s Command
04:49:11 PM 0 1 0.20 0.00 systemd
04:49:11 PM 0 6 1.20 0.00 ksoftirqd/0
cswch,表示每秒自愿背景關系切換(voluntary context switches)的次數,nvcswch,表示每秒非自愿背景關系切換(non voluntary context switches)的次數,
- 所謂自愿背景關系切換,是指行程無法獲取所需資源,導致的背景關系切換,比如說, I/O、記憶體等系統資源不足時,就會發生自愿背景關系切換,
- 而非自愿背景關系切換,則是指行程由于時間片已到等原因,被系統強制調度,進而發生的背景關系切換,比如說,大量行程都在爭搶 CPU 時,就容易發生非自愿背景關系切換,
總結
- CPU 背景關系切換,是保證 Linux 系統正常作業的核心功能之一,一般情況下不需要我們特別關注,
- 但過多的背景關系切換,會把 CPU 時間消耗在暫存器、內核堆疊以及虛擬記憶體等資料的保存和恢復上,從而縮短行程真正運行的時間,導致系統的整體性能大幅下降,
背景關系切換型別:
- 自愿背景關系切換變多了,說明行程都在等待資源,有可能發生了 I/O 等其他問題;
- 非自愿背景關系切換變多了,說明行程都在被強制調度,也就是都在爭搶 CPU,說明 CPU 的確成了瓶頸;
- 中斷次數變多了,說明 CPU 被中斷處理程式占用,還需要通過查看 /proc/interrupts 檔案來分析具體的中斷型別,
學習筆記
來自極客時間:《Linux性能優化實戰》
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/114379.html
標籤:Linux
上一篇:Linux性能指標和平均負載
下一篇:Linux系統編程—信號量
