Oprofile使用
1 介紹
Oprofile是linux上的性能監測工具,通過CPU硬件提供的性能計數器對事件進行采樣,從代碼層面分析程序的性能消耗情況,找出程序性能的問題點。
2 oprofile安裝
RHEL6.8GA上直接提供了安裝包,配置好yum源直接安裝即可。
yum install oprofile
3 oprofile使用
- 設置檢測事件
opcontrol --event=<event-name>:<sample-rate>:<unit-mask>:<kernel>:<user>
各字段含義如下:
event-name | 事件名稱,如CPU_CLK_UNHALTED,支持的事件列表可以通過opcontrol --list-events命令列出 |
---|---|
sample-rate | 觸發一次采樣的事件計數值,如100000 |
unit-mask | 硬件單元掩碼,如0x0F |
kernel | 是否對內核進行監測,取值0或1 |
user | 是否對用戶空間進行監測,取值0或1 |
實際檢測案例:
opcontrol --event=CPU_CLK_UNHALTED:6000:0x00:0:1 #對core cycle進行profile
- 開始檢測啟動
opcontrol --init #加載模塊
opcontrol --reset #清除當前會話中的數據
opcontrol --start #開始profiling
注:如果opcontrol –start報錯,可以使用以下命令解決
opcontrol --deinit
echo 0 > /proc/sys/kernel/nmi_watchdog
- 保存檢測數據
程序業務執行完成后,使用下面的命令將監測數據轉儲下來:
opcontrol --dump #把收集到的數據寫入文件
- 停止檢測
opcontrol –stop #停止profiling
opcontrol –shutdown #關閉守護進程oprofiled
opcontrol –deinit #卸載模塊
4 oprofile其他用法
除了監測事件以外,oprofile還提供了以下的使用
- 是否監測內核文件
當要對內核進行監測時,需要指定內核的文件路徑,使用下面的命令(其中file為內核文件完整路徑):
opcontrol --vmlinux=file
如果不需要對內核進行性能監測,則此處直接使用--no-vmlinux參數:
opcontrol --no-vmlinux
- 設置監測數據分離方式
opcontrol --separate=<choice>
<choice> 有幾下幾個參數:
none | do not separate the profiles (default) |
---|---|
library | generate per-application profiles for libraries |
kernel | generate per-application profiles for the kernel and kernel modules |
all | generate per-application profiles for libraries and per-application profiles for the kernel and kernel modules |
例:
Opcontrol --separate=library
- oprofile更多用法使用opcontrol –help查看
5 性能數據分析
監測數據轉儲后,即可以通過opreport
和opannotate
命令查看性能消耗情況了。
1) 顯示各模塊整體的性能消耗情況
opreport
2) 顯示各函數的性能消耗情況
opreport -l
3) 顯示代碼級別的性能消息情況
opannotate -s
6 腳本實例
下面的腳本是以前測試過程中臨時寫的,采集的思路可供參考。
LOGFILE="/tmp/OProfile_LOG"
DURATION=600
echo "start OProfile ($DURATION s)"
echo "set up OProfile"
opcontrol --deinit 2>> $LOGFILE -- 加載
modprobe oprofile timer=1
opcontrol --setup --vmlinux=/usr/lib/debug/lib/modules/`uname -r`/vmlinux -- 設置跟蹤vmlinux
opcontrol -c 0
opcontrol –reset --清空當面的信息
echo "start OProfile"
opcontrol --start >> $LOGFILE 2>&1 -- 開始跟蹤
sleep $DURATION
echo "shutdown OProfile"
opcontrol --shutdown >> $LOGFILE 2>&1 -- 結束跟蹤
echo "report OProfile"
opreport -l > $OUTDIR/opreport_-l.txt 2>> $LOGFILE --以函數的角度顯示檢測結果
echo "oprofile temp data size: $(du -sh /var/lib/oprofile)"
echo "cleanup OProfile"
opcontrol --reset
opcontrol --deinit 2>> $LOGFILE
echo "finish OProfile"
參考文獻
注:如需轉載,請標注出處。