服务公告
系统调用与 strace 入门:程序卡在哪一眼看穿
发布时间:2025-11-19 07:09
## 概念 应用程序与内核打交道要经过系统调用这层接口:读文件、建连接、等锁、收信号,全是一次次调用。strace 把进程的每次系统调用连同参数与返回值记录下来,程序卡住时,最后停在哪条调用上,答案就直接写在输出末尾。它不关心程序逻辑,只看程序与内核的往来,因此对无源码的闭源程序同样有效。 ## 原理 strace 基于 ptrace 机制介入目标进程,在每个系统调用进出点暂停并记录。代价是被跟踪进程明显变慢,吞吐类业务可能慢一个数量级,所以它适合诊断而不是压测。两种用法:从启动开始跟踪,命令前直接加 strace,适合必现问题;对已运行进程用 -p 挂上去,适合线上偶发卡死的进程,不打断服务就能看它此刻停在何处。 ## 最小实操 跟踪已有进程,只看系统调用名与耗时。 ``` strace -p 2517 -e trace=network -f ``` 统计各调用的次数与耗时分布,适合总量分析。 ``` strace -c -p 2517 ``` 加 -f 才能覆盖多线程进程的全部线程,漏了它经常看到假象。 ## 常见阻塞点读法 输出末尾停在哪类调用,指向就非常明确:反复出现 read 且不返回,多半在等对端数据,问题在网络或上游;connect 卡住对应目标不可达或防火墙丢包;futex 大量出现是锁竞争,要回应用层查锁;stat 与 open 成群结队是路径扫描过多,常见于配置加载与插件遍历;write 持续返回 EAGAIN 说明非阻塞写缓冲已满,下游消费不动。把 -c 的统计与末尾停留点对照,先看占比最大的调用,再看卡住的那条,效率最高。两类典型误读值得避开:把正常的慢调用当成故障,例如首次加载配置的大量 stat 属于正常冷启动;只看调用名不看返回值,ECONNREFUSED 与 ETIMEDOUT 的含义完全不同,前者是对端明确拒绝,后者是包石沉大海。顺云云服务器上排查疑难卡顿,strace 定位到调用层后,再用网络工具或应用日志往下走一层,链路就清晰了。上一篇: 服务器采购从买断到租用的演变
下一篇: 长期运营服的降配与升级时机