strace -c 不支持直接按时间段采样,需结合 timeout、SIGINT 中断或 strace -T 日志分析实现:推荐 timeout 5s strace -c cmd;对已运行进程可用 strace -p PID -c 后 kill -INT;精细分析应使用 strace -T 配合 awk 或 Python 处理时间戳日志。

strace -c 本身不支持“特定时间段”的采样,它只能对整个进程生命周期(从启动到退出)做汇总统计。若想统计某段时间内的系统调用耗时,需结合进程生命周期控制或信号中断机制来实现。
用 strace -c 统计固定时间窗口(推荐:配合 timeout)
最常用且可靠的方式是用 timeout 限制目标程序运行时长,再用 strace -c 捕获该时段内所有系统调用:
- 命令示例:
timeout 5s strace -c ls /tmp 2>&1—— 运行ls最多 5 秒,超时后自动终止并输出汇总(含 % time、calls、usecs/call 等) - 注意:
timeout发送的是 SIGTERM,默认可被程序捕获;如需强制中断,加-k(发送 SIGKILL),但此时 strace 可能来不及刷新统计,建议优先用默认 TERM - 若目标程序本就长期运行(如 nginx、redis),可先
kill -STOP $PID暂停,再用strace -p $PID -c附加——但 -c 不支持动态附加,此路不通;必须用strace -p -T -o trace.log记录带时间戳的原始调用,后续用脚本分析
对已运行进程做有限时长的 strace 跟踪(需手动中断)
若无法用 timeout 启动(如服务已常驻),可用以下方式人工控制窗口:
- 新开终端执行:
strace -p $(pgrep your_program) -c -o /tmp/strace-c.out &,记录 PID - 等待几秒后,在另一终端执行:
kill -INT %1(或kill -INT $STRACE_PID)——SIGINT 是 strace 唯一能优雅退出并输出 -c 统计的信号 - 查看
/tmp/strace-c.out,即为从 attach 到收到 SIGINT 期间的汇总数据 - 注意:不能用 Ctrl+C,因会同时终止 strace 和被跟踪进程(除非用
-e trace=...限缩范围并加-D守护模式)
替代方案:用 strace -T + awk 实现自定义时间段分析
当需要更精细的时间切片(如每 2 秒一段),-c 不够用,应改用带时间戳的原始日志:
- 采集:
strace -p $PID -T -t -o /tmp/trace.log 2>/dev/null &(-T 显示每个 syscall 耗时,-t 显示绝对时间) - 限定时间段过滤(例如只取 10:05:20–10:05:25 的调用):
awk -F' ' '$2 >= "10:05:20" && $2 1) print $2}' | sed 's/>$//' | awk '{sum+=$1; n++} END{print "avg=" sum/n "ms, total="n" calls"}' - 也可用 Python 或 gnuplot 进一步画出耗时分布直方图或热力图
关键注意事项
-
strace -c 无法统计子进程:若目标程序 fork 大量子进程(如 Apache prefork),-c 只统计主进程,需加
-f(但 -c 和 -f 共用时,统计会合并所有线程/进程,无法区分) - 高负载下 strace 开销显著:-c 模式本身会增加延迟,统计中的 “usecs/call” 是 strace 测量值,略高于真实内核耗时
- 权限要求:跟踪非自身进程需 root 或 CAP_SYS_PTRACE 能力
- 容器环境:在 Docker 中需加
--cap-add=SYS_PTRACE,Podman 类似


















