4.2. 監視與診斷效能問題

Red Hat Enterprise Linux 7 提供一些對系統效能與診斷跟系統記憶體相關的效能問題來說很實用的工具。本小節將概述有哪些可用的工具,以及舉例說明如何使用它們來監視與診斷跟效能問題相關的記憶體。

4.2.1. 用 vmstat 監視記憶體使用量

Vmstat」是由「 procps-ng」套件所提供。它輸出系統的程序、記憶體、分頁、區塊輸入/輸出、插斷以及 CPU 活動的報告。它也提供這台機器從上次開機後這些事件的平均報告,或是從前一次報告後開始記錄。
以下指令顯示各種事件計數器以及記憶體數據
$ vmstat -s
欲進一步了解使用 「vmstat」的細節請見〈節 A.9, “vmstat”〉或是參考 man page:
$ man vmstat

4.2.2. 用 Valgrind 設定應用程式記憶體使用量

Valgrind」是一個提供使用者空間二進位檔檢測的架構。這個架構之下有一些可以被用來設定以及分析程式效能的工具。此小節中概述的「valgrind」工具可以幫助您偵測記憶體錯誤,例如未初始化的記憶體使用以及不正確的記憶體配置或是解除配置。
要使用「valgrind」或是它的其它工具,請安裝「valgrind」套件:
# yum install valgrind

4.2.2.1. 用 Memcheck 設定記憶體使用量

Memcheck」是「valgrind」預設情況下的工具。它偵測以及對一些難以被偵測或診斷出來的記憶體錯誤做出報告,例如:
  • 不應該發生的記憶體存取
  • 使用未被定義或未被使用的數值
  • 不正確的釋出堆積記憶體
  • 指標重疊
  • 記憶體流失

注意

Memcheck」只能報告這些錯誤,它不能阻止錯誤發生。如果您的程式存取記憶體的方式通常都會導致離散錯誤,那麼這個離散錯誤仍然會發生。然而,「memcheck」會及時在錯誤發生前記錄錯誤訊息。
由於「memcheck」會使用檢測,所以用「memcheck」執行的應用程式比平常慢十到二十倍。
欲在應用程式上執行「memcheck」,請執行以下指令:
# valgrind --tool=memcheck application
您也可以使用以下選項來控制「memcheck」特定類別的問題輸出。
--leak-check
在應用程式結束執行時,「memcheck」會搜尋記憶體流失。預設值為「--leak-check=summary」,它會列印記憶體流失的數量。您可以指定「--leak-check=yes」或者「--leak-check=full」來輸出每一個記憶體流失的細節。欲停用此選項,請指定「 --leak-check=no」。
--undef-value-errors
其預設值為「--undef-value-errors=yes」。若未被定義的數值被使用,它會對此提出報告。您也可以指定「--undef-value-errors=no」,它會停用此報告也會略微加速 Memcheck。
--ignore-ranges
在檢查記憶體定址能力時指定一個或一個以上「memcheck」應該忽略的範圍,例如「--ignore-ranges=0xPP-0xQQ,0xRR-0xSS」。
欲見「memcheck」 選項的完整清單,請見包含在「/usr/share/doc/valgrind-version/valgrind_manual.pdf」的文件。

4.2.2.2. 用 Cachegrind 分析快取使用方式

Cachegrind」用系統的快取階層以及分支預測器模擬應用程式的互動。它會追蹤第一層級指令以及資料快取所模擬的使用量,進而偵測此層級的快取中較差的代碼互動。它也會追蹤最後一個層級的快取(第二或是第三層級)來追蹤記憶體的存取。因此用「cachegrind」執行的應用程式的執行速度會比平常慢二十到一百倍。
Cachegrind」收集應用程式執行期間的統計資料,並輸出摘要至主控台。要在應用程式上執行「cachegrind」,請執行以下指令:
# valgrind --tool=cachegrind application
您也可以使用以下選項來將「cachegrind」輸出集中於一個特定的問題上。
--I1
它指定第一層級指令快取的大小、關聯性以及行大小:「--I1=size,associativity,line_size」。
--D1
它指定第一層級資料快取的大小、關聯性以及線條大小:「--D1=size,associativity,line_size
--LL
它指定最後一個層級快取的大小、關聯性以及線條大小:「--LL=size,associativity,line_size」。
--cache-sim
它將啟用或者停用快取存取的集合與遺失記數。這在預設情況下是經由(「--cache-sim=yes」)被啟用。若停用這個指令與「--branch-sim」,則會讓「cachegrind」收集不到資料。
--branch-sim
它啟用或者停用分支指令的收集以及不正確的預測計數。它在預設情況下是經由(「--branch-sim=yes」)被啟用。若停用這個指令與「--cache-sim」則會讓「 cachegrind」收集不到資訊。
Cachegrind」將詳細的分析資訊寫入「cachegrind.out.pid」檔案的每一個處理序,其中「pid」為處理序的識別碼。此資訊可以透過小幫手工具「cg_annotate」來進一步處理:
# cg_annotate cachegrind.out.pid
Cachegrind」也提供 cg_diff 工具給使用者,這讓代碼改變前與改變後繪製程式效能圖表更加容易。欲比較輸出的檔案,請執行以下指令,並且以初始設定檔的輸出檔案來取代第一個檔案;用後續設定檔的輸出檔案來取代第二個檔案。
# cg_diff first second
其產生的輸出檔案可以用「cg_annotate」工具來檢視更多細節。
欲了解「cachegrind」選項的完整清單,請參考包含於「/usr/share/doc/valgrind-version/valgrind_manual.pdf」的文件。

4.2.2.3. 使用 Massif 來分析堆積與堆疊空間

Massif」會測量某一個特定的應用程式使用的堆疊空間。它會測量實用的空間以及任何其它配置於簿記以及對齊目的的其它空間。「massif」可以幫助您了解如何透過減少應用程式的記憶體使用量,來加快執行速度、減少應用程式耗盡系統切換空間的可能性。用「massif」執行的應用程式會比平常慢大約二十倍。
欲在應用程式上執行「massif」,請執行以下指令:
# valgrind --tool=massif application
您也可以使用以下選項來將「massif」集中輸出於一個特定的問題上。
--heap
它指定「massif」是否設定堆積。其預設值為「--heap=yes」。若將這個設定值設為「--heap=no」,堆積分析就會被停用。
--heap-admin
它指定每一個區塊在堆積分析被啟用時系統管理員可以使用的位元組。其預設值為「8」位元組。
--stacks
它指定「massif」是否設定堆積。其預設值為「--stack=no」,因為堆積分析會大大降低「massif」的速度。請將此選項設為「--stack=yes」來啟用堆積分析。要注意的是,「massif」採用的設定是主堆積於大小為零時開始,以便更清楚的表示與被設定的應用程式相關的堆積大小的改變。
--time-unit
它指定「massif」收集分析資料的間隔。其預設值為「i」(執行指令)。您也可以指定「ms」(毫秒,或及時)以及「B」(配置的位元組或是在堆積與堆疊上被取消配置的位元組)。測試配置的位元組對簡短執行的應用程式以及測試目的是很實用的,因為它可重現於不同的硬體上。
Massif」輸出分析資料至「massif.out.pid」檔案。「pid」是這個檔案的處理序識別碼。「ms_print」工具將此分析資料製成圖表來顯示記憶體在應用程式執行時的消耗量,同時也會顯示負責指派記憶體高峰點配置的網站的詳細資料。要將「massif.out.pid」檔案的資料製成圖表,請執行以下指令:
# ms_print massif.out.pid
欲了解「Massif」選項的完整清單,請參考包含於「/usr/share/doc/valgrind-version/valgrind_manual.pdf」的文件。