用於 Linux ftrace 和 perf_events(又稱“perf”命令)的正在開發且不支援的效能分析工具的各種集合。 ftrace 和 perf 都是核心 Linux 追蹤工具,包含在內核原始碼中。您的系統可能已經有 ftrace,而 perf 通常只是一個套件添加(請參閱先決條件)。
這些工具旨在易於安裝(最少的依賴項)、提供高級性能可觀察性並且易於使用:做一件事並做好它。該集合由 Brendan Gregg(DTraceToolkit 的作者)創建。
其中許多工具都採用了變通方法,以便在現有的 Linux 核心上實作功能。因此,許多工具都有警告(請參閱手冊頁),並且在添加未來的核心功能或新的追蹤子系統之前,它們的實作應被視為佔位符。
這些適用於 Linux 3.2 和更新的核心。有關 Linux 2.6.x,請參閱警告。
這些工具在 USENIX LISA 2014 演示中介紹:Linux 效能分析:新工具和舊秘密
使用 ftrace:
使用 perf_events:
使用 eBPF:
顯示新流程和參數:
# ./execsnoop 追蹤 exec()。 Ctrl-C 結束。 PID PPID 參數 22898 22004 男人 ls 22905 22898 預轉換 -e UTF-8 22908 22898 尋呼機 -s 22907 22898 nroff-mandoc-rLL=164n-rLT=164n-Tutf8 22906 22898 桌 22911 22910 區域設置魅力圖 22912 22907 groff -mtty-char -Tutf8 -mandoc -rLL=164n -rLT=164n 22913 22912 troff -mtty-char -mandoc -rLL=164n -rLT=164n -Tutf8 22914 22912 糟糕
測量從佇列插入到完成的區塊裝置 I/O 延遲:
# ./iolatency -Q 追蹤區塊 I/O。每1秒輸出一次。 Ctrl-C 結束。 >=(ms) .. <(ms) :I/O |分配| 0 -> 1 : 1913 |##########################################| 1 -> 2 : 438 |########## | 2 -> 4 : 100 |## | 4 -> 8 : 145 |### | 8 -> 16 : 43 |# | 16 -> 32 : 43 |# | 32 -> 64 : 1 |# | [...]
追蹤 block:block_rq_insert 追蹤點,使用核心堆疊跟踪,並且僅用於讀取:
# ./tpoint -s block:block_rq_insert 'rwbs ~ "*R*"' cksum-11908 [000] d...7269839.919098:block_rq_insert:202,1 R 0()736560 + 136 [cksum] cksum-11908 [000] d...7269839.919107: => __elv_add_request => blk_flush_plug_list => blk_finish_plug => __do_page_cache_readahead => ondemand_readahead => page_cache_async_readahead => generic_file_read_iter => new_sync_read => vfs_read => SyS_read => 系統呼叫快速路徑 [...]
統計以「bio_」開頭的核心函數呼叫次數,每秒匯總:
# ./funccount -i 1 'bio_*' 追蹤“bio_*”... Ctrl-C 結束。 功能計數 bio_attempt_back_merge 26 Bio_get_nr_vecs 361 生物分配 536 Bio_alloc_bioset 536 生物_endio 536 生物免費536 Bio_fs_析構函數 536 生物初始化536 第536章 536 生物放置 729 生物添加頁 1004 [...]
範例目錄中還有更多範例。另請參閱手冊頁。
意圖盡可能少。例如,沒有 debuginfo 的 Linux 3.2 伺服器。有關詳細信息,請參閱工具手冊頁。
FTRACE 在核心中配置。您可能已經在您的核心版本中配置了此配置並可用,因為 FTRACE 是在 2.6.27 中首次新增的。這需要 CONFIG_FTRACE 和其他 FTRACE 選項,具體取決於工具。某些工具(例如 funccount)需要 CONFIG_FUNCTION_PROFILER。
需要安裝“perf”指令。它位於 linux-tools-common 包中。安裝後,perf 可能會告訴您安裝額外的 linux-tools 軟體套件 (linux-tools- kernel_version )。 perf 也可以在核心原始碼中的tools/perf 下建置。有關讓 perf_events 充分發揮作用的更多詳細信息,請參閱 perf_events 先決條件。
需要啟用 CONFIG_DEBUG_FS 選項的核心。與 FTRACE 一樣,這可能已經啟用(debugfs 已在 2.6.10-rc3 中新增)。還需要安裝 debugfs:
# mount -t debugfs none /sys/kernel/debug
其中許多腳本都使用 awk,並且會根據所需的行為嘗試使用 mawk 或 gawk:mawk 用於緩衝輸出(因為其速度),gawk 用於同步輸出(如 fflush() 工作,允許更有效地分組)寫道)。
這些只是腳本。要嘛抓住一切:
git clone --depth 1 https://github.com/brendangregg/perf-tools
或使用 github 上的原始連結下載單一腳本。例如:
wget https://raw.githubusercontent.com/brendangregg/perf-tools/master/iosnoop
這會保留選項卡(複製貼上可能會弄亂)。
Ftrace 首次加入到 Linux 2.6.27,perf_events 首次加入到 Linux 2.6.31。這些早期版本存在內核錯誤,並且在 2.6.32 系列內核上報告了鎖定和恐慌。這包括 CentOS 6.x。如果您必須分析較舊的內核,這些工具可能僅在容錯環境中有用,例如具有模擬問題的實驗室。這些工具主要是在 Linux 3.2 及更高版本的核心上開發的。
根據工具的不同,也可能產生開銷。請參閱下一節。
perf_events 正在不斷發展。該集合大約在 Linux 3.16 左右開始開發,以 Linux 3.2 伺服器為主要目標,當時 perf_events 缺乏某些程式功能(例如,自訂核心聚合)。這些可能會被添加到即將發布的核心版本中。在那之前,許多工具都採用變通方法、技巧和技巧來運作。其中一些工具將事件資料傳遞到用戶空間進行後處理,這比核心聚合的開銷要高得多。每個工具的開銷在其手冊頁中進行了描述。
警告:在極端情況下,使用這些工具時您的目標應用程式的運行速度可能會慢 5 倍。根據工具和核心版本的不同,還可能有核心崩潰的風險。請閱讀程式頭中的警告,並在使用前進行測試。
如果開銷是個問題,可以改進這些工具。如果工具還沒有,可以用 C 重寫它,以使用 perf_events_open() 和 mmap() 作為追蹤緩衝區。它還可以用 C 語言實現頻率計數,並直接對 mmap() 進行操作,而不是使用 awk/Perl/Python。基於 ftrace 的工具還可以進行其他改進,例如使用快照和每個實例緩衝區。
其中一些工具旨在作為短期解決方法,直到出現更多內核功能為止,此時可以對它們進行大幅重寫。對於較舊的核心版本,這些工具的較舊版本將保留在此儲存庫中。
由於我的主要目標是一組沒有 debuginfo 的 Linux 3.2 伺服器,因此這些工具盡量不需要它。有時,這使得該工具比需要的更脆弱,因為我正在使用變通方法(可能是特定於核心版本和平台的)而不是使用 debuginfo 資訊(可以是通用的)。有關每個工具的詳細先決條件,請參閱手冊頁。
我嘗試盡可能使用 perf_events (“perf”),因為該介面是為多用戶使用而開發的。由於各種原因,我經常需要使用 ftrace。 ftrace 非常強大(感謝 Steven Rostedt!),並且並非它的所有功能都是透過 perf 公開的,或者是常用的。該工具集在某種程度上展示了使用 ftrace 隱藏的 Linux 功能。
由於情況正在發生變化,您很可能會發現某些工具無法在您的 Linux 核心版本上運行。修復它們需要一些專業知識和組裝。
案例研究和總結:
相關文章: