Linux Perf 提供底层 CPU 性能分析,能显示 JavaScript、原生代码以及操作系统层面的调用栈帧。
操作方法
通常可以通过 linux-tools-common 软件包获得 Linux Perf。使用 --perf-basic-prof 或 --perf-basic-prof-only-functions 启动 Node.js 应用,即可支持 perf_events。
--perf-basic-prof 会持续写入文件 /tmp/perf-PID.map,可能导致磁盘占用无限增长。如果需要避免这种情况,可使用 linux-perf 模块,或改用 --perf-basic-prof-only-functions。
两者的主要区别是:--perf-basic-prof-only-functions 产生的输出更少,可用于生产环境的性能分析。
# Launch the application an get the PID
$ node --perf-basic-prof-only-functions index.js &
[1] 3870
然后按需要的采样频率记录事件:
$ sudo perf record -F 99 -p 3870 -g
在此阶段,可以对应用进行负载测试,以产生更多记录,使分析更加可靠。完成后,向 perf 进程发送 SIGINT(Ctrl-C)结束记录。
/tmp 目录中会生成一个映射文件,通常名为 /tmp/perf-PID.map;在上面的示例中,它是 /tmp/perf-3870.map,包含被调用函数的映射信息。
要将结果汇总到指定文件中,执行:
$ sudo perf script > perfs.out
$ cat ./perfs.out
node 3870 25147.878454: 1 cycles:
ffffffffb5878b06 native_write_msr+0x6 ([kernel.kallsyms])
ffffffffb580d9d5 intel_tfa_pmu_enable_all+0x35 ([kernel.kallsyms])
ffffffffb5807ac8 x86_pmu_enable+0x118 ([kernel.kallsyms])
ffffffffb5a0a93d perf_pmu_enable.part.0+0xd ([kernel.kallsyms])
ffffffffb5a10c06 __perf_event_task_sched_in+0x186 ([kernel.kallsyms])
ffffffffb58d3e1d finish_task_switch+0xfd ([kernel.kallsyms])
ffffffffb62d46fb __sched_text_start+0x2eb ([kernel.kallsyms])
ffffffffb62d4b92 schedule+0x42 ([kernel.kallsyms])
ffffffffb62d87a9 schedule_hrtimeout_range_clock+0xf9 ([kernel.kallsyms])
ffffffffb62d87d3 schedule_hrtimeout_range+0x13 ([kernel.kallsyms])
ffffffffb5b35980 ep_poll+0x400 ([kernel.kallsyms])
ffffffffb5b35a88 do_epoll_wait+0xb8 ([kernel.kallsyms])
ffffffffb5b35abe __x64_sys_epoll_wait+0x1e ([kernel.kallsyms])
ffffffffb58044c7 do_syscall_64+0x57 ([kernel.kallsyms])
ffffffffb640008c entry_SYSCALL_64_after_hwframe+0x44 ([kernel.kallsyms])
....
原始输出可能不易理解,因此通常会根据原始文件生成火焰图,以改善可视化效果。

要根据这些结果生成火焰图,请从 该教程 的第 6 步开始操作。
perf 的输出并非专门为 Node.js 设计,因此可能无法妥善处理 Node.js 中 JavaScript 代码的优化方式。详情参阅 perf 输出问题。
相关链接
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END











暂无评论内容