strace -c 可统计系统调用次数、耗时和错误率,是定位性能瓶颈的常用方法;支持 -f 追踪子进程、-s 指定字符串长度、-o 导出日志、-e trace= 过滤特定调用类型。

直接用 strace -c 就能统计系统调用的执行次数、耗时和错误率,是定位性能瓶颈最常用的方式之一。
基础用法:运行命令并汇总统计
执行目标程序,自动收集所有系统调用的汇总数据:
-
strace -c ls /tmp—— 跟踪ls执行过程,结束后输出统计表 -
strace -c ./myapp arg1 arg2—— 适用于自定义二进制或脚本(需有执行权限)
输出包含:调用次数、总耗时(秒)、时间占比、错误次数、系统调用名称。时间占比一栏直观反映哪类调用最“拖后腿”。
配合 -f 追踪子进程调用(常见于多进程程序)
很多程序会 fork 出子进程(如 Web 服务器、编译工具链),不加 -f 会漏掉它们的系统调用:
strace -c -f curl -s http://example.com > /dev/null- 统计结果中会出现
clone、wait4、子进程的read/write等,更完整反映实际行为
导出到文件 + 指定字符串长度(便于分析长路径/参数)
默认截断字符串为 32 字节,可能看不清关键路径;建议加上 -s 和 -o:
strace -c -f -s 256 -o trace.log ./app- 执行完后,终端只显示汇总表,详细日志存入
trace.log(含时间戳、调用上下文) - 后续可 grep 关键字(如
openat、epoll_wait)辅助判断热点
聚焦特定调用类型(缩小分析范围)
如果已怀疑某类操作异常(比如大量文件打开失败),可用 -e trace= 过滤:
-
strace -c -e trace=open,openat,close ./app—— 只统计文件打开关闭相关调用 -
strace -c -e trace=recvfrom,sendto ./server—— 针对网络 I/O 场景 - 注意:
-c必须与-e同时使用才生效,否则过滤无效











