Context Switches上下文切換效能詳解
Context Switches 上下文切換,有時也被稱為程序切換(process switch)或任務切換。是一個重要的效能指標。
CPU從一個執行緒切換到另外一個執行緒,需要儲存當前任務的執行環境,恢復將要執行任務的執行環境,必然帶來效能消耗。
Context Switches 上下文切換簡介
作業系統可以同時執行多個程序, 然而一顆CPU同時只能執行一項任務,作業系統利用時間片輪轉的方式,讓使用者感覺這些任務正在同時進行。 CPU給每個任務都服務一定的時間, 然後把當前任務的狀態儲存下來, 在載入下一任務的狀態後, 繼續服務下一任務。任務的狀態儲存及再載入, 這段過程就叫做上下文切換。
時間片輪轉的方式使多個任務在同一顆CPU上執行變成了可能, 但同時也帶來了儲存現場和載入現場的直接消耗。
上下文切換的效能消耗
Context Switchs過高,導致CPU就像個搬運工一樣,頻繁在暫存器(CPU Register)和執行佇列(run queue)之間奔波,系統更多的時間都花費線上程切換上,而不是花在真正做有用工作的執行緒上。
直接消耗包括: CPU暫存器需要儲存和載入, 系統排程器的程式碼需要執行, TLB例項需要重新載入, CPU 的pipeline需要刷掉。
間接消耗:多核的cache之間得共享資料。間接消耗對於程式的影響要看執行緒工作區操作資料的大小。
效能分析檢視Context Switches的方法
linux中可以通過工具vmstat, dstat, pidstat來觀察CS的切換情況。vmstat, dstat只能觀察整個系統的切換情況,而pidstat可以更精確地觀察某個程序的上下文切換情況。
windows中可以使用檢視程序的神器processxp,程序列表中可以新增Context Switchs和Context Switchs Delta列,另外程序屬性Threads標籤頁可檢視執行緒對應的Context Switchs。
另windows中還可以使用“效能計數器”監控Context Switchs的變化趨勢,方便效能分析。新增System\Context Switches/sec或Thread(_Total)\Context Switches/sec計數器即可。
引起上下文切換的原因
對於我們經常使用的搶佔式作業系統來說, 引起上下文切換的原因大概有以下幾種:
1. 當前執行任務的時間片用完之後, 系統CPU正常排程下一個任務
2. 當前執行任務碰到IO阻塞, 排程器將掛起此任務, 繼續下一任務
3. 多個任務搶佔鎖資源, 當前任務沒有搶到,被排程器掛起, 繼續下一任務
4. 使用者程式碼掛起當前任務, 讓出CPU時間
5. 硬體中斷