strace 和 perf:Linux 疑難排解小抄

13 分鐘閱讀 - 2026年6月4日

hero section cover
目錄
  • Linux 故障排除的 strace 與 perf
  • 何時該使用 strace 與 perf
  • 安裝 strace 和 perf
  • 使用 strace 追蹤系統呼叫
  • 使用 perf 進行 CPU 效能分析
  • 實機伺服器上的實務工作流程
分享

何時在 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 topperf record -gstrace -c 針對熱點程序
磁碟或 I/O 等待過慢perf stat 因快取未命中strace -e trace=file
程序掛起或靜默錯誤strace -e trace=file,networkperf stat 以排除 CPU 負載過高
鎖競爭或 API 執行緩慢strace -c,請留意 futexperf record -g

安裝 strace 和 perf

這兩項工具皆位於標準軟體庫中。strace 依賴 ptrace syscall,該函式多年來已成為每個現代核心的組成部分。perf 使用 perf_events 介面,並需要與您當前運行核心版本相符的套件。

UbuntuDebian 上:

sudo apt install strace linux-tools-common linux-tools-$(uname -r)

RHELAlmaLinuxFedora 上:

sudo dnf install strace perf

$(uname -r) 位元至關重要。針對不同核心版本編譯的 perf 二進位檔會產生混淆的輸出,並可能在未經提示的情況下遺漏事件。請透過 perf --versionstrace -V 進行驗證。

若要讓 perf 顯示函式名稱而非十六進位位址,您需要除錯符號。請安裝相關的 -dbg-debuginfo 套件(例如, libc6-dbg 在 Debian 上),並使用 -gGCC 中編譯您自己的二進位檔。

在容器內, 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,它會將輸出限制在指定的系統呼叫類別內,並讓雜訊保持在可控範圍。

群組呼叫適用於
fileopenat, stat, read, write缺少設定檔、權限錯誤、I/O 速度緩慢
networksocket, connect, bind, recvfrom連線遭拒、DNS 失敗、TLS 問題
processexecve, clone, wait4系統當機、fork 風暴、二進位檔遺失
futexfutex鎖競爭與執行緒停滯

在繁忙的伺服器上,請先執行 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_mallocmemcpy 表示大量記憶體分配。若您自己的某個函式出現高開銷,那就是您要尋找的熱點。

若您看到的是十六進位位址而非函式名稱,表示二進位檔已被剝離或缺少除錯符號。請安裝對應的 -dbg 套件,或使用 -g.

實機伺服器上的實務工作流程

針對繁忙伺服器上的實際事件,處理流程如下:

  1. 首先使用簡易工具確認症狀: top, vmstat, iostat。若您使用虛擬機器,請檢查 st (steal) 欄位。若數值超過 5%,表示虛擬化程式是瓶頸,而非您的程式碼。
  2. 若 CPU 使用率偏高,請執行 perf top 執行數秒,接著對問題進程執行 perf record -F 99 -g -p PID -- sleep 30 針對問題進程執行。以 99 Hz 採樣率進行 30 秒的擷取,約產生 1.7 MB 的資料。
  3. 若程序陷入死鎖、運行緩慢或返回錯誤,請執行 strace -c -p PID 並執行十秒鐘,接著閱讀摘要。若某個系統呼叫類別佔比過高,請使用 strace -e trace=GROUP -T -p PID.
  4. 當您找到可疑的系統呼叫或函式後,請斷開連線。切勿讓任何工具在生產環境中運行超過必要時間。

兩點注意事項。 strace 輸出內容可能包含環境變數、檔案路徑以及從套接字讀取的位元組,因此在將日誌分享至團隊外部前,請先進行資料淨化。此外,若您打算定期執行此操作,建議將 bpftrace 以及更廣泛的 eBPF 工具組作為下一步:提供同等級的可視性、低於 1% 的開銷,且從一開始就是為生產環境打造的。

若您執行的工作負載需要深度診斷存取權限,且無法使用共享基礎架構,請考慮我們的專用伺服器

background image
您的 VPS 能勝任工作嗎?

FDC VPS 標準配備 NVMe 硬碟機、EPYC 處理器和真正不計費的頻寬。準備好升級了嗎?

立即釋放效能

博客

本周特色

更多文章
為什麼擁有一個強大且不計費的 VPS 是很重要的?

為什麼擁有一個強大且不計費的 VPS 是很重要的?

非計費 VPS 以固定的連接埠速度提供定額頻寬。它與計費計劃有何不同、何時會有好處,以及購買前需要檢查的事項。

7 分鐘閱讀 - 2025年5月9日

Linux 記憶體管理:交換、OOM 殺手與 Cgroups

12 分鐘閱讀 - 2026年5月31日

更多文章