CPU上下文切換

  CPU上下文切換包括進程上下文切換、線程上下文切換及中斷上下文切換,當任務進行io或發生時間片事件及發生中斷(如硬件讀取完成)時,就會進入內核態,發生CPU上下文切換。緩存

  1. 進程上下文切換,進程的上下文信息包括, 指向可執行文件的指針, 棧, 內存(數據段和堆), 進程狀態, 優先級, 程序I/O的狀態, 授予權限, 調度信息, 審計信息, 有關資源的信息(文件描述符和讀/寫指針), 關事件和信號的信息, 寄存器組(棧指針, 指令計數器)等等,當發生進程切換時,這些保存在寄存器或高速緩存的信息須要記錄到內存,以便下次恢復進程的運行。
  2. 線程上下文切換,同一個進程的線程切換,只需保存線程獨有的信息,好比棧和寄存器,而共享的虛擬內存和全局變量則無需切換,所以切換開銷比進程小。
  3. 中斷上下文切換,中斷會打斷一個正常執行的進程而運行中斷處理程序,由於中斷處理程序是內核態進程,而不涉及到用戶態進程之間的切換,當被中斷的是用戶態進程時,不需保存和恢復這個進程的虛擬內存和全局變量,中斷上下文只包括中斷服務程序所須要的狀態,好比CPU寄存器、內核堆棧、硬件中斷等參數。

  過多的上下文切換會致使將大量CPU時間浪費在寄存器、內核棧以及虛擬內存的保存和恢復上,致使系統總體性能降低。能夠用vmstat查看系統的總體上下文切換狀況,以下圖1,空閒系統的上下文切換次數cs(context switch)爲100多,中斷次數in(interrupt)爲100多,在運行態r(running or runable)的進程數爲2,在阻塞態的進程數b爲0。多線程

圖1 空閒系統上下文切換和中斷狀況性能

  案例:咱們用sysbench來模擬多線程頻繁上下文切換的場景,並用vmstat、pidstat和/proc/interrupts來分析定位具體的線程。ui

  用sysbench模擬10個線程,運行300s來觀察線程切換的頻繁場景,以下圖2所示。線程

圖2 大量線程切換場景模擬指針

 

   用vmstat查看系統總體的上下文切換和中斷狀況,以下圖3,可看到cs和in的數目和空閒的時候比增長了不少。blog

 圖3 系統總體上下文切換狀況進程

  發現系統切換狀況比較頻繁,能夠用pidstat查看具體切換比較頻繁的線程,命令:pidstat -w -t 1,含義以下,事件

-w Report task switching activity (kernels 2.6.23 and later only). The following values may be displayed:內存

cswch/s
Total number of voluntary context switches the task made per second. A voluntary context switch occurs when a task blocks because it requires a resource that is unavailable.

每秒自願上下文切換次數,如等待io等。

nvcswch/s
Total number of non voluntary context switches the task made per second. A involuntary context switch takes place when a task executes for the duration of its time slice and then is
forced to relinquish the processor.

每秒非自願上下文切換次數,如時間片用完切換。

 -t展現具體的線程狀況。

結果以下圖4所示,能夠看到,切換頻繁的線程是sysbench

圖4 線程切換狀況

相關文章
相關標籤/搜索