簡介oprofile
oprofile 是 linux 平台上的乙個功能強大的效能分析工具, 支援兩種取樣(sampling)方式:基於事件的取樣(event based)和基於時間的取樣(time based)。
基於事件的取樣是oprofile只記錄特定事件(比如l2 cache miss)的發生次數,當達到使用者設定的 定值時oprofile 就記錄一下(採乙個樣)。這種方式需要cpu 內部有效能計數器(performace counter)。
基於時間的取樣是oprofile 借助os 時鐘中斷的機制,每個時鐘中斷 oprofile 都會記錄一次(採一次樣)。引入的目的在於,提供對沒有效能計數器 cpu 的支援。其精度相對於基於事件的取樣要低。因為要借助 os 時鐘中斷的支援,對禁用中斷的**oprofile不能對其進行分析。
執行問題
交叉編譯成功,並初步執行成功,不代表整個程式沒有任何後顧之憂。
下一步開始分析軟體效能
1. 優先選擇事件取樣,因為它效能好精度高。
2.opcontrol --init 插入oprofile.ko驅動 掛載oprofilefs
3.opcontrol --setup --event=cpu_cycles:1000::0:1 --session-dir=/opt/gtk/testop/ 設定使用cpu週期事件取樣 並且把取樣資訊輸出到/opt/gtk/testop/中
4.使用如下**儲存成multiply.c 編譯 arm-linux-gcc -g multiply.c -omultiply.arm
int fast_multiply(x, y)/multiply.c
int slow_multiply(x, y)
int main()
}return 0;
}5.執行如下命令
opcontrol --start && ./multiply.arm && opcontrol --dump && opcontrol --stop
啟動取樣 執行程式 轉儲取樣資訊 停止取樣
6.執行如下命令
opannotate --source ./multiply.arm 進行取樣資訊分析
卻怎麼也分析不到資料
總是提示如下錯誤
error: no sample files found: profile specification too strict ?
查了一下oprofile的faq( 綜合我們現在的情況大致意思是說我們的引數沒有配置正確
7.解決問題
為了驗證我們的各個軟體的版本 binutils oprofile kernel popt的版本是否正確我們在x86的機器上進行了編譯執行的實驗,使用如上的的軟體原始碼和測試** 使用方法,成功的列印出如下資訊
說明我們的方法沒有錯誤
8.深入分析
綜上所屬,總結出結論在x86 和 arm 上的區別在於體系結構的差別,計畫分析核心模組oprofile.ko在取樣上的方式。
9.分析x86上取樣的方式
我pc機的核心版本是2.6.26
經過printk列印最終定位為
arch/x86/oprofile/op_model_ppro.c +119 的
static int ppro_check_ctrs(struct pt_regs * const regs,
struct op_msrs const * const msrs)
函式中呼叫函式oprofile_add_sample向oprofilefs檔案系統進行資訊轉儲供後面的分析器(eg. opannotate)使用的
因為在注釋掉這句以後x86執行上述操作也不再有資訊上傳,分析得到的結果也是
error: no sample files found: profile specification too strict ? 這樣的錯誤
10.分析arm上取樣的工作方式
經過分析,arm上的工作方式大致是 先配置performance monitor unit 的暫存器,然後註冊中斷,到了事件到來的時候
中斷就會被觸發然後中斷處理函式會呼叫oprofile_add_sample向oprofilefs檔案系統進行資訊轉儲供後面的分析器
(eg.opannotate)使用
在arm11的中斷註冊處理函式裡面卻沒有發現中斷處理函式
static irqreturn_t arm11_pmu_interrupt(int irq, void *arg) 被呼叫,因為只有這個函式呼叫oprofile_add_sample才會被呼叫
沒有資料樣本被取樣,所以沒有結果輸出,查中斷註冊的地方結果發現了如下**
static int irqs = ;
ret = arm11_request_interrupts(irqs, array_size(irqs));
int arm11_request_interrupts(int *irqs, int nr)
}if (i != nr)
while (i-- != 0)
free_irq(irqs[i], null);
return ret;
}陣列irqs裡面使用了預編譯,也就是說這個中斷只支援特定的cpu而不是通用的arm11核。
我們的機器不是omap2系列自然中斷沒有被註冊。
結論: 我們的硬體無法支援事件取樣,只能使用下面的基於時間的取樣。
oprofile 使用之三(注意事項)
1.在檔案系統 etc下建立符號鏈結 ln sf proc mounts mtab 同時確保檔案系統中存在如下共享庫 libdl.so.2 libstdc so.6 libm.so.6 libgcc s.so.1 libc.so.6。2.由於oprofile編譯時採用的是絕對路徑,在編譯時設定的安裝...
QCustomPlot的使用之二
之前介紹過基於qt的繪圖控制項qcustomplot的強大功能,詳見我之前的文章qt中關於繪圖表qcustomplot的使用。今天突然翻出來,熟悉了一下,順便寫了個demo做為記錄。qcustomplot採用圖層的方式繪製影象,通過addgraph 新增圖層資訊,然年後通過graph int 獲取新...
Mybatis框架的使用之二(簡單查詢)
在mybatis基礎環境搭建完成之後,就可以進行使用了。首先確保資料庫的表已經全部對應到pojo的類了。且類的屬性名與表的列名完全匹配。首先進行乙個最簡單的查詢,查詢乙個表中的列數,語句如下 select count 1 from 表名 要完成這個步驟,首先需要建立乙個用於呼叫的介面inte ce ...