本學習筆記來自於閱讀 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
更適合使用
- 從最高級別開始
- 檢查下一級的詳細信息
- 選擇最有趣的故障或線索
- 如果問題仍然存在,請返回步驟2
示例1: 將延遲分解爲其組件的貢獻, 您在這裏的結論可能是存儲設備是問題所在,這就是答案之一
- 請求等待時間爲100毫秒
- 在CPU上運行10毫秒, 阻塞90毫秒
- 在文件系統上,關閉CPU的時間爲89毫秒
- 文件系統在鎖定上花費了3毫秒,在存儲設備上花費了86毫秒
示例2: 深入分析也可以用來增強上下文. 現在的結論是,文件系統訪問時間戳是延遲的來源,可以被禁用(這是安裝選項)。 與得出更快的磁盤速度是必要的結論相比,這也是更好的結果
- 應用程序在文件系統上花費了89毫秒
- 文件系統在寫入文件系統時花費了78毫秒,在讀取時阻塞了11毫秒
- 文件系統寫入在訪問時間戳記更新上花費了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資源的工具。 它以一定時間間隔獲取堆棧跟蹤的樣本,並打印出唯一堆棧跟蹤的摘要以及它們的出現次數