【Linux】BPF學習筆記 - 性能分析方法論[5]

本學習筆記來自於閱讀 Brendan Gregg的《BPF Performance Tools》

一、工作負載

建議執行工作負載特徵的步驟:

  • 誰造成了負載: PID,進程名稱,UID,IP地址…
  • 爲什麼稱負載: 代碼路徑,堆棧跟蹤,火焰圖
  • 負載是多少: IOPS,吞吐量,類型
  • 負載如何隨時間變化: 每個時間間隔的摘要

示例: 這表明在跟蹤時,名爲"Web Content" 的進程執行了1,725個vfs_read()

bpftrace -e 'kprobe:vfs_read { @[comm] = count(); }'
# output
“@[rtkit-daemon]: 1
[...]
@[gdbus]: 819
@[Web Content]: 1725

二、深入分析

這種方法包括檢查一個指標,然後找到將其分解成其組成部分,將最大的組成部分分解成其自己的組成部分的方法,依此類推,直到找到根本原因爲止。

類推可能有助於解釋這一點。 想象一下,您發現自己的信用卡賬單非常大。 要對其進行分析,您登錄到銀行並查看交易。 在那裏,您發現向在線書店收取的一筆大筆費用。 然後,您登錄到該書店,查看導致該數量的書,並發現您不小心購買了該書的一千本。 這是深入分析:找到線索,然後在更多線索的帶領下進行更深入的鑽探,直到問題解決。

步驟: 這通常需要定製工具, bpftrace更適合使用

  1. 從最高級別開始
  2. 檢查下一級的詳細信息
  3. 選擇最有趣的故障或線索
  4. 如果問題仍然存在,請返回步驟2

示例1: 將延遲分解爲其組件的貢獻, 您在這裏的結論可能是存儲設備是問題所在,這就是答案之一

  1. 請求等待時間爲100毫秒
  2. 在CPU上運行10毫秒, 阻塞90毫秒
  3. 在文件系統上,關閉CPU的時間爲89毫秒
  4. 文件系統在鎖定上花費了3毫秒,在存儲設備上花費了86毫秒

示例2: 深入分析也可以用來增強上下文. 現在的結論是,文件系統訪問時間戳是延遲的來源,可以被禁用(這是安裝選項)。 與得出更快的磁盤速度是必要的結論相比,這也是更好的結果

  1. 應用程序在文件系統上花費了89毫秒
  2. 文件系統在寫入文件系統時花費了78毫秒,在讀取時阻塞了11毫秒
  3. 文件系統寫入在訪問時間戳記更新上花費了77毫秒

三、使用方法

資源分析開發爲例, 對於每種資源,請檢查:1) 利用率; 2) 飽和度; 3) 錯誤

您的第一個任務是查找或繪製軟件和硬件資源圖。 然後,您可以遍歷它們,以尋求這三個指標, 下圖顯示了通用系統的硬件目標示例,包括可以檢查的組件和總線

考慮一下您當前的監視工具及其顯示上圖中每個項目的利用率,飽和度和錯誤的能力:您當前有多少個盲點?

這種方法的優勢在於,它從重要的問題開始,而不是以度量形式的答案開始,然後嘗試倒退以找出它們爲什麼重要。 它還顯示了盲點:從您要回答的問題開始,是否有方便的工具來衡量它們

四、工具

性能分析清單可以列出要運行和檢查的工具和指標,

1. LINUX 60-SECOND ANALYSIS

此清單可用於任何性能問題,並反映了我通常在登錄性能不佳的Linux系統後的最初60秒內執行的操作

uptime 當前時間,系統已經運行了多久,用戶連接數,系統在過去1,5,15分鐘內的平均負載
dmesg | tail 用於顯示開機信息
vmstat 1 顯示Linux系統虛擬內存狀態,也可以報告關於進程、內存、I/O等系統整體運行狀態
mpstat -P ALL 1 報告CPU的一些統計信息
pidstat 1 監控全部或指定進程的cpu、內存、線程、設備IO等系統資源的佔用情況
iostat -xz 1 顯示磁盤的IO
free -m 顯示的當前內存的使用
sar -n DEV 1 顯示網絡接口信息
sar -n TCP,ETCP 1 TCP統計信息, TCP錯誤統計信息
top 顯示系統上正在運行的進程

2. BCC TOOL CHECKLIST

這裏工具可以參考: GIT

execsnoop: 通過爲每個execve系統調用打印一行輸出來顯示新的進程執行。 檢查進程是否短暫.

opensnoop: 爲每個open系統調用(及其變體)打印一行輸出,包括打開的路徑的詳細信息以及它是否成功

ext4slower: 跟蹤ext4文件系統中的常見操作(讀取,寫入,打開和同步),並打印超出時間閾值的操作。 這可以識別或消除一種類型的性能問題:應用程序通過文件系統等待緩慢的單個磁盤I/O

biolatency: 跟蹤磁盤I/O延遲,即從設備發佈到完成的時間,並將其顯示爲直方圖

biolatency -m
Tracing block device I/O... Hit Ctrl-C to end.
^C
     msecs               : count     distribution
         0 -> 1          : 16335    |****************************************|
         2 -> 3          : 2272     |*****                                   |
         4 -> 7          : 3603     |********                                |
	     [...]
       512 -> 1023       : 1        |                                        |

biosnoop: 爲每個磁盤I/O打印一行輸出,詳細信息包括延遲。 這樣一來,您可以更詳細地檢查磁盤I/O,並查找按時間順序排列的模式(例如,在寫入之後進行讀取隊列)

cachestat: 每秒(或每個自定義間隔)打印一行摘要,顯示文件系統緩存中的統計信息。 使用它可以確定較低的緩存命中率和較高的未命中率

cachestat
    HITS   MISSES  DIRTIES HITRATIO   BUFFERS_MB  CACHED_MB
   53401     2755    20953   95.09%           14      90223
   49599     4098    21460   92.37%           14      90230
   [...]

tcpconnect: 爲每個活動的TCP連接打印一行輸出,詳細信息包括源地址和目標地址。 尋找可能會導致應用程序配置效率低下的意外連接或入侵者

tcpaccept: 是tcpconnect的配套工具。 它爲每個被動TCP連接(e.g. accept())打印一行輸出,詳細信息包括源地址和目標地址

tcpretrans: 爲每個TCP重傳數據包打印一行輸出,詳細信息包括源地址和目標地址以及TCP連接的內核狀態。 TCP重傳會導致延遲和吞吐量問題。 對於已建立TCP會話狀態的重傳,請查找外部網絡是否有問題

runqlat: 線程等待打開CPU的時間,然後將此時間打印爲直方圖。 可以使用此工具確定等待CPU訪問的時間長於預期,該等待時間可能由於CPU飽和,配置錯誤或調度程序問題而受到影響

profile: 是一個CPU事件探查器,它是瞭解哪些代碼路徑正在消耗CPU資源的工具。 它以一定時間間隔獲取堆棧跟蹤的樣本,並打印出唯一堆棧跟蹤的摘要以及它們的出現次數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章