43.5. 分析資料

OProfile 的系統程式 oprofiled 將會定期地收集樣本並且將它們寫入到 /var/lib/oprofile/samples/ 目錄中,在讀取資料之前,請以 root 身份執行下列指令來確定所有資料都已經被寫入到這個目錄:

opcontrol --dump

每一個樣本檔案的名稱都依據執行檔的名稱,並且以一個後面的大括弧(}) 取代每一個斜線(/)。 檔案名稱將以一個井字符號(#) 結尾,後面加上樣本檔案所使用的計數器號碼。 舉例來說,下列的檔案含有為 /sbin/syslogd 執行檔使用計數器 0 所收集的樣本資料:

}sbin}syslogd#0

可以使用下列的工具來分析收集到的樣本資料:

使用這些工具以及被分析的二元檔案來產生可以進一步分析的報告。

警告警告
 

必須使用被分析的執行檔與這些工具來分析資料,假如它必須在蒐集資料後做變更,請備份用來建立這些樣本 資料的執行檔以及樣本檔案。

對每一個執行檔的取樣都會寫入到單一的樣本檔案,對每一個動態連結的函式庫的取樣也都會寫入到單一個樣本 檔案。 當執行 OProfile 時,假如被監視的執行檔改變了,而對應該執行檔的一個樣本檔案已經存在,將會自動 刪除該既有的樣本檔案。 因此假如您需要既有的樣本檔案,您必須在升級該執行檔到新版本前,要備份舊的執行檔 以及樣本檔案。 請參考 第 43.4 節 以取得關於備份樣本檔案的詳細資訊。

43.5.1. 使用 op_time

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 選項來指定一個計數器號碼。

43.5.2. 使用 oprofpp

如要取得關於一個特定執行檔的更詳細資訊,請使用 oprofpp

oprofpp <mode> <executable>

<executable> 必須是要被分析之執行檔的完整路徑名稱, <mode> 必須是下列的其中之一:

-l

以符號列出樣本資料,例如以下為執行 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 選項結合。

-s <symbol-name>

列出特定於一個符號名稱的樣本資料,例如以下的輸出是來自 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

依符號列出比 -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 選項所輸出的資料是相同的,除了它也顯示出使用到的每一個符號與每一個 虛擬記憶體位址。 對於每一個虛擬記憶體位址,會顯示出樣本的數量以及對應該符號樣本總數的百分比。

-g <file-name>

gprof 格式產生輸出到一個檔案,假如所產生的檔案命名為 gmon.out, 可以使用 gprof 來進一步分析資料,請參考 gprof 的 man page 以取得詳細資訊。

用來進一步限制資料的其他選項如下:

-f <file-name>

使用所指定的樣本檔案 <file-name>,預設情況下,會使用 /var/lib/oprofile/samples/ 中的樣本檔案。 請使用這個選項指定來自 前一個作業階段的一個樣本檔案。

-i <file-name>

使用 <file-name> 當作要擷取資料之執行檔的名稱。

-d

解碼(demangle) C++ 符號名稱。

-D

解碼(demangle) C++ 符號名稱以及簡化 STL 函式庫解碼的名稱。

--counter <number>

從一個特定的計數器蒐集資訊,預設的計數器是 0(假如沒有指定的話)。

-o

顯示出每一個樣本在原始碼中的行號,當執行檔被編譯時,應該要使用 GCC 的 -g 選項。 否則這個選項無法顯示出行號。 沒有任何的 Red Hat Enterprise Linux 執行檔是預設編譯這個選項的。

vma      samples  %      symbol name        linear info
0806cbb0 0        0      _start             ../sysdeps/i386/elf/start.S:47
-e <symbol-name>

排除輸出中以逗號分隔開的符號列表。

-k

顯示另一個欄位來放置共享函式庫,只在當您設定 OProfile 時指定 --separate=libraryopcontrol 時,以及當 --dump-gprof-file 選項並不與這個選項 一起使用時,這個選項才會產生結果。

-t <format>

以特定的欄位順序來顯示輸出,這個選項不可以與 -g 一併使用。

使用下列的字母來代表欄位:

字母說明
v虛擬記憶體位址
s樣本的數量
S樣本的累積數量
p樣本數對執行檔的總樣本數的百分比
P樣本數對執行檔的總樣本數的累積百分比
q樣本數對所分析之所有執行檔的百分比
Q樣本數對所分析之所有執行檔的累積百分比
n符號名稱
l原始檔案的名稱與行數(包括完整路徑)
L原始碼檔名與行數的根基名稱
i執行檔的名稱(包括完整路徑)
I執行檔的根基名稱
d樣本的詳細資訊
h顯示出欄位表頭

表格 43-4. 字母代表欄位順序

--session <name>

請指定工作階段的完整路徑或對應到 /var/lib/oprofile/samples/ 目錄的一個目錄。

-p <path-list>

請指定要被分析之執行檔位置以逗號分隔的路徑清單。

43.5.3. 使用 op_to_source

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 以取得額外命令列選項的清單。

43.5.4. 使用 op_merge

假如同一個執行檔或函式庫擁有多個樣本檔案,可以合併樣本檔案以便利分析的工作。

舉例來說,如要合併 /usr/lib/library-1.2.3.so 函式庫的檔案,請以 root 身份執行下列指令:

op_merge /usr/lib/library-1.2.3.so

所產生的檔案將是 /var/lib/oprofile/samples/}usr}lib}library-1.2.3.so

如要限制合併到一個特定計數器的樣本,請使用 -c 後面加上計數器號碼。