使用 perf 或者 systemtap 的方式采集数据,会对后台服务有性能影响吗?

有,但是很小,可以基本忽略不计。

它们使用系统的探针或者使用一些自定义的动态探针进行数据采集,第一对代码无侵入性,它既不需要停止服务,也不需要修改应用程序的代码;第二,它们是以内核模块/内核原生的方式跟踪用户态和内核态的所有事件,并通过一系列优化措施,进行采样统计,对目标服务性能影响极小,大概在 5%左右或者更低的性能损耗。相较于将进程运行在沙箱的 valgrind 工具或静态调试工具 gdb 来说,动态追踪 perf 或者 systemtap 或者 ebpf 的性能损耗基本可以忽略不计。

如何在容器中绘制火焰图?

如果是 on-cpu 火焰图可以直接使用perf record命令绘制即可

如果是 off-cpu 之类的火焰图,则需要另外分析

若系统/容器支持 ebpf 可以使用 bcc 工具集,使用如下命令绘制 off-cpu 火焰图

  1. /usr/share/bcc/tools/offcputime -df -p `pgrep -nx mysqld` 30 > out.stacks