2010年8月14日 星期六

Never Ends...

最近為了畢業論文花了兩個禮拜左右的時間
研究關於Linux Performance Monitoring的相關技術
從原本完全不知道如何做Performance的Monitoring
到發現原來有不少Open Sourced的Performance Monitoring的Tools
像是:SystemTap、LTTng、Ftrace等工具...
以及其底層所實做的技術:Kprobes、Tracepoints、Ptrace...等

在試過幾個不同的技術後
最後決定Kernel Space Tracing
使用Performance Overhead較高 (因為需要插入Breakpoint instructions)
但可以在不更動所欲偵測程式的source code的情況下做Dynamic Analysis的Kprobes

而User Space Tracing則打算使用GNU GDB底層所使用的Ptrace
(原本打算使用Ptrace的增進版 - Utrace,不過由於尚未支援ARM平台所以只好作罷...)

另外為了能讓資料由Kernel Space pass到User Space的Overhead降到最低
所以還稍微研究了Relay (前身為Relayfs)

以及為了提供nanosecond等級的時間精準度
所打算使用的hrtimer (High Resolution Timer)

但人算不如天算...
原先想說大概基本所需要技術都研究的差不多了
剩下的就是跟老師討論實做在我們3D Chip平台上所需的細節後
就可以真正開始設計這套系統...

結果沒想到今天在報告關於Kprobes的進度後
老師又丟了一個新的議題要我解決:
算出Process Context Switch所花的時間
啊吼... 這下真的是在我頭上投下了一個超大顆的震撼彈!!
(難不成是要我去修改Linux Kernel的Scheduler?! 囧rz)
因為不管是Kprobes或是Ptrace...
其原理都是在fucntion的entry或是exit處甚至是function內部再加上int 3的assembly code
(x86、x86_64平台上的breakpoint instruction,也就是soft interrupt)
在對CPU發出soft interrupt後再將控制權轉交給其他的handlers
如此就可以透過此方法來計算function enter及return的timestamps
進而計算出function所花的執行時間,達到Performance Monitoring的功能
但由於Context Switch發生的時間點完全無法預測
因此也無法得知需要在哪個部位下breakpoints

原本是想找理由"婉拒"
但沒想到老師搬出Linux的time程式
說可以測量出real、user、sys這三種時間

我之前就記得這個程式也只是單純計算程式在User Space及Kernel Space的執行時間
並沒有特別將Context Switch的時間給計算出來...
但因為討論的當下並沒有明確的證據可以證明
老師又很堅持他的論點,所以只好妥協... QQ

果然之後查了user就是程式在User Space所執行的時間
sys就是程式在Kernel Space所執行的時間
而且時間精準度只有second等級 (頂多到millisecond...)
底層實做方法則是透過wait3() system call來實做的
雖然沒有很仔細的好好trace過time的source code
但感覺起來用Kprobes、Ptrace所算出來的時間可能還更精準一點?!


不過有個好消息是我有可能不用作硬體整合
可以專心開發Performance Monitoring Tool了!! (喔耶~ \(●口●)/)
但看來Context Switch的問題勢必是會被要求得解決了?! QQ
目前查了一些資料 是的確有計算Context Switch的Benchmark
(像是:LMbench)
不過還不知道其底層所實做的方法為何就是...
(倒是覺得自己越來越像是在OS Lab了... XDDD)

目前還有另外一個隱憂就是目前測試都是在x86的平台上做的
天曉得移植到板子的ARM平台後又會發生啥鬼事情?!
還有root filesystem若有缺少所需使用的Library可能也得自行想辦法加入... QQ


果然就如同學長所說的
若是他能預測老師的想法他早就畢業了...

這次報告前完全沒想到會有Context Switch相關的問題要解決
沒想到老師還是給它揪了出來!!
老師的想法果真是很難預測..... QQ

就連才要在台灣待兩個月的德國佬今天也被我們老師assign工作要做了
原本以為兩個月的時間應該光瞭解一些基礎知識就差不多要回國哩
但老師還是assign他要用SystemC做一個Flash Memory版的cache
甚至還要求能轉換成RTL下到FPGA上
(不過我想這點時間能完成SystemC modules大概就很不錯了...)

實驗室真的是越來越"強大"了!! <囧>