性能分析
是分析应用程序性能以改善代码段性能的行为。可视化配置文件并快速识别性能问题的最流行方法之一是生成 “火焰图”
。例如下图
y轴是堆栈深度,x轴跨越样本总体。每个矩形都是一个函数,其中的宽度表示它在配置文件中出现的频率。从左到右的顺序并不重要(堆栈按字母顺序排序)。
应用性能分析是一项艰巨的任务。大多数探查器有两个主要问题:
在Kubernetes集群中运行的应用程序上执行分析时,甚至更加困难。需要部署一个包含配置文件修改的新容器映像,而不是当前正在运行的容器。此外,当应用程序重新启动时,某些性能问题可能会消失,这使调试变得困难。
Kubernetes 中可以使用 Kubectl Flame
分析 Pod 应用性能。Kubectl Flame
是一个kubectl插件,可以使在Kubernetes中运行的分析应用程序获得流畅的体验,而无需进行任何应用程序修改或停机。另外,kubectl flame的目标是通过最大程度地降低性能损失来实现生产友好。
源码地址:https://github.com/VerizonMedia/kubectl-flame
kubectl flame
在与目标容器相同的节点上启动 Kubernetes Job。在后台kubectl-flame使用async-profiler
来为Java应用程序生成火焰图。通过共享/tmp
文件夹与目标JVM进行交互。Golang支持基于ebpf
分析。Python支持基于py-spy
。
$ kubectl krew install flame
分析 Java 应用 mypod 1分钟,并在将火焰图保存到 /tmp/flamegraph.svg
$ kubectl flame mypod -t 1m --lang java -f /tmp/flamegraph.svg
在基于 alpine 的容器中分析 Java 应用程序需要使用 --alpine
标志
$ kubectl flame mypod -t 1m -f /tmp/flamegraph.svg --lang Java --alpine
注意:仅 Java 应用程序需要此
--alpine
标志,而Go
分析则不需要该标志。
包含多个容器的 Pod 需要将目标容器指定为参数
$ kubectl flame mypod -t 1m --lang go -f /tmp/flamegraph.svg mycontainer
在包含多个进程的Pod中对Go应用程序进行性能分析需要通过 --pgrep
标志指定目标进程名称:
$ kubectl flame mypod -t 1m --lang go -f /tmp/flamegraph.svg --pgrep go-app
Java分析假定进程名称为java。
--pgrep
如果您的进程名称不同,请使用标志。