linux下如何測量進程線程context switch花費的時間?
01-04
非超線程前提下,線程的切換時間,就是實際上內核中做進程切換所消耗的時間,這個時間很好算。直接在內核切換代碼中兩個時間點算就行了。超線程就算了,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 相反?