性能優化-CPU上下文

CPU上下文:CPU中的寄存器和程序計數器。切換出的CPU上下文,會保存到linux系統內核中。

分爲3種:1、進程上下文,2、線程上下文,3、中斷上下文(硬件通過觸發信號,導致中斷處理程序運行)。

進程的運行空間:內核空間、用戶空間。

內核空間:具有最高權限,可以直接訪問所以資源,包括硬件。

用戶空間:只有有限資源,不能訪問包括內存在內的硬件只有,必須通過系統調用嵌入到內核中,纔可以調用這些資源。

從用戶態到內核態,是通過系統調用實現的。比如我們要查看一個文件的內容,需要

      1、調用系統調用open打開一個磁盤文件,

      2、read讀取一個文件內容,

      3、write輸入到標準輸入,

      4、close關閉文件。

一、

執行系統調用,也是需要切換CPU上下文的。需要先保存CPU上下文的當前狀態,然後加載系統調用的上下文,再然後跳轉到內核態,執行內核任務。

系統調用完成,需要保存CPU現在的上下文狀態,加載上次新的上下文狀態,進入用戶態,執行。

一次系統調用,發生了2次CPU上下文切換。

系統調用,一直是在同一個進程中運行的。

二、

進程上下文切換

進程切換只能在內核態中運行。進程切換不只切換虛擬內存、棧、全局變量等用戶空間資源,也包括內核堆棧、等內核態資源。

保存上下文和恢復上下文,也不是免費操作,需要內核佔用CPU運行,進行切換。

如果進程切換太頻繁,容易導致CPU將大部分時間用戶虛擬內存、棧等的資源的保存和恢復上。大大縮短運行真正進程的時間。

另外頻繁的切換,會導致虛擬內存不停刷新,導致內存訪問變慢。

什麼時候會切換進程上下文?

在進程切換的時候。

每個CPU會有1個就緒隊列,其中保存着各個待執行的進程。

1、進程執行完成

2、CPU會平分時間片,時間片用完,會發現進程切換。

3、進程調用sleep函數時。

4、進程暫時得不到需要的系統資源時,會掛起進程。

5、高優先級的進程過來時,會先執行高優先級的進程。

6、發生硬件中斷時,CPU會將當前進程掛起,去執行中斷處理程序。

線程切換

1、2個線程位於不同的進程,那麼和進程切換一樣。

2、2個線程位於相同的進程,那麼共享同一塊虛擬內存、共享變量等資源,這部分內容不動,但線程也有他自己的獨有的資源。

中斷上下文切換

中斷只發生在內核態,所以中斷上下文切換時,不需要保持原進程的內核態上下文信息,但需要保存原進程的用戶態上下文信息。

 

 

工具

vmstat可以切換系統總體的上下文切換次數和系統中斷次數

CS每秒上下文切換次數

in每秒中斷髮生次數

r就緒隊列的長度,就是正在運行和準備運行的進程數

b處於不可中斷睡眠狀態的進程數

 

查詢進程的上下文切換用工具pidstat -w

cswch每秒自願上下文切換的次數,進程因爲無法獲得系統資源,如IO、內存等,進行的上下文切換。

nvswch每秒非自願上下文切換的次數,進程因爲時間片用完等,發生的上下文切換。

apt-get install sysbench sysstat

 

定位問題的思路:

1、top查看,平均負載6,現在有2個CPU,說明是CPU個數的3倍,正常最多爲的CPU個數

2、查看sys內存佔用76,usr佔用24,猜測可能是CPU上下文切換的問題。

3、vmstat可以查看系統整體的上下文切換情況,執行命令,確實爲CS每秒上下文切換次數,in每秒中斷次數都達到13W,並且r就緒隊列長度達到6,7。說明確實是因爲這個問題。

4、pidstat -wt t這個參數是打印的線程的cswch和nvcswch,自願上下文切換,非自願上下文切換都很高。

 

/proc是linux的一個虛擬文件系統,負責用戶空間與系統空間的通訊。

中斷查看/proc/interrupts

mpstat可以查看每個CPU的情況

pidstat -u 和-w不同,-u和mpstat輸出一樣,CPU的使用情況,-w是用輸出上下文和中斷次數。

uptime 系統平均負載,1分鐘,5分鐘,15分鐘

平均負載,是一段時間內,系統處於可運行狀態和不可中斷狀態的平均進程數。

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章