oprofile 使用之二(run 使用事件取樣)

2021-08-26 07:44:44 字數 2626 閱讀 1199

簡介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 ...