核心是识别密集调用、卡顿与失败,需过滤关键系统调用(file/net/process/memory)、启用-t/-z/-s、加-f跟踪子进程、-o保存日志,并用strace -c、grep、awk快速分析频次、错误和耗时。

用 strace -p 跟踪高并发下的 worker 进程,核心不是“看调用有没有”,而是“看哪类调用在密集发生、是否卡顿、有无失败”。直接 attach 并全量输出会淹没关键信息,必须配合过滤、统计和时间维度控制。
聚焦关键系统调用类别
worker 进程(如 Nginx worker、PHP-FPM child、Gunicorn worker)在高并发下主要压力落在文件 I/O、网络收发、内存分配和进程调度上。不要用默认全跟踪,应显式限定:
-
-e trace=file,net,process,memory:覆盖 openat/statx/read/write/connect/accept/sendto/recvfrom/mmap/brk/execve 等高频行为 - 若只查阻塞点,可进一步缩窄:
-e trace=accept,recvfrom,read,write,connect - 避免跟踪信号或时钟调用(如
rt_sigreturn、clock_gettime),它们数量极大但干扰定位
启用耗时与失败标记
高并发问题常表现为“慢”或“失败”,需让 strace 暴露这两类线索:
- 加
-T显示每次系统调用的执行耗时(单位秒),便于识别长延时调用,例如recvfrom(...)=1024 - 加
-z高亮返回值为-1的失败调用(如EAGAIN、ETIMEDOUT、EMFILE),一眼锁定错误源头 - 搭配
-s 256防止路径、URL、HTTP header 被截断,否则看不到完整上下文
捕获子进程并控制输出节奏
worker 常 fork 子进程处理请求(如 execve 外部命令、spawn helper),漏掉子进程就等于漏掉半条链路:
- 必须加
-f,确保跟踪 fork 出的所有子进程 - 高并发下日志爆炸,建议用
-o /tmp/strace_worker.log保存到文件,而非刷屏 - 若需观察实时趋势,可用
-t(带时间戳)+tail -f /tmp/strace_worker.log,但不建议长时间运行;推荐设定固定窗口(如 10 秒)后中断
事后快速分析关键指标
日志生成后,别人工翻找。用简单命令提取有效信号:
- 统计各调用频次与耗时:
strace -c -p <pid></pid>(另起终端,轻量统计,不干扰原进程) - 筛选失败项:
grep '= -1' /tmp/strace_worker.log | grep -E 'EACCES|ENOENT|ETIMEDOUT|ECONNREFUSED|EMFILE|ENFILE' - 查长耗时调用:
awk '$NF ~ /<.>/ {gsub(//,"",$NF); if ($NF > 0.1) print}' /tmp/strace_worker.log</.>(提取耗时超 100ms 的行) - 确认是否卡在某类资源上:统计
openat和connect的失败率,判断是文件描述符不足还是后端连接池打满










