strace 和 perf:Linux 疑難排解小抄
13 分鐘閱讀 - 2026年6月4日

何時在 Linux 上使用 strace vs perf、您實際會執行的指令,以及在調試繁忙的生產伺服器時如何降低開銷。
Linux 故障排除的 strace 與 perf
當 Linux 伺服器運行緩慢、發生當機或 CPU 負載過高,而應用程式日誌無法解釋原因時,有兩項工具能填補大部分的資訊缺口。 strace strace 會告訴您某個程序正在向核心請求什麼。 perf 則能告訴您 CPU 的運算時間花在何處。兩者結合,能以最簡便的方式解答「為何卡住」與「正在執行什麼」這兩個問題,這是其他工具無法比擬的。
本文將探討何時該使用哪種工具、如何安裝它們、實際需要執行的指令,以及如何在運行中的伺服器上將系統開銷控制在合理範圍內。
何時該使用 strace 與 perf
區別很簡單。請使用 perf 當 CPU 處於繁忙狀態,且您需要釐清是哪個函式導致此狀況時。使用 strace perf
perf perf 會以可設定的頻率採樣核心的硬體計數器,因此開銷通常低於 1%,在生產環境中執行也相當安全。 strace 則會透過 ptrace,這可能會使目標進程的速度降低 10 倍至 100 倍。請在運行中的系統上謹慎使用,且務必搭配篩選器。
| 症狀 | 從 | 後續步驟 |
|---|---|---|
| CPU 使用率過高 | perf top 或 perf record -g | strace -c 針對熱點程序 |
| 磁碟或 I/O 等待過慢 | perf stat 因快取未命中 | strace -e trace=file |
| 程序掛起或靜默錯誤 | strace -e trace=file,network | perf stat 以排除 CPU 負載過高 |
| 鎖競爭或 API 執行緩慢 | strace -c,請留意 futex | perf record -g |
安裝 strace 和 perf
這兩項工具皆位於標準軟體庫中。strace 依賴 ptrace syscall,該函式多年來已成為每個現代核心的組成部分。perf 使用 perf_events 介面,並需要與您當前運行核心版本相符的套件。
sudo apt install strace linux-tools-common linux-tools-$(uname -r)
sudo dnf install strace perf
$(uname -r) 位元至關重要。針對不同核心版本編譯的 perf 二進位檔會產生混淆的輸出,並可能在未經提示的情況下遺漏事件。請透過 perf --version 並 strace -V 進行驗證。
若要讓 perf 顯示函式名稱而非十六進位位址,您需要除錯符號。請安裝相關的 -dbg 或 -debuginfo 套件(例如, libc6-dbg 在 Debian 上),並使用 -g 在 GCC 中編譯您自己的二進位檔。
在容器內, strace 需要 --cap-add=SYS_PTRACE 以及 perf 需要 --cap-add=SYS_ADMIN 。若未設定這些權限,這些工具會以看似程式錯誤的方式失敗。
使用 strace 追蹤系統呼叫
執行 strace command 可從啟動時開始追蹤程序。若要附加至已執行的程序,請使用 strace -p PID。對於任何多執行緒或會進行 fork 的程序,請添加 -f 來追蹤子進程,否則您將錯過大部分的活動。
輸出行末尾會顯示返回值。 -1 ENOENT 表示程序所請求的檔案不存在。 -1 EACCES 表示權限問題。僅這兩種錯誤就佔了生產環境中意外高比例的錯誤。
最有用的選項是 -e trace=GROUP,它會將輸出限制在指定的系統呼叫類別內,並讓雜訊保持在可控範圍。
| 群組 | 呼叫 | 適用於 |
|---|---|---|
file | openat, stat, read, write | 缺少設定檔、權限錯誤、I/O 速度緩慢 |
network | socket, connect, bind, recvfrom | 連線遭拒、DNS 失敗、TLS 問題 |
process | execve, clone, wait4 | 系統當機、fork 風暴、二進位檔遺失 |
futex | futex | 鎖競爭與執行緒停滯 |
在繁忙的伺服器上,請先執行 strace -c -p PID 並執行十到二十秒。 -c 標誌會在您斷開連接時,列印系統呼叫次數、總耗時及錯誤的摘要。這能讓您知道哪些類別值得進一步檢視,同時不會讓終端機被資訊淹沒。接著使用篩選條件重新連接。
其他值得了解的選項: -T 記錄每個呼叫所耗費的時間, -Z 僅顯示失敗的呼叫,以及 -o file 將輸出寫入日誌檔案而非終端機,對於處理繁忙的程序而言,此方式速度會快得多。
使用 perf 進行 CPU 效能分析
perf 有四個您最常使用的命令。
| 指令 | 功能說明 | 常用參數 |
|---|---|---|
perf stat | 計數器快照:時脈週期、快取未命中、上下文切換 | -e, -p, -a |
perf top | 即時檢視系統上最常執行的函式 | --sort comm,dso,symbol |
perf record | 擷取樣本以 perf.data 進行離線分析 | -F, -g, -p |
perf report | 讀取 perf.data,並根據樣本佔比對函式進行排序 | --stdio, --sort |
從 perf stat -p PID 以快速掌握概況。需關注的數值:
- IPC(每週期指令數)低於 1.0:表示 CPU 發生停滯,通常是因記憶體存取所致。
- LLC 負載未命中率過高:工作集無法完全裝入快取,導致 CPU 需等待 RAM 響應。
- 高頻率的上下文切換:這是 I/O 受限工作負載的典型現象,此時執行緒會不斷因磁碟或網路而阻塞。
若發現異常,請進一步查看 perf record -F 99 -g -p PID -- sleep 30。 -F 99 採樣頻率為 99 Hz,這足以找出熱門函式,並避免在 100 Hz 等整數頻率下與核心計時器同步。 -g 標誌會擷取呼叫圖,因此 perf report 能向您展示哪些進入函式的路徑是導致問題的元兇。
在 perf report中,「開銷」欄位代表總樣本數的比例。若 _int_malloc 或 memcpy 表示大量記憶體分配。若您自己的某個函式出現高開銷,那就是您要尋找的熱點。
若您看到的是十六進位位址而非函式名稱,表示二進位檔已被剝離或缺少除錯符號。請安裝對應的 -dbg 套件,或使用 -g.
實機伺服器上的實務工作流程
針對繁忙伺服器上的實際事件,處理流程如下:
- 首先使用簡易工具確認症狀:
top,vmstat,iostat。若您使用虛擬機器,請檢查st(steal) 欄位。若數值超過 5%,表示虛擬化程式是瓶頸,而非您的程式碼。 - 若 CPU 使用率偏高,請執行
perf top執行數秒,接著對問題進程執行perf record -F 99 -g -p PID -- sleep 30針對問題進程執行。以 99 Hz 採樣率進行 30 秒的擷取,約產生 1.7 MB 的資料。 - 若程序陷入死鎖、運行緩慢或返回錯誤,請執行
strace -c -p PID並執行十秒鐘,接著閱讀摘要。若某個系統呼叫類別佔比過高,請使用strace -e trace=GROUP -T -p PID. - 當您找到可疑的系統呼叫或函式後,請斷開連線。切勿讓任何工具在生產環境中運行超過必要時間。
兩點注意事項。 strace 輸出內容可能包含環境變數、檔案路徑以及從套接字讀取的位元組,因此在將日誌分享至團隊外部前,請先進行資料淨化。此外,若您打算定期執行此操作,建議將 bpftrace 以及更廣泛的 eBPF 工具組作為下一步:提供同等級的可視性、低於 1% 的開銷,且從一開始就是為生產環境打造的。
若您執行的工作負載需要深度診斷存取權限,且無法使用共享基礎架構,請考慮我們的專用伺服器。

FDC VPS 標準配備 NVMe 硬碟機、EPYC 處理器和真正不計費的頻寬。準備好升級了嗎?
立即釋放效能Linux 記憶體管理:交換、OOM 殺手與 Cgroups
12 分鐘閱讀 - 2026年5月31日