开发人员通常需要查看生产应用程序中的性能瓶颈以确定问题的原因。为此,您通常需要可以通过日志和代码工具收集的信息。不幸的是,这种方法通常很耗时,并且不能提供有关潜在问题的足够详细信息。

一种现代且更先进的方法是应用和使用分析技术和工具来突出显示最慢的应用程序代码,即消耗大部分资源的区域。

在这篇博文中,我们将讨论持续分析,然后使用名为 Pyroscope 的开源工具检测在 Kubernetes 上运行的几个微服务。

什么是剖析?

必须对代码进行分析、调试和审查,以确定使其运行得更快的最有效方法。使用分析工具检查应用程序的代码有助于我们定位和修复性能瓶颈。这可以快速诊断应用程序的执行情况,并使程序员能够深入了解性能不佳的核心细节。结果是一个简化的代码库,减少了 CPU/内存消耗,使用户体验更好!

分析是一种程序分析,用于测量程序的内存、时间复杂度或函数调用的频率和持续时间。分析信息用于帮助程序优化和性能。 Profiler 程序可以跟踪每一行代码。

连续分析

Continuous Profiler 用于更快、更轻松地进行故障排除。 Continuous Profiler 是生产代码分析器,可让您随时间分析整个环境中的代码级性能。随着配置文件的不断收集,它们可以在引入新代码后快速揭示资源最密集的特性(或代码行)。优化可以减少最终用户的延迟和云提供商帐户。

有哪些连续分析器?

因此,这里列出了您可能遇到的一些分析器:

热像仪

Pyroscope是一个开源平台,由服务器和代理组成。它允许用户以 CPU 和磁盘高效的方式收集、存储和查询分析数据。

好像

Parca收集、存储和提供可随时查询的配置文件。它是开源的,可以部署在生产环境中,因为 Parca 专注于对两种主要类型的配置文件进行采样分析:跟踪和采样。

数据狗

Datadog Continuous Profiler始终在任何环境(包括生产环境)中分析和比较代码性能。它指出了由低效代码引起的难以复制的生产问题。还具有自动代码分析洞察力。

谷歌 - 云分析器

Cloud Profiler是一种统计性、低开销的分析器,可以从您的生产应用程序中持续收集 CPU 使用率和内存分配信息。它具有可操作的应用程序分析、低影响的生产 Profilin 和广泛的平台支持。

为什么要使用 Pyroscope

在我们开始探索 Pyroscope 之前,让我们看看它与市场上少数其他可用的持续分析工具有何不同。 DataDog 和 Google Cloud Profiler 在业界被广泛使用。正如 Reddit 用户](https://www.reddit.com/r/selfhosted/comments/netsku/pyroscope_open_source_alternative_to_datadog/)之一的[所指出的,以下是 Pyroscope 比其他两个更好的一些原因。

Datadog、Google Cloud 和 Pyroscope 连续分析能力的比较来源:Datadog、Google Cloud 和 Pyroscope 连续分析能力的比较

Pyroscope 专注于构建存储引擎专门用于分析数据以尽可能高效地存储和查询数据。它使用代理服务器模型将配置文件从应用程序发送到 Pyroscope 服务器:

Pyroscope Agent Profiler 的图像来源:Pyroscope 如何工作?

Pyroscope 允许任何语言的分析器向其发送数据,并让存储引擎有效地存储该数据。例如,Pyroscope 具有针对 Go、Python、Ruby、eBPF、Java、.NET、PHP 和 Rust 的语言特定代理。

另一方面,Parca 采用了稍微不同的方法,它依赖 eBPF 来处理种编译语言,如 C、C++、Go 等。在撰写本文时,对其他语言的支持正在进行中。与 Pyroscope类似,它也可以从 HTTP 端点](https://www.parca.dev/docs/ingestion#pull-based)中读取任何[pprof 格式的配置文件。

从理论上讲,由于所有这些语言最终都会编译下来并在内核上运行,因此 eBPF 应该适用于这些语言中的任何一种。然而,在实践中,如果你真的为 Python 等解释性语言运行 eBPF,在许多情况下,函数名称对于人类来说是不可读的。这是因为符号不是以这些语言存储的。

出于这个原因,Pyroscope 同时支持特定于语言的分析器以及 eBPF 分析器。与只能在内核级别运行的 eBPF 相比,这以集成语言特定代理的工作量稍多为代价。但它也带来了更多可操作和人类可读的配置文件的好处。

如何安装Pyroscope?

无论您使用什么,Docker、Linux,或者正在寻找 Ruby 或 Go 文档,Pyroscope 都可以启动服务器,然后再启动代理。即使您的目标是 10 秒或 10 个月的软件分析数据,他们定制设计的存储引擎也可以进行快速查询。

— Pyroscope 网站

我们将使用 minikube 来运行 Kubernetes 集群。使用 minikube 创建集群:

minikube start

添加 Helm 图表存储库:

helm repo add pyroscope-io https://pyroscope-io.github.io/helm-chart

安装 Helm 图表:

helm install pyroscope pyroscope-io/pyroscope --set service.type=NodePort

检查 Pyroscope Helm 图表安装成功:

helm list

检查 Pyroscope 是否正在运行:

kubectl get all

现在我们的 Kubernetes 集群中运行了 Pyroscope,我们将继续使用该应用程序的步骤。在此演示中,我们将使用Google 微服务。

将 Google 微服务演示与 Pyroscope 集成

我们将修改我们的容器图像以使用 pyroscope 二进制文件。这个二进制文件将启动我们的应用程序并注入自己进行监控。您可以在此 Pyroscope 文档](https://pyroscope.io/docs/agent-overview)中参考更多[。

我们将使用 Google 微服务的 Python、Go 和 .NET 微服务进行演示。所有的修改都推送到 GitHub 上 Google 微服务](https://github.com/infracloudio/microservices-demo-dev)的 fork[,让我们来看看每个服务的这些变化。

注意:要在 Google 微服务演示中试用 Pyroscope,您无需自己构建 Docker 映像。您可以只应用 Kubernetes 清单,如从微服务部分获取分析数据所示。

蟒蛇

我们将使用用 Python 编写的电子邮件服务应用程序。为了使用带有 Pyroscope 的 Python 应用程序,需要对Dockerfile进行以下更改。

COPY --from=pyroscope/pyroscope:latest /usr/bin/pyroscope /usr/bin/pyroscope
CMD [ "pyroscope", "exec", "python", "email_server.py" ]

编辑 Dockerfile 后,在同一文件夹下,我们继续构建和推送映像。

docker build . -t beellzrocks/emailservice:latest
docker push beellzrocks/emailservice:latest

.NET

我们将使用适用于 .NET 的应用程序 Cart Service。要将 .NET 应用程序与 Pyroscope 一起使用,需要对 Dockerfile 进行以下更改。

COPY --from=pyroscope/pyroscope:latest /usr/bin/pyroscope /usr/bin/pyroscope
ENTRYPOINT ["pyroscope", "exec", "-spy-name", "dotnetspy", "/app/cartservice"]

编辑完 Dockerfile 后,我们继续构建和推送镜像。

我们将采用 Go 编写的 Product Catalog Service 应用程序。为了使用带有 Pyroscope 的 Go 应用程序,需要在server.go中进行更改。

import (
  pyroscope "github.com/pyroscope-io/pyroscope/pkg/agent/profiler"
)

func main() {

  pyroscope.Start(pyroscope.Config{
    ApplicationName: os.Getenv("APPLICATION_NAME"),
    ServerAddress:   os.Getenv("SERVER_ADDRESS"),
  })
  // code here
)

编辑 server.go 后,我们继续构建和推送图像。

获取微服务的profiling数据

我们修改了 Kubernetes 清单以将我们的图像与 Pyroscope 一起使用。

kubernetes-manifests.yaml文件包含所有应用程序的资源。我们对其进行了编辑以使用我们在上述步骤中构建的图像,即电子邮件服务、购物车服务、产品目录服务。

containers:
  - name: server
    image: beellzrocks/emailservice

在 Kubernetes 中运行 Pyroscope 时,我们需要做以下更改:

  • 添加SYS_PTRACE能力。

  • 告诉代理 Pyroscope 服务器的位置,以及使用环境变量的应用程序名称。

      containers:
      - name: server
        env:
        - name: PYROSCOPE_SERVER_ADDRESS # To change Pyroscope Server Port change the value
          value: "http://pyroscope:4040"
        - name: PYROSCOPE_APPLICATION_NAME # Application name shown in the UI
          value: "email.service" 
        securityContext:
          capabilities:
            add:
            - SYS_PTRACE

现在,要部署所有服务,您可以将 Kubernetes 清单应用到您的集群。

kubectl apply -f https://raw.githubusercontent.com/infracloudio/microservices-demo-dev/master/release/kubernetes-manifests.yaml

获取 Pyroscope 的服务 url:

minikube service pyroscope
|-----------|-----------|-------------|---------------------------|
| NAMESPACE |   NAME    | TARGET PORT |            URL            |
|-----------|-----------|-------------|---------------------------|
| default   | pyroscope | http/4040   | http://192.168.49.2:30639 |
|-----------|-----------|-------------|---------------------------|
🎉  Opening service default/pyroscope in default browser

要访问 Pyroscope UI,您可以访问 URL:http://192.168.49.2:30639(您的会有所不同)。

Pyroscope Web UIPyroscope UI 与 Pyroscope 服务器 CPU

正如您在上面的屏幕截图中看到的,Pyroscope 本身在本地存储数据时占用的 CPU 使用率很低。它使用 Badger 数据库在本地存储数据。

Pyroscope 资源利用率

监控 Kubernetes pod 在资源使用、利用率和成本控制方面也很重要。 Pyroscope 使用低资源和低开销。

kubectl 显示的 Pyroscope CPU 资源利用率 topPyroscope CPU 利用率

使用 Pyroscope 进行监控

Pyroscope 根据编程语言使用不同的代理来分析代码。以下是使用 Pyroscope 分析应用程序的火焰图的一些示例。

用 Go 编写的产品目录服务带有 Go 产品目录服务应用程序的 Pyroscope

用 DotNet 编写的购物车服务带有 .Net 购物车应用程序的 Pyroscope

用 Python 编写的电子邮件服务带有 Python 电子邮件应用程序的 Pyroscope

结论

持续分析性能是满足最终用户期望的关键因素。如果出现性能问题,您必须在影响最终用户体验之前做好诊断问题的准备。

因此,请继续优化您的应用程序并立即解决问题,以便使用 Pyroscope 等工具继续为用户提供超快速的应用程序性能。 Pyroscope 展示了一层可见性,可帮助您了解如何提高生产环境中代码的性能并降低云基础架构成本。

伙计们,这是一个总结:)希望这篇文章内容丰富,你喜欢阅读它。我很想听听您的想法和经验 - 让我们在LinkedIn上建立联系并开始对话。

点击阅读全文
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐