linux下如何測量進程線程context switch花費的時間?


非超線程前提下,線程的切換時間,就是實際上內核中做進程切換所消耗的時間,這個時間很好算。直接在內核切換代碼中兩個時間點算就行了。超線程就算了,CPU 自己的行為, OS 無感知的,可能也就幾個周期就過來了。

不好算的是進程切換,因為進程切換和線程切換步驟基本都是一樣的,但是線程切換不會刷新 TLB。TLB 失效是進程切換主要的開銷損耗。TLB 失效之後,你並不知道這次失效的影響什麼時候才能收斂到最小。所以算線程切換,只能算一個平均效果時間:(總時間 - 除切換的運行時間)/ 切換次數。


線程和進程在內核的管理結構 task struct是一樣的,切換的差別也只是是否刷新TLB,刷新TLB本身不費時,只是刷新後,TLB miss會比較影響性能,但這不能算在「切換」時間內。真正的切換時間只有寄存器的保持到內存中,並把將要執行的線程/進程的上下文從內存拷貝到寄存器中,就完成了一次切換,總之,非常快。


Tsuna"s blog: How long does it take to make a context switch?


可以使用SystemTap掛載CPU_on與CPU_off兩個方法,配合應用程序的標識符進行測算。


schedule函數幹嘛去,ftrace可以跟蹤sched_switch


推薦閱讀:

windows下有哪些非常有用or高逼格的命令?
Linux下進程/線程間通信如何正確學習?
為什麼我用金山重裝的系統每次重裝完後都被360查出一大堆漏洞,而用360重裝的就不會?
兩種開放態度,為什麼桌面端 Windows/Linux 的口碑與移動端 iOS/Android 相反?

TAG:操作系統 | Linux | 伺服器 | 多線程 |