CPU上下文切換包括進程上下文切換、線程上下文切換及中斷上下文切換,當任務進行io或發生時間片事件及發生中斷(如硬件讀取完成)時,就會進入內核態,發生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 線程切換狀況