什么是CPU上下文切換?
現在linux是大多基於搶占式,CPU給每個任務一定的服務時間,當時間片輪轉的時候,需要把當前狀態保存下來,同時加載下一個任務,這個過程叫做上下文切換。時間片輪轉的方式,使得多個任務利用一個CPU執行成為可能,但是保存現場和加載現場,也帶來了性能消耗。 那線程上下文切換的次數和時間以及性能消耗如何看呢?
如何獲得上下文切換的次數?
vmstat直接運行即可,在最后幾列,有CPU的context switch次數。 這個是系統層面的,加入想看特定進程的情況,可以使用pidstat。
Linux中可以通過工具vmstat, dstat, pidstat來觀察CS的切換情況。vmstat, dstat只能觀察整個系統的切換情況,而pidstat可以更精確地觀察某個進程的上下文切換情況。
cs
執行pidstat,將輸出系統啟動后所有活動進程的cpu統計信息:
備注:執行pidstat默認輸出信息為系統啟動后到執行時間點的統計信息,因而即使當前某進程的cpu占用率很高,輸出中的值有可能仍為0
上下文切換的性能消耗在哪里呢?
context switch過高,會導致CPU像個搬運工,頻繁在寄存器和運行隊列直接奔波 ,更多的時間花在了線程切換,而不是真正工作的線程上。直接的消耗包括CPU寄存器需要保存和加載,系統調度器的代碼需要執行。間接消耗在於多核cache之間的共享數據。
引起上下文切換的原因有哪些?
對於搶占式操作系統而言, 大體有幾種:
1、當前任務的時間片用完之后,系統CPU正常調度下一個任務;
2、當前任務碰到IO阻塞,調度線程將掛起此任務,繼續下一個任務;
3、多個任務搶占鎖資源,當前任務沒有搶到,被調度器掛起,繼續下一個任務;
4、用戶代碼掛起當前任務,讓出CPU時間;
5、硬件中斷;
如何測試上下文切換的時間消耗?
LMbench,知道這個工具,是在霸爺的博客上面(http://blog.yufeng.info/archives/753),然后就開始在測試環境下搞了一把,一會就出結果了。然后就搞了台線上機器安裝這個工具,然后測試,后面在測試Memory的時候,直接導致Load飆升,還好沒人發現,機器java進程重啟就好了。這方面純粹是業務選手。霸爺說分析的結果對於高性能C的開發同學來說,是需要熟記的,沒辦法,咱是搞java的,只能每個指標逐個看一下了。
LMbench的簡單介紹?
首先看英文介紹:LMbench -Tools for Performance Analysis,微觀性能分析工具。
官方地址:http://www.bitmover.com/lmbench/
下載地址:http://www.bitmover.com/lmbench/lmbench3.tar.gz
LMbench主要能干啥?
主要是帶寬(讀取緩存文件、內存拷貝、讀寫內存、管道等)和反應時間(上下文切換、網路、進程創建等)的評測工具。
LMbench關於結果解釋(這次主要關注線程切換信息)
在網上找了半天,信息很少,只能看doc下面的英文解釋了。
測試上下文切換的時間,一個上下文切換,包括保存一個進程狀態的保存和恢復另外一個進程的時間。
典型的上下文切換性能,僅僅是測量最小的線程切換時間。僅僅是做進程切換,任何實質的任務都不做。
首先是看任務處理的時間(通過一次任務處理,這個任務處理的時間被定義為token時間,不包括線程切換的)。
然后多次執行,排除任務執行的時間,然后計算出CS的時間(如果有cache miss,則CS的時間也包括cache misses的時間)。
|
轉載自:http://iamzhongyong.iteye.com/blog/1895728
文章參考:
霸爺和周忱的博客
http://www.bitmover.com/lmbench/
https://www.usenix.org/legacy/publications/library/proceedings/sd96/full_papers/mcvoy.pdf
http://blog.csdn.net/taozi343805436/article/details/7876087
http://blog.yufeng.info/archives/753
http://rdc.taobao.com/team/jm/archives/1706