strace 和 perf:Linux 进程调试和性能分析深度指南 strace 和 perfLinux 进程调试和性能分析深度指南当线上服务出现莫名的性能下降、神秘的文件未找到错误或奇怪的网络超时常规的日志分析往往无法给出答案。这时候需要深入内核层面观察进程的真实行为。strace和perf是 Linux 系统性能诊断的两把利刃strace追踪进程的系统调用揭示进程与内核的每次交互perf是 Linux 内核内置的性能分析器能够捕获 CPU 级别的性能事件生成直观的火焰图。掌握这两个工具能够解决 80% 以上的难以排查的线上问题。服务器配置strace和perf是通用的 Linux 诊断工具适用于任意服务器。推荐使用雨云服务器 rainyun-com 的2 核 4GB 机型作为学习和实验环境注册填优惠码2026off领 5 折以最低成本掌握 Linux 性能分析技能。本文环境操作系统Ubuntu 22.04 LTS内核 5.15strace5.16perf5.15随内核版本提供安装工具安装 straceUbuntu/Debianaptinstallstrace-ystrace--version# strace -- version 5.16安装 perfperf 工具与内核版本绑定需要安装对应版本# 查看内核版本uname-r# 例如5.15.0-106-generic# 安装对应版本的 perfaptinstalllinux-tools-$(uname-r)linux-tools-generic-y# 验证安装perf--version# perf version 5.15.168如果出现 “WARNING: perf not found for kernel” 错误说明内核版本对应的包不在仓库中可以使用通用包aptinstalllinux-tools-generic-ystrace 基础追踪系统调用基本用法追踪一个命令的所有系统调用stracels/tmp输出中每行是一次系统调用格式为syscall_name(args...) return_value execve(/usr/bin/ls, [ls, /tmp], ...) 0 brk(NULL) 0x5610a8c3b000 openat(AT_FDCWD, /etc/ld.so.cache, O_RDONLY|O_CLOEXEC) 3 ...附加到运行中的进程# 获取进程 PIDpgrep nginx# 例如1234# 附加追踪strace-p1234过滤特定类别的系统调用# 只追踪网络相关系统调用strace-etracenetwork nginx# 只追踪文件 I/Ostrace-etraceopen,read,write,close-p1234# 追踪进程与文件系统的交互strace-etracefile-p1234常用过滤类别networksocket、connect、send、recv 等fileopen、read、write、stat 等processfork、exec、exit 等memorymmap、brk、munmap 等signalkill、sigaction 等实战一诊断文件未找到错误应用报告无法找到配置文件但文件明明存在。使用 strace 追踪文件打开操作strace-etraceopenat,stat-p$(pgrep my-app)21|grep-E(ENOENT|config)典型输出openat(AT_FDCWD, /etc/my-app/config.yaml, O_RDONLY) -1 ENOENT (No such file or directory) openat(AT_FDCWD, /home/app/.config/my-app.yaml, O_RDONLY) -1 ENOENT (No such file or directory) openat(AT_FDCWD, /usr/local/etc/my-app.yaml, O_RDONLY) 5从输出可以清晰看出进程按顺序查找多个路径前两个返回ENOENT第三个成功。如果三个都失败就能知道应用实际在哪些路径寻找配置文件而不是猜测。实战二调试网络连接超时服务偶发性地无法连接数据库使用 strace 分析网络行为# -T 显示每次系统调用的耗时strace-T-etracenetwork-p$(pgrep my-service)21|grep-E(connect|poll|select)输出connect(5, {sa_familyAF_INET, sin_porthtons(5432), sin_addrinet_addr(10.0.0.5)}, 16) -1 EINPROGRESS (Operation now in progress) poll([{fd5, eventsPOLLOUT|POLLERR}], 1, 5000) 0 (Timeout) 5.000342poll返回0 (Timeout)且耗时 5 秒说明连接超时。结合connect显示的目标 IP 和端口可以确认是否网络路由或防火墙问题。实战三统计系统调用热点分析某个进程在 30 秒内最频繁调用的系统调用# -c 统计系统调用次数-p 附加进程timeout30strace-c-p$(pgrep nginx)21输出% time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 45.23 0.234567 5 46914 epoll_wait 25.11 0.130234 4 32558 156 read 18.45 0.095672 3 31891 write 8.32 0.043156 12 3596 sendfile ...epoll_wait占 45% 的时间是正常的Nginx 事件循环但如果futex锁等待或nanosleep主动等待占比过高则说明程序存在竞争或轮询问题。perf 基础硬件性能计数器perf stat分析 CPU 效率# 分析运行命令的性能计数器perfstatls/tmp# 附加到运行中的进程收集 10 秒perfstat-p$(pgrep nginx)sleep10输出Performance counter stats for process id 1234: 10,234.56 msec task-clock # 1.000 CPUs utilized 45 context-switches # 4.398 /sec 8 cpu-migrations # 0.781 /sec 234 page-faults # 22.863 /sec 28,456,789,012 cycles # 2.781 GHz 18,234,567,890 instructions # 0.64 insn per cycle 456,789,012 branches # 44.635 M/sec 12,345,678 branch-misses # 2.70% of all branches关键指标解读insn per cycleIPC每时钟周期执行的指令数。低于 1.0 说明存在大量等待缓存缺失、分支预测失败等branch-misses分支预测失误率超过 5% 需要关注cache-misses添加-e cache-references,cache-misses查看缓存命中率perf top实时 CPU 热点# 查看全系统的 CPU 热点函数类似 htop 但到函数级别perftop# 只关注特定进程perftop-p$(pgrep nginx)输出类似Samples: 50K of event cpu-cycles, 4000 Hz, Event count Overhead Shared Object Symbol 18.23% nginx [.] ngx_http_process_request 12.45% libc-2.35.so [.] __memcpy_avx_unaligned 8.91% nginx [.] ngx_regex_exec 6.78% [kernel] [k] copy_user_generic_stringOverhead列显示函数占总 CPU 时间的百分比可快速定位性能热点函数。实战四perf record 生成调用图perf top只能看到单个函数无法知道调用链。使用perf record录制带调用图的性能数据# 录制 30 秒的调用图-g 启用 call graphperf record-g-p$(pgrep my-service)sleep30# 生成报告perf report --call-graphgraph交互式报告中可以展开调用链查看函数的调用者和被调用者。实战五生成火焰图Flame Graph火焰图由 Brendan Gregg 发明是可视化 CPU 性能热点的最佳工具。X 轴表示 CPU 时间占比Y 轴表示调用栈深度。步骤一安装 FlameGraph 工具gitclone https://github.com/brendangregg/FlameGraph.git /opt/flamegraph步骤二录制性能数据# 录制 60 秒采样频率 99Hzperf record-F99-g-p$(pgrep my-service)sleep60步骤三生成火焰图# 将 perf.data 转换为折叠格式perf script|/opt/flamegraph/stackcollapse-perf.plout.folded# 生成 SVG 火焰图/opt/flamegraph/flamegraph.pl out.foldedflamegraph.svg步骤四下载并查看# 用 scp 下载到本地在本地终端执行scprootserver-ip:/root/flamegraph.svg ~/Desktop/# 用浏览器打开 SVG 文件可以点击放大解读火焰图宽块CPU 时间集中的函数是优化重点平顶表示该函数本身消耗大量 CPU非其调用的子函数高塔深层调用栈通常是递归或复杂库调用颜色随机分配没有特别含义红/黄不代表问题perf sched分析调度延迟系统响应延迟但 CPU 利用率不高可能是调度延迟问题# 录制调度事件perf sched recordsleep10# 生成延迟报告perf sched latency输出会显示各任务的最大调度延迟和平均延迟帮助识别 RT 任务或 I/O 密集型任务导致的调度不公平问题。strace 与 perf 的使用场景对比场景推荐工具原因文件找不到strace追踪 openat 系统调用网络连接失败strace追踪 connect/poll 行为CPU 使用率高perf top 火焰图定位热点函数响应延迟高但 CPU 不高strace -T perf sched找出耗时的系统调用或调度延迟缓存命中率低perf stat查看硬件缓存计数器strace和perf是每位 Linux 工程师必须掌握的核心工具。strace让你看到进程与内核的每次对话解决为什么失败的问题perf和火焰图让你看到 CPU 时间的分布解决为什么慢的问题。两者结合几乎没有无法排查的性能问题。