43.2. 設定 OProfile

在執行 OProfile 之前,必須先做好設定。 至少要選取監視核心的狀況(或選取不監視核心)。 以下的部份 將說明如何使用 opcontrol 工具程式來設定 OProfile。 當您執行 opcontrol 指令時,設定的選項將會儲存到 /root/.oprofile/daemonrc 檔案中。

43.2.1. 指定核心

首先,請設定是否要監視核心的狀況,這是在啟動 OProfile 前唯一必要的設定選項,所有其他的設定皆為可選的。

如要監視核心,請以 root 身份執行下列指令:

opcontrol --vmlinux=/boot/vmlinux-`uname -r`

如要設定 OProfile 不監視核心,請以 root 身份執行下列指令:

opcontrol --no-vmlinux

這個指令也會載入 oprofile 核心模組(假如尚未載入的話),並且建立 /dev/oprofile/ 目錄(假如原本不存在的話)。 請參考 第 43.6 節 以取得關於這個目錄的詳細資訊。

注請注意
 

即使 OProfile 被設定為不分析核心的使用狀況,仍然必須要執行 SMP 核心,以使得 oprofile 模組可以被載入。

設定是否要從核心收集樣本資料只會改變收集到何種資料,而不會改變如何或在何處儲存收集到的資料。 如要 為核心與應用程式函式庫產生不同的樣本檔案,請參考 第 43.2.3 節

43.2.2. 設定要監視的系統事件

大部分的處理器都含有計數器,可以被 OProfile 使用來監視特定的系統事件。 如 表格 43-2 所示,可以使用的計數器數目取決於處理器。

處理器cpu_type記數器的數量
Pentium Proi386/ppro2
Pentium IIi386/pii2
Pentium IIIi386/piii2
Pentium 4 (不含超執行緒功能)i386/p48
Pentium 4 (含超執行緒功能)i386/p4-ht4
Athloni386/athlon4
AMD64x86-64/hammer4
Itaniumia64/itanium4
Itanium 2ia64/itanium24
TIMER_INTtimer1
IBM eServer iSeriestimer1
IBM eServer pSeriestimer1
IBM eServer S/390timer1
IBM eServer zSeriestimer1

表格 43-2. Profile 處理器與記數器

使用 表格 43-2 來檢驗已偵測到正確的處理器類型,並且決定同時可以 監視的系統事件數量。 假如處理器沒有已支援的效能監視硬體,可以使用 timer 當作處理器的類型。

假如使用了 timer,無法為任何的處理器設定系統事件,因為硬體不含有 支援的硬體效能計數器,則會使用計時器的中斷值來做系統分析。

假如沒有使用 timer 來當作處理器類型,您可以改變所監視的系統事件, 而且預設將會為處理器的計數器 0 設定給一個時間為基礎的事件。 假如處理器上有一個以上的計數器,除了 計數器 0 外的其他計數器預設將不會設定給任何事件。 預設監視的系統事件如 表格 43-3 所示。

處理器計數器 0 的預設系統事件說明
Pentium Pro, Pentium II, Pentium III, Athlon, AMD64CPU_CLK_UNHALTED處理器的時鐘並未停止
Pentium 4 (HT 與 non-HT), Intel® EM64TGLOBAL_POWER_EVENTS處理器未停止運轉的時間
Itanium 2CPU_CYCLESCPU 週期
TIMER_INT(none)每一個計時器中斷值的樣本

表格 43-3. 預設的系統事件

同一時間可以監視的系統事件數量是由處理器的計數器數量來決定的,然而這並不是一對一的關係,在某些 處理器上,某些事件必須對應到特定的計數器。 如要找出可使用的計數器數量,請執行下列指令:

cat /dev/oprofile/cpu_type

取決於處理器的類型,可以使用的系統事件也不同,如要找出用作系統分析的系統事件,請以 root 身份執行 下列指令(這個清單是決定在系統的處理器類型):

op_help

可以透過命令列或一個圖形介面來設定每一個計數器的事件,假如無法設定計數器給一個特定的事件,將會顯示 一個錯誤訊息。

如要透過命令列為每一個可設定的計數器設定系統事件,請使用 opcontrol

opcontrol --ctrlN-event=<event-name>

請以計數器號碼(以 0 開始)取代 N,並且以 op_help 中確實的事件名稱取代 <event-name>

43.2.2.1. 取樣的頻率

預設情況下,會選取一個時間為基礎的事件組,它可以在每一處理器上每一秒建立大約 2000 個樣本。 假如使用 計時器的中斷值,該計時器將會設定為瞬間頻率,而且這不是使用者可以自己設定的。 假如 cpu_type 不是 timer,每一個事件 可以擁有一個取樣頻率,這個取樣頻率是在每一個取樣間的事件數量。

當您為計數器設定系統事件時,您也可以指定一個取樣頻率:

opcontrol --ctrN-event=<event-name> --ctrN-count=<sample-rate>

請以重新取樣前的系統事件數量取代 <sample-rate>,這個數值越小代表 取樣的頻率越高。 至於並未經常發生的事件,您便需要一個較低頻率來補捉事件的發生。

注意警示
 

當您設定取樣頻率時,請特別的小心,如果設定的取樣頻率太頻繁將會超載系統,而導致系統類似當機的情形, 或者是導致系統真正當機。

43.2.2.2. 單位遮罩

假如 cpu_type 不是 timer, 也許需要 單位遮罩 來進一步定義系統事件。

每一個事件的單位遮罩被列出在 op_help 中,每一個單位遮罩的數值是以十六進制的格式 列出的。 如要指定一個以上的單位遮罩,必須使用一個逐位元 or 的操作來與十六進制 數值結合。

opcontrol --ctrN-event=<event-name> --ctrN-count=<sample-rate> --ctrN-unit-mask=<value>

43.2.3. 分隔核心與使用者空間的系統分析

預設情況下,對每一個事件都會蒐集核心模式與使用者模式的資訊。 如要設定 OProfile 在一個特定的計數器 上不監視核心模式的事件,請執行下列指令(這裡的 N 就是計數器號碼):

opcontrol --ctrN-kernel=0

請執行下列指令來再度啟動核心模式的系統分析:

opcontrol --ctrN-kernel=1

如要設定 OProfile 不要為一個特定的計數器監視使用者模式的系統事件,請執行下列指令(這裡的 N 就是計數器號碼):

opcontrol --ctrN-user=0

請執行下列指令來再度為計數器啟動使用者模式的系統分析:

opcontrol --ctrN-user=1

當 OProfile 系統程式寫入系統分析資料到樣本檔案時,它可以分開核心與函式庫分析資料到不同的樣本檔案。 如要設定這個系統程式如何寫入樣本檔案,請以 root 身份執行下列指令:

opcontrol --separate=<choice>

<choice> 可以是下列的其中之一:

假如使用了 --separate=library,樣本檔案的名稱將會含有執行檔的名稱與函式庫的名稱。