diff --git a/README.md b/README.md index 0dfce5b3ddf68b77b26f716cdfaa0184ecf99c96..cd1b1d94ccbe0d133877cefd119427eb7bb172d1 100644 --- a/README.md +++ b/README.md @@ -908,6 +908,60 @@ gala-ops支持使用Grafana图形界面用来帮助客户更好的理解性能Pr 18. 如何使用性能Profiling(火焰图)? + 1. 性能火焰图启动命令示例(基本): + + ```shell + curl -X PUT http://localhost:9999/flamegraph -d json='{ "cmd": {"probe": ["oncpu"] }, "snoopers": {"proc_name": [{ "comm": "cadvisor"}] }, "state": "running"}' + ``` + + 上述命令是一个最简单的火焰图探针启动命令。该探针采用默认参数对cadvisor进程的cpu占用进行采样,可以周期性在本地生成一个svg格式火焰图。生成的火焰图文件打开如下所示,图中可以看到cadvisor进程的go和c调用栈。 + + + + ![](./png/cadvisor_flamegraph_svg.png) + + + + 2. 性能火焰图启动命令示例(进阶): + + 更加完整的启动命令示例如下,通过手动设置各种参数实现对火焰图探针的定制化配置。flamegraph探针的完整可配置参数参见[探针运行参数](https://gitee.com/openeuler/gala-gopher/blob/dev/config/gala-gopher%E6%94%AF%E6%8C%81%E5%8A%A8%E6%80%81%E9%85%8D%E7%BD%AE%E6%8E%A5%E5%8F%A3%E8%AE%BE%E8%AE%A1_v0.3.md#%E6%8E%A2%E9%92%88%E8%BF%90%E8%A1%8C%E5%8F%82%E6%95%B0)。 + + ```shell + curl -X PUT http://localhost:9999/flamegraph -d json='{ "cmd": { "check_cmd": "", "probe": ["oncpu", "offcpu", "mem"] }, "snoopers": { "proc_name": [{ "comm": "cadvisor", "cmdline": "", "debugging_dir": "" }, { "comm": "java", "cmdline": "", "debugging_dir": "" }] }, "params": { "perf_sample_period": 100, "svg_period": 300, "svg_dir": "/var/log/gala-gopher/stacktrace", "flame_dir": "/var/log/gala-gopher/flamegraph", "pyroscope_server": "localhost:4040", "multi_instance": 1, "native_stack": 0 }, "state": "running"}' + ``` + + 上述命令可以启动一个火焰图探针,指定以100ms的频率对cadvisor、java进程进行采样,并每隔300s在本地生成三种svg格式火焰图:cpu火焰图,offcpu火焰图,内存火焰图,同时上述火焰图数据通过多进程实例上报到pyroscope服务器。可以实时通过pyroscope查看,也可以在grafana中配置pyroscope数据源,然后在grafana上查看火焰图。 + + + + 3. 性能火焰图查看方法示例: + + 通过上述命令启动火焰图后,即可通过不同的过滤选项实时查看火焰图。下图为某java业务的k8s Pod的内存火焰图查看示例。 + + (1)处可以选择machine_id,查看不同主机上的进程火焰图。 + + (2)处可以选择进程id,查看不同进程的火焰图。 + + (3)处可以选择火焰图类型(oncpu/offcpu/mem),查看不同类型的火焰图。 + + (6)处为进程的标签,格式为[pid]comm。若为k8s容器内进程,则会有[Pod]name,和[Con]name标签,见(4)(5)处。 + + (7)处可以选择火焰图的时间段。 + + ![](./png/kafka_client_mem_fg.png) + + + + 4. 使用性能火焰图定位性能问题: + + 对火焰图的展示形式也可以根据业务需求进行灵活配置。例如云服务灰度发布版本时,环境中同时部署了新老版本的容器。通过同时查看、对比不同版本的容器实例的火焰图,可以快速发现版本间运行差异,迅速定位性能问题。 + + 在下面的实践中,某主机上部署了新旧两个版本的kafka客户端容器,测试发现新版本容器的cpu占用率较老版本略高。 + + 于是在grafana中同时配置这两个容器的火焰图展示,并选中需要定位的时间段。由图中可以明显发现,新版本(右)比老版本(左)增加了对String.format的调用,从而定位到新版本容器是由于代码中增加了序列化操作,从而导致cpu占用率升高。 + + ![](./png/compare_fg.png) + 19. 如何完成网络问题诊断? 参考[这里](https://gitee.com/openeuler/gala-docs/blob/master/network_diag.md) diff --git a/png/cadvisor_flamegraph_svg.png b/png/cadvisor_flamegraph_svg.png new file mode 100644 index 0000000000000000000000000000000000000000..0b1933a2df5bd11ba67434b5088a5270ab09e891 Binary files /dev/null and b/png/cadvisor_flamegraph_svg.png differ diff --git a/png/compare_fg.png b/png/compare_fg.png new file mode 100644 index 0000000000000000000000000000000000000000..cc6e5aa6bff6cdf835ac9dd0ffbbea4b8d30e3d0 Binary files /dev/null and b/png/compare_fg.png differ diff --git a/png/kafka_client_mem_fg.png b/png/kafka_client_mem_fg.png new file mode 100644 index 0000000000000000000000000000000000000000..3cf700b10778f6573e9ee97eb5a2c53dcdf9437d Binary files /dev/null and b/png/kafka_client_mem_fg.png differ