云原生之深入解析Kubernetes中服务的性能

news2024/9/23 1:21:49

一、Pyroscope 简介

① 什么是 Pyroscope?

  • 开发人员通常需要查看生产应用程序中的性能瓶颈以确定问题的原因,为此通常需要可以通过日志和代码工具收集的信息。不幸的是,这种方法通常很耗时,并且不能提供有关潜在问题的足够详细信息。
  • 一种现代且更先进的方法是应用和使用分析技术和工具来突出显示最慢的应用程序代码,即消耗大部分资源的区域。现在将讨论持续分析,然后使用名为 Pyroscope 的开源工具检测在 Kubernetes 上运行的微服务。
  • 必须对代码进行分析、调试和审查,以确定使其运行得更快的最有效方法。使用分析工具检查应用程序的代码有助于我们定位和修复性能瓶颈。这可以快速诊断应用程序的执行情况,并使程序员能够深入了解性能不佳的核心细节。结果是一个简化的代码库,减少了 CPU/内存消耗,使用户体验更好。
  • Profiling 是一种程序分析,用于测量程序的内存、时间复杂度或函数调用的频率和持续时间。分析信息用于帮助程序优化和性能,Profiler 程序可以跟踪每一行代码。

② 连续分析

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

③ 有哪些连续分析器?

  • Pyroscope:Pyroscope 是一个开源平台,由服务器和代理组成,它允许用户以 CPU 和磁盘高效的方式收集、存储和查询分析数据。
  • Parca:Parca 收集、存储和提供配置文件,以便随着时间的推移进行查询,它是开源的,可以部署在生产环境中,因为 Parca 专注于对两种主要类型的配置文件进行采样分析:跟踪和采样。
  • Datadog:Datadog Continuous Profiler 始终在任何环境(包括生产环境)中分析和比较代码性能,它指出了由低效代码导致的难以复制的生产问题。还具有自动代码分析洞察力。
  • Google - Cloud Profiler:Cloud Profiler 是一种低开销的统计分析器,可从生产应用程序中持续收集 CPU 使用率和内存分配信息,它具有可操作的应用程序分析、低影响的生产 Profilin 和广泛的平台支持。

④ 为什么使用 Pyroscope?

  • 在开始探索 Pyroscope 之前,来看看它与市场上其他少数可用的连续分析工具有何不同。DataDog 和 Google Cloud Profiler 在业界被广泛使用,正如一位 Reddit 用户所指出的,以下是 Pyroscope 比其他两个更好的一些原因。
  • Datadog、Google Cloud 和 Pyroscope 连续分析功能的比较:

在这里插入图片描述

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

在这里插入图片描述

  • Pyroscope 允许任何语言的分析器向其发送数据,并让存储引擎有效地存储该数据。例如,Pyroscope 具有针对 Go、Python、Ruby、eBPF、Java、.NET、PHP 和 Rust 的语言特定代理。
  • 另一方面,Parca 采用了稍微不同的方法,它依赖 eBPF 来编译 C、C++、Go 等语言。与 Pyroscope 类似,它也可以从 HTTP 端点读取任何pprof 格式的配置文件。
  • 从理论上讲,由于所有这些语言最终都会编译下来并在内核上运行,因此 eBPF 应该适用于这些语言中的任何一种。然而,在实践中,如果你真的为 Python 等解释性语言运行 eBPF,在许多情况下,函数名称对人类来说是不可读的。这是因为符号不是以这些语言存储的。
  • 出于这个原因,Pyroscope 同时支持特定于语言的分析器和 eBPF 分析器。与仅在内核级别运行的 eBPF 相比,这以集成语言特定代理的工作量稍多为代价,但它也带来了更多可操作和人类可读的配置文件的好处。

二、如何安装 Pyroscope?

  • 无论使用什么,Docker、Linux,或者正在寻找 Ruby 或 Go 文档,Pyroscope 都可以启动服务器,然后再启动代理。即使目标是 10 秒或 10 个月的软件分析数据,他们定制设计的存储引擎也可以进行快速查询。
  • 使用 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 二进制文件,这个二进制文件将启动应用程序并注入自己进行监控。使用来自 Google 微服务的 Python、Go 和 .NET 微服务进行演示,所有修改都推送到GitHub 上的 Google 微服务分支,来看看每个服务的这些更改。
  • 要在 Google 微服务演示中试用 Pyroscope,无需自己构建 Docker 镜像,可以只应用 Kubernetes 清单,如从微服务获取分析数据部分所示。

① Python

  • 将使用 Python 编写的电子邮件服务应用程序,在 DockerfilePyroscope 中使用 Python 应用程序需要进行以下更改:
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

  • 采用 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 后,继续构建和推送镜像。

四、从微服务获取分析数据

  • 修改 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 本身在本地存储数据时占用的 CPU 使用率很低,它使用 Badger 数据库在本地存储数据。

五、Pyroscope 资源利用

  • 监控 Kubernetes pod 在资源使用、利用率和成本控制方面也很重要,Pyroscope 使用低资源和低开销,Pyroscope CPU 利用率如下所示:

在这里插入图片描述

六、使用 Pyroscope 进行监控

  • Pyroscope 根据编程语言使用不同的代理来分析代码,如下是一些使用 Pyroscope 的分析应用程序的火焰图示例:
    • 带有 Go 产品目录服务应用程序的 Pyroscope:

在这里插入图片描述

    • Pyroscope 与 .Net Cart 应用程序:

在这里插入图片描述

    • 带有 Python 电子邮件应用程序的 Pyroscope:
      在这里插入图片描述

七、结论

  • 持续分析性能是满足最终用户期望的关键因素,如果出现性能问题,必须准备好在影响最终用户体验之前诊断问题。因此,需要继续优化应用程序并立即解决问题,以继续使用 Pyroscope 等工具为用户提供超快速的应用程序性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1313436.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PR模板,漂亮的文字帖子视频模板,方形标题PR项目工程文件下载

Premiere Pro模板,具有6个方形设计PR视频帖子标题文字PR项目工程文件。使用附带的颜色控制器调整和修改颜色,与您自己的品牌相匹配。使用这些效果来增强视频画面。包括视频教程。 适用软件:PR2019 | 分辨率:10801080(方…

Android APP 常见概念与 adb 命令

adb 的概念 adb 即 Android Debug Bridge 。在窗口输入 adb 即可显示帮助文档。adb 实际上就是在后台开启一个 server,会接收 adb 的命令然后帮助管理,控制,查看设备的状态、信息等,是开发、测试 Android 相关程序的最常用手段。…

第P7周:咖啡豆识别(VGG-16复现)

>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/rbOOmire8OocQ90QM78DRA) 中的学习记录博客** >- **🍖 原作者:[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)** 一、前期工作 import …

Linux 常用命令----mktemp 命令

文章目录 基本用法实例演示高级用法注意事项 mktemp 命令用于创建一个临时文件或目录,这在需要处理临时数据或进行安全性测试时非常有用。使用 mktemp 可以保证文件名的唯一性,避免因文件名冲突而导致的问题。 基本用法 创建临时文件: 命令 mktemp 默认…

【IC验证】perl脚本——分析前/后仿用例回归情况

目录 1 脚本名称 2 脚本使用说明 3 nocare_list文件示例 4 脚本执行方法 5 postsim_result.log文件示例 6 脚本代码 1 脚本名称 post_analysis 2 脚本使用说明 help:打印脚本说明信息 命令:post_analysis help 前/后仿结束后,首先填…

餐饮品牌小红书探店怎么做?建议收藏

对于餐饮行业来说,消费者的口味和选择越来越多样化,如何在众多竞争者中脱颖而出,成为消费者的心头好,探店活动便应运而生。小红书作为国内知名的社交电商平台,拥有庞大的用户群体,特别是年轻人和美食爱好者…

多域名https证书购买选择

多域名https证书是一种特殊的SSL证书,它允许一个证书同时保护多个域名,并且不限制域名的类型,可以保护多个域名和子域名,确保网站传输信息时不被窃取、篡改。那么我们该怎么选择符合需求的多域名https证书呢?今天就随S…

Python神器:快速删除文本文件中指定行的方法

1. 简介 文件操作是编程中的重要方面。Python作为强大的编程语言,提供了处理文件的能力。删除特定行是文件处理中常见的需求。 2. 打开文件和读取内容 当打开文件并读取其内容时,open()函数和with语句是Python中常用的工具。以下是展示如何使用它们的…

由@EnableWebMvc注解引发的Jackson解析异常

同事合了代码到开发分支,并没有涉及到改动的类却报错。错误信息如下: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.conv…

第1章:企业级研发测试流程

通过实际(自研互联网)企业的研发流程一览图。 我们发现分为9个阶段,当然每个公司细节并不一样。 所以我希望你能理解这句话: 一切的流程、行为、结果都是围绕“产品质量”这4个字开展活动。而作为测试,你该考虑的是如何…

数据结构与算法—查找算法(线性查找、二分查找、插值查找、斐波那契查找)

查找算法 文章目录 查找算法1. 线性查找算法2. 二分查找算法2.1 二分查找思路分析2.2 应用实例 3. 插值查找3.1 基本原理3.2 应用实例 4. 斐波那契4.1 基本原理4.2 应用实例 5. 查找总结 在java中,常用的查找有四种: 顺序(线性)查找二分查找/折半查找插值…

JS基本语法

JS基本语法 变量数据类型原始数据类型 函数定义第一种方式第二种方式 JS 对象ArrayStringJavaScript 自定义对象JSONDOMBOM JS 事件事件监听事件绑定常见事件 变量 数据类型 原始数据类型 函数定义 第一种方式 第二种方式 JS 对象 Array String JavaScript 自定义对象 JSON …

2023版本QT学习记录 -2- 标准文件对话框

头文件的使用 #include "QFileDialog"函数原型 getOpenFileName效果 参数 未完待续

电阻的运用

本文引注 https://baijiahao.baidu.com/s?id1749115196647029942&wfrspider&forpc 一、零欧电阻 在电子电路设计时经常用到的一种元件就是电阻,我们都知道电阻在电路中起到分压限流的作用。然而,实际使用时会用到一种特殊的电阻:零…

3ds max软件中的一些常用功能分享!

3ds max软件有很多小伙伴反馈说,明明有很多3ds max教程资料。却不知道如何入门3dmax。 掌握3dmax基本功能是开始使用3dmax的基础之一,所以,小编带大家盘点一下3dmax常用操作。 3dmax常用功能介绍如下,快快跟着小编一起看起来。 1…

[渗透测试学习] Codify - HackTheBox

首先nmap扫描端口 nmap -sV -sC -p- -v --min-rate 1000 10.10.11.239扫出来三个端口,22端口为ssh服务,80端口有http服务,3000端口为nodejs框架 尝试访问下80端口,发现页面重定向 将该域名添加到hosts里 sudo vim /etc/hosts 成…

优先考虑泛型

Java中的泛型(Generics)提供了一种参数化类型的机制,使得你可以编写更灵活、类型安全的代码。下面是一个例子,说明在Java中优先考虑泛型的好处: 考虑一个简单的容器类,它可以存储任意类型的元素&#xff0…

三种好用的在线色彩提取工具

#三种好用的在线色彩提取工具 1.ecjson网站 网址: https://www.ecjson.com/image_color#b1cfea 或点击链接: ecjson在线色彩提取 图1 ecjson网站色彩提取举例 2.微查网 网址:http://zxqsq.wiicha.com/ 或点击链接: 微查网在线色彩提取 …

JaveEE:手动实现定时器精讲

前言 在Java并发编程学习中,定时器是必不可少的环节。 我们知道线程的调度是随机的,但是有的时候我们就是需要它有序一些,此时的定时器就可以很好的解决这个问题。它可以按照一定的先后顺序,将我们的任务依次执行。 目录 一.Java官…

elementui + vue2实现表格行的上下移动

场景&#xff1a; 如上&#xff0c;要实现表格行的上下移动 实现&#xff1a; <el-dialogappend-to-bodytitle"条件编辑":visible.sync"dialogVisible"width"60%"><el-table :data"data1" border style"width: 100%&q…