5 分钟上手 strace
本页承诺:5 分钟内抓住"内核态 CPU 高"的元凶——进程在频繁调哪些系统调用、每次多慢、有没有返回错误。top/pidstat 看到 sy 高时,就轮到 strace 出场。
阅读时间约 4 分钟 + 动手 3 条命令。完整版见 strace 使用教程。
第 1 步:装好 strace
bash
yum install -y strace # CentOS/RHEL
apt install -y strace # Debian/Ubuntu
strace -V # 能输出版本号 = 装好了第 2 步:造一个"内核态高"的靶子
用本仓库自带演示程序(场景 2 是频繁 open/write/close 系统调用):
bash
cd <本仓库路径>/demos/cpu-demo
make && ./cpu_demo # 选场景 2(系统调用频繁),让它一直跑另开一个终端做第 3 步。
第 3 步:三连跑通
① 汇总统计——谁最耗时(最核心)
bash
strace -c -p <PID> # 附加到进程,观察 10 秒左右,按 Ctrl-C 出汇总表看 % time 和 calls 两列:排最上面的就是元凶。场景 2 典型输出:
bash
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
52.31 0.412300 4 98120 write
31.07 0.244900 2 98120 openat
14.88 0.117300 1 98120 close
------ ----------- ----------- --------- --------- ----------------
100.00 0.788200 298290 0 total→ 每秒约 3 万次系统调用,一半时间花在 write——这就是 sy 高的来源。
② 只看某一类调用(聚焦文件/网络)
bash
strace -e trace=file -c -p <PID> # 只看文件类(open/close/stat...)
strace -e trace=network -c -p <PID> # 只看网络类
strace -e trace=openat,close -c -p <PID> # 精确指定两个调用③ 程序"卡住"了?看它堵在哪
bash
strace -p <PID> # 实时逐行输出,等 2 秒后 Ctrl-C,看最后几行最后一行停在哪个调用上,就是卡在哪:futex = 等锁、read = 等数据/IO、poll/select = 等事件。
常见坑(3 秒自查)
| 现象 | 原因 | 解决 |
|---|---|---|
| 程序突然慢了几十倍 | strace 本身开销巨大:每个 syscall 都要陷入 ptrace | 只短时诊断,别在生产热路径长挂;高频场景用 perf trace 或 eBPF |
| 没抓到子进程的调用 | 没加 -f | strace -f -c -p <PID>(多线程/多进程必加) |
| 输出淹没屏幕 | 调用太多 | 用 -c 汇总,或 -o trace.log 写文件 |
看到 = -1 EACCES 之类的错误 | 调用失败 | errors 列非 0 就是失败计数,errno 直接告诉原因 |
深度入口
- strace 使用教程—— ptrace 原理、全部参数、性能代价分析
- 5 分钟上手 top—— 先发现
sy高,再用 strace 定位 - 5 分钟上手 vmstat—— 一屏看全局方向
- 5 分钟上手系列
一句话总结:strace 三步 = strace -c -p <PID> 看系统调用耗时排序 → -e trace=file/network 聚焦某一类 → -p 实时看卡点(futex/read/poll),5 分钟定位"内核态高"的元凶;记得它开销大,短时使用。