關于Xilinx Zynq-7000帶來的新的系統設計思路,以及Profiling的對象libjpeg,前文已經描述過了,再此不再贅述。
一. Oprofile簡介
Profiling是對不同性能特征的數據的形式化總結或分析,它通常以圖形和表的形式出現。它提供為特定的處理器事件收集的采樣百分數或數量,比如cache miss rate、TLB miss rate等等。一般來說,主要目的是為了找出軟件中的性能瓶頸,然后有針對性的優化以提升軟件的整體性能。
Oprofile 是用于 Linux 的若干種評測和性能監控工具中的一種。它可以工作在不同的體系結構上,包括ARM, PowerPC, MIPS, IA32, IA64 和 AMD Athlon等等。它的開銷很小,從Linux 2.6 版起,它被包含進了Linux內核中。
Oprofile可以收集有關處理器事件的信息,幫助用戶識別諸如循環的展開、cache的使用率低、低效的類型轉換和冗余操作、錯誤預測轉移等問題。Oprofile是一種細粒度的工具,可以為指令集或者為函數、系統調用或中斷處理例程收集采樣。Oprofile 通過取樣來工作。使用收集到的評測數據,用戶可以很容易地找出性能問題。
通過監察CPU的hardware events,oprofile可以在運行狀態下對整個Linux系統進行profiling。Profiling的對象可以是Linux kernel (包括modules和interrupt handlers), shared libraries或者應用程序。
從0.9.8版本開始,oprofile支持Perf_events profiling mode模式。應用程序operf被用來控制profiling過程;而在legacy mode下,是通過opcontrol腳本和oprofiled daemon來完成的。Operf不再象legacy mode那樣需要OProfile kernel driver,它直接和Linux Kernel Performance Events Subsystem打交道。使用operf,就可以用普通用戶的身份來profiling用戶的應用程序了,當然如果需要對整個系統來profiling的時候還是需要root權限的。
如果硬件不支持OProfile使用performance counters,OProfile就只能工作在Timer Mode下了。Timer Mode只能在legacy profiling mode下使用,即只能通過opcontrol腳本來控制。
Oprofile的website為:
可以支持的處理器的hardware event類型:
對于Zynq-7000來說, 列出了ARM Cortex-A9內核PMU(Performance Monitor Unit)所支持的所有hardware event種類,可以看出oprofile可以支持很多深入處理器內部的分析。
提供了一些oprofile生成的結果,可以方便開發者在開始使用之前了解oprofile能夠做到哪些事情。
Oprofile的詳細使用文檔:
Oprofile的優勢:
? 比較低的運行開銷
? 對被profiling的對象影響很小
? 可以profiling中斷服務程序(interrupt handlers)
? 可以profiling應用程序和shared libraries
? 可以profiling dynamically compiled (JIT) code
? 可以對整個系統做profiling
? 可以觀察CPU內部的細節,例如cache miss rate
? 可以多源代碼做annotation
? 可以支持instruction-level的profiling
? 可以生成call-graph profiles
不過OProfile也不是萬能的,它也有自己的局限性:
? 只能在x86, ARM, 和PowerPC架構上生成call graph profiles
? 不支持100%精確的instruction-level profiling
? 對dynamically compiled (JIT) code profiling的支持還不完善。
無論如何,Oprofile的功能都比gprof要強很多,代價是配置起來會比較麻煩。
二. 編譯Oprofile
首先最好在Linux kernel里面選中Oprofile driver,以獲得全面的支持。
下載Linux kernel Source:從 https://github.com/Xilinx/linux-xlnx 可以下載到Xilinx提供的驗證好的內核。如果不方便使用Linux下的git工具,可以單擊頁面上的releases找到相應的版本下載tar ball。下載的時候最好選tar.gz格式的,而不是zip格式的,因為后者在處理symbol link的時候有可能會出問題。
因為筆者使用的是Xilinx Linux pre-built 14.7,所以這里下載的是 linux-xlnx-xilinx-v14.7.tar.gz
解壓縮后,用以下命令調出Linux kernel的配置界面:
export ARCH=arm
export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
make xilinx_zynq_defconfig
make xconfig 或者make menuconfig
在配置界面上將以下兩項勾上:
General setup --->
[*] Profiling support
<*> OProfile system profiling
然后make uImage即可生成新的uImage,用來替換Xilinx Linux pre-built 14.7中的Linux kernel image。同時我們也需要vmlinux來檢查profiling的結果。
Oprofile需要popt, bfd, liberty庫,要在嵌入式單板上使用這些庫,需要手工完成交叉編譯。
針對popt 1.7,用以下命令完成編譯:
./configure --prefix=/home/wave/xilinx/oprofileprj/rootfs --host=arm-xilinx-linux-gnueabi --with-kernel-support --disable-nls && make && make install
針對binutils 2.24,用以下命令完成編譯:
./configure --host=arm-xilinx-linux-gnueabi --prefix=/home/wave/xilinx/oprofileprj/rootfs --enable-install-libbfd --enable-install-libiberty --enable-shared && make && make install
不過--enable-install-libiberty沒有效果,所以需要手工把libiberty.a和libiberty.h拷貝到相應的位置。
評論
查看更多