OProfile 的系統程式 oprofiled 將會定期地收集樣本並且將它們寫入到 /var/lib/oprofile/samples/ 目錄中,在讀取資料之前,請以 root 身份執行下列指令來確定所有資料都已經被寫入到這個目錄:
opcontrol --dump |
每一個樣本檔案的名稱都依據執行檔的名稱,並且以一個後面的大括弧(}) 取代每一個斜線(/)。 檔案名稱將以一個井字符號(#) 結尾,後面加上樣本檔案所使用的計數器號碼。 舉例來說,下列的檔案含有為 /sbin/syslogd 執行檔使用計數器 0 所收集的樣本資料:
}sbin}syslogd#0 |
可以使用下列的工具來分析收集到的樣本資料:
op_time
oprofpp
op_to_source
op_merge
使用這些工具以及被分析的二元檔案來產生可以進一步分析的報告。
![]() | 警告 |
---|---|
必須使用被分析的執行檔與這些工具來分析資料,假如它必須在蒐集資料後做變更,請備份用來建立這些樣本 資料的執行檔以及樣本檔案。 |
對每一個執行檔的取樣都會寫入到單一的樣本檔案,對每一個動態連結的函式庫的取樣也都會寫入到單一個樣本 檔案。 當執行 OProfile 時,假如被監視的執行檔改變了,而對應該執行檔的一個樣本檔案已經存在,將會自動 刪除該既有的樣本檔案。 因此假如您需要既有的樣本檔案,您必須在升級該執行檔到新版本前,要備份舊的執行檔 以及樣本檔案。 請參考 第 43.4 節 以取得關於備份樣本檔案的詳細資訊。
op_time 工具提供被分析之所有執行檔的一個概要。
以下為一個範例輸出的部份:
581 0.2949 0.0000 /usr/bin/oprofiled 966 0.4904 0.0000 /usr/sbin/cupsd 1028 0.5218 0.0000 /usr/sbin/irqbalance 1187 0.6026 0.0000 /bin/bash 1480 0.7513 0.0000 /usr/bin/slocate 2039 1.0351 0.0000 /usr/lib/rpm/rpmq 6249 3.1722 0.0000 /usr/X11R6/bin/XFree86 8842 4.4885 0.0000 /bin/sed 31342 15.9103 0.0000 /usr/bin/gdmgreeter 58283 29.5865 0.0000 /no-vmlinux 82853 42.0591 0.0000 /usr/bin/perl |
每一個執行檔都被列出在單獨的一行,第一個欄位是為該執行檔所紀錄的樣本數量,第二個欄位是這些樣本對 總樣本數的百分比,第三個欄位不使用,而第四個欄位就是執行檔的名稱。
請參考 op_time 的 man page,以取得可使用之命令列選項的列表,例如 -r 選項可以使用來排序擁有最多樣本到最少樣本的執行檔。 可以使用 -c 選項來指定一個計數器號碼。
如要取得關於一個特定執行檔的更詳細資訊,請使用 oprofpp:
oprofpp <mode> <executable> |
<executable> 必須是要被分析之執行檔的完整路徑名稱, <mode> 必須是下列的其中之一:
以符號列出樣本資料,例如以下為執行 oprofpp -l /usr/X11R6/bin/XFree86 指令的 部份輸出:
vma samples % symbol name ... 08195d10 4 3.0303 miComputeCompositeClip 080b9180 5 3.78788 Dispatch 080cdce0 5 3.78788 FreeResource 080ce4a0 5 3.78788 LegalNewID 080ce640 5 3.78788 SecurityLookupIDByClass 080dd470 9 6.81818 WaitForSomething 080e1360 12 9.09091 StandardReadRequestFromClient ... |
第一個欄位是開頭的虛擬記憶體位址(vma),第二個欄位是該符號的樣本數,第三個欄位是這個符號的樣本數對 執行檔的所有樣本數的百分比,而第四個欄位是符號名稱。
如要排序輸出從最多的樣本數到最少的樣本數(相反順序),請使用 -r 選項與 -l 選項結合。
列出特定於一個符號名稱的樣本資料,例如以下的輸出是來自 oprofpp -s StandardReadRequestFromClient /usr/X11R6/bin/XFree86 指令:
vma samples % symbol name 080e1360 12 100 StandardReadRequestFromClient 080e1360 1 8.33333 080e137f 1 8.33333 080e13bb 1 8.33333 080e13f4 1 8.33333 080e13fb 1 8.33333 080e144a 1 8.33333 080e15aa 1 8.33333 080e1668 1 8.33333 080e1803 1 8.33333 080e1873 1 8.33333 080e190a 2 16.6667 |
第一行是『符號/執行檔』組合的一個摘要。
第一個欄位含有所取樣的虛擬記憶體位址,第二個欄位是對該記憶體位址的樣本數量,第三個欄位是該記憶體位址 的樣本數對該符號的所有樣本數的百分比。
依符號列出比 -l 更詳細的樣本資料,例如:
vma samples % symbol name 08083630 2 1.51515 xf86Wakeup 08083641 1 50 080836a1 1 50 080b8150 1 0.757576 Ones 080b8179 1 100 080b8fb0 2 1.51515 FlushClientCaches 080b8fb9 1 50 080b8fba 1 50 ... |
這個資料與 -l 選項所輸出的資料是相同的,除了它也顯示出使用到的每一個符號與每一個 虛擬記憶體位址。 對於每一個虛擬記憶體位址,會顯示出樣本的數量以及對應該符號樣本總數的百分比。
以 gprof 格式產生輸出到一個檔案,假如所產生的檔案命名為 gmon.out, 可以使用 gprof 來進一步分析資料,請參考 gprof 的 man page 以取得詳細資訊。
用來進一步限制資料的其他選項如下:
使用所指定的樣本檔案 <file-name>,預設情況下,會使用 /var/lib/oprofile/samples/ 中的樣本檔案。 請使用這個選項指定來自 前一個作業階段的一個樣本檔案。
使用 <file-name> 當作要擷取資料之執行檔的名稱。
解碼(demangle) C++ 符號名稱。
解碼(demangle) C++ 符號名稱以及簡化 STL 函式庫解碼的名稱。
從一個特定的計數器蒐集資訊,預設的計數器是 0(假如沒有指定的話)。
顯示出每一個樣本在原始碼中的行號,當執行檔被編譯時,應該要使用 GCC 的 -g 選項。 否則這個選項無法顯示出行號。 沒有任何的 Red Hat Enterprise Linux 執行檔是預設編譯這個選項的。
vma samples % symbol name linear info 0806cbb0 0 0 _start ../sysdeps/i386/elf/start.S:47 |
排除輸出中以逗號分隔開的符號列表。
顯示另一個欄位來放置共享函式庫,只在當您設定 OProfile 時指定 --separate=library 給 opcontrol 時,以及當 --dump-gprof-file 選項並不與這個選項 一起使用時,這個選項才會產生結果。
以特定的欄位順序來顯示輸出,這個選項不可以與 -g 一併使用。
使用下列的字母來代表欄位:
請指定工作階段的完整路徑或對應到 /var/lib/oprofile/samples/ 目錄的一個目錄。
請指定要被分析之執行檔位置以逗號分隔的路徑清單。
op_to_source 工具試著要對照特定指示的樣本到原始碼中所對應的行,所產生的結果 檔案應該擁有這些行的樣本在左邊。 它也在每一個功能函數的開頭放置一個註解,以列出此功能函數的所有 樣本。
為了要使用這個工具程式,必須以 GCC 的 -g 選項編譯這個執行檔。 預設情況下,Red Hat Enterprise Linux 的套件並不編譯這個選項。
op_to_source 的一般語法如下:
op_to_source --source-dir <src-dir> <executable> |
必須指定含有要進行分析之原始碼與執行檔的目錄,請參考 op_to_source 的 man page 以取得額外命令列選項的清單。