{"value":"### **背景**\n近期 Amazon Fargate 在中国区正式落地,因 Fargate 使用 Serverless 架构,更加适合对性能要求不敏感的服务使用,Pyroscope 是一款基于 Golang 开发的应用程序性能分析工具,Pyroscope 的服务端为无状态服务且性能要求不敏感,使用 EKS Fargate 搭建 Pyroscope,Pyroscope 的客户端使用 DNS 地址连接到服务端。将为单次性能测试和持续性能优化提供保障,并且每当应用服务上线或更新后,流量增加或者功能故障都会造成终端用户的体验变差,如何定位性能瓶颈便成为了重点,在 EKS Fargate上 搭建 Pyroscope 既能减少开发者的维护成本又能给开发者开箱即用的性能瓶颈快速定位到代码的平台,而且 Pyroscope 支持 Python,Rust,NodeJS,Rube,Java,DotNet,Golang 等多语言环境\n\n### **使用场景**\n- 快速发现源代码中的存在的性能问题\n- 根据指标监控发现高 CPU 利用率的问题\n- 快速定位内存泄漏和修复辅助提供有效支撑\n- 深入理解应用程序的调用耗时和依赖树\n- 跟踪指标和时间轴以便于定位性能异常点\n- 集成到 CI 定位每次变更的性能情况\n\n### **介绍下 Pyroscope**\n\n这是一款开源的实时性能监控平台,使用 Agent/SDK – Server 架构,让开发者可以轻松监控服务性能,因 Pyroscope 监控的级别足够深入。不管是最近5秒的数据还是长期存储的性能数据,都可以快速通过 Grafana Plugin 或者 Pyroscope UI 进行定位。且因为使用分块采样的能力。使得使用 Pyrosocpe 的 Agent 对应用程序的 CPU 占用较低。\n\n![image.png](https://dev-media.amazoncloud.cn/6339fb82a4a24e4d90a1756669167970_image.png)\n\nPyroscope Server 采用 BadgerDB 作为 Key-value 数据存储(未来将会支持 S3 兼容存储),具有高压缩比,低磁盘空间占用和低成本。支持多种语言和 Docker,k8s,EC2 等多种平台注入,Python,Rube,Java,DotNet 都是通过 pyrosocope 的命令启动相关 Agent 来执行监控,针对 metric-export 和 eBPF 有也有相关支持\n\nPyrosocpe UI 使用的方式和 Grafana 相似,可以使用 Grafana Plugin 也可以使用 Pyroscope UI 使用,名词使用:inuse_object,alloc_objects,inuse_space,alloc_space, 分别对应已分配或者尚未分配的对象在内存中的占用\n\nPyroscope UI\n\n![image.png](https://dev-media.amazoncloud.cn/d55c62e802b5406e948200bf8d25b9c8_image.png)\n\nPyroscope + Grafana Logs: 根据当前 Logs volume 找到存在性能问题的代码行,快速定位问题\n\n![image.png](https://dev-media.amazoncloud.cn/7eec273f7e5549f4b1f021a11b990608_image.png)\n\nPyroscope + Tracing(Jaeger) : 根据 Pyroscope_id 在 jaeger 中找到对应的请求用于故障排除\n\n![image.png](https://dev-media.amazoncloud.cn/d0655332f38446ff8cd7b30279657b85_image.png)\n\n### **性能告警**\n\nPyrosocpe 支持将应用服务性能指标导出到 Prometheus,联动 Prometheus 全家桶进行服务耗时跟踪和性能的异常告警,只需要将 Pyroscope 配置到Prometheus配置文件中。使得 Prometheus 可以使用 Kubernetes_sd 主动发现数据并采集上报\n\n### **部署指南**\n\n- 将样例代码的远端仓库克隆到本地\n\n```\\ngit clone [github.com/Hoverhuang-er/eks-fargate-ppf](http://github.com/Hoverhuang-er/eks-fargate-ppf) && mv eks-fargate-ppf ppf\\n```\n- 使用 Terraform 创建 AWS EKS Cluster 和 Fargate profile\n\n```\\ncd ppf/eks && terraform init && terraform apply -auto-approve\\n```\n- 使用 kubectl 部署 Pyroscope\n\n```\\n---\\napiVersion: v1\\nkind: Namespace\\nmetadata:\\n name: fg1\\n---\\napiVersion: apps/v1\\nkind: StatefulSet\\nmetadata:\\n namespace: fg1\\n name: pyroscope-server\\nspec:\\n volumeClaimTemplates:\\n - metadata:\\n name: pyroscope-server-storage\\n spec:\\n accessModes: [ \\"ReadWriteOnce\\" ]\\n storageClassName: \\"gp2\\"\\n resources:\\n requests:\\n storage: 8Gi\\n minReadySeconds: 10\\n selector:\\n matchLabels:\\n app.kubernetes.io/name: pyroscope-server\\n replicas: 1\\n template:\\n metadata:\\n labels:\\n app.kubernetes.io/name: pyroscope-server\\n spec:\\n containers:\\n - image: dockerhub.io/pyroscope/pyroscope:latest\\n imagePullPolicy: Always\\n name: pyroscope-server\\n ports:\\n - containerPort: 80\\n---\\napiVersion: v1\\nkind: Service\\nmetadata:\\n namespace: fg1\\n name: pyroscope-server-services\\nspec:\\n ports:\\n - port: 80\\n targetPort: 80\\n protocol: TCP\\n type: NodePort\\n selector:\\n app.kubernetes.io/name: pyroscope-server\\n---\\napiVersion: networking.k8s.io/v1\\nkind: Ingress\\nmetadata:\\n namespace: fg1\\n name: pyroscope-server-ingress\\n annotations:\\n alb.ingress.kubernetes.io/scheme: internet-facing\\n alb.ingress.kubernetes.io/target-type: ip\\nspec:\\n ingressClassName: alb\\n rules:\\n - http:\\n paths:\\n - path: /*\\n pathType: Prefix\\n backend:\\n service:\\n name: pyroscope-server\\n port:\\n number: 80\\n```\n\n- 使用 Skooner 或者 \n [Potainer.io](http://Potainer.io) 对EKS 集群进行简单管理\n- kubectl apply -f ppf/dashboard.yaml\n\n### **如何使用 Pyroscope 进行性能优化**\nPyroscope 具有代码侵入性,如需进一步使用,请谨慎考虑\n\n样例代码:Ruby\n\n```\\nrequire \\"pyroscope\\"\\n\\nPyroscope.configure do |config|\\n config.app_name = \\"test.ruby.app\\"\\n config.server_address = ENV[\\"PYROSCOPE_SERVER_ADDRESS\\"]\\n config.tags = {\\n :region => \\"ap-southeast-1\\",\\n :hostname => ENV[\\"HOSTNAME\\"]\\n }\\nend\\n\\ndef work(n)\\n i = 0\\n while i < n\\n i += 1\\n end\\nend\\n\\ndef fast_function\\n Pyroscope.tag_wrapper({ \\"function\\" => \\"fast\\" }) do\\n work(20000)\\n end\\nend\\n\\ndef slow_function\\n Pyroscope.tag({ \\"function\\" => \\"slow\\" })\\n work(80000)\\n Pyroscope.remove_tags(\\"function\\")\\nend\\n\\nwhile true\\n fast_function\\n slow_function\\nend\\n```\n\n用于部署的 Dockerfile:\n\n```\\nFROM ruby:3.0.1\\n\\nWORKDIR /usr/src/app\\n\\nRUN adduser --disabled-password --gecos --quiet pyroscope\\nUSER pyroscope\\n\\nCOPY --from=pyroscope/pyroscope:latest /usr/bin/pyroscope /usr/bin/pyroscope\\nCOPY main.rb ./main.rb\\nCOPY Gemfile ./Gemfile\\nCOPY Gemfile.lock ./Gemfile.lock\\n\\nENV PYROSCOPE_APPLICATION_NAME=simple.ruby.app\\nENV PYROSCOPE_SERVER_ADDRESS=http://172.31.0.233:4040/\\nENV PYROSCOPE_LOG_LEVEL=debug\\n\\nRUN bundle install\\n\\nCMD [\\"ruby\\", \\"main.rb\\"]\\n```\n\n### **运行 App 即可发现性能问题**\n\n根据下图中的耗时高的问题进行分析是否可以优化\n\n![image.png](https://dev-media.amazoncloud.cn/442e3b5ac00b4a72b64df7a2864a29a8_image.png)\n\n### **综述**\n\n使用 Pyroscope 有助于开发人员持续提高应用程序的性能。减少耗时爆点的存在和影响,并可以将数据输出到 Grafana,协助开发人员持续优化服务并有效降低成本,使用 [Amazon EKS](https://aws.amazon.com/cn/eks/?trk=cndc-detail) Fargate 搭建 Pyroscope 在帮助开发人员和维护人员进行系统服务性能架构优化的同时,基于 Serveless contaienr 减少维护成本。\n\n### **本篇作者**\n\n![image.png](https://dev-media.amazoncloud.cn/af5e08e34faa4fe08f9e04fdcbb7012a_image.png)\n\n#### **黄书昊**\n\nAmazon ProServe DevOps 顾问,致力于解决企业客户 DevOps 咨询和实施,在云原生 /DevOps/ 微服务框架/性能优化和加速研发效能领域有深入研究的热情\n\n![image.png](https://dev-media.amazoncloud.cn/1a66c0cd2684439f91b4eb83e9321666_image.png)\n\n#### **王帅**\n\nAmazon 专业服务团队 Devops 顾问。提倡融合文化,实践和工具的Devops 理念,致力于帮助客户使组织能够以更高的速度和可靠性交付产品并获得业务价值。擅长平台规划,迁移和工具链设计。对新鲜事物充满热情\n","render":"<h3><a id=\\"_0\\"></a><strong>背景</strong></h3>\\n<p>近期 Amazon Fargate 在中国区正式落地,因 Fargate 使用 Serverless 架构,更加适合对性能要求不敏感的服务使用,Pyroscope 是一款基于 Golang 开发的应用程序性能分析工具,Pyroscope 的服务端为无状态服务且性能要求不敏感,使用 EKS Fargate 搭建 Pyroscope,Pyroscope 的客户端使用 DNS 地址连接到服务端。将为单次性能测试和持续性能优化提供保障,并且每当应用服务上线或更新后,流量增加或者功能故障都会造成终端用户的体验变差,如何定位性能瓶颈便成为了重点,在 EKS Fargate上 搭建 Pyroscope 既能减少开发者的维护成本又能给开发者开箱即用的性能瓶颈快速定位到代码的平台,而且 Pyroscope 支持 Python,Rust,NodeJS,Rube,Java,DotNet,Golang 等多语言环境</p>\n<h3><a id=\\"_3\\"></a><strong>使用场景</strong></h3>\\n<ul>\\n<li>快速发现源代码中的存在的性能问题</li>\n<li>根据指标监控发现高 CPU 利用率的问题</li>\n<li>快速定位内存泄漏和修复辅助提供有效支撑</li>\n<li>深入理解应用程序的调用耗时和依赖树</li>\n<li>跟踪指标和时间轴以便于定位性能异常点</li>\n<li>集成到 CI 定位每次变更的性能情况</li>\n</ul>\\n<h3><a id=\\"_Pyroscope_11\\"></a><strong>介绍下 Pyroscope</strong></h3>\\n<p>这是一款开源的实时性能监控平台,使用 Agent/SDK – Server 架构,让开发者可以轻松监控服务性能,因 Pyroscope 监控的级别足够深入。不管是最近5秒的数据还是长期存储的性能数据,都可以快速通过 Grafana Plugin 或者 Pyroscope UI 进行定位。且因为使用分块采样的能力。使得使用 Pyrosocpe 的 Agent 对应用程序的 CPU 占用较低。</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/6339fb82a4a24e4d90a1756669167970_image.png\\" alt=\\"image.png\\" /></p>\n<p>Pyroscope Server 采用 BadgerDB 作为 Key-value 数据存储(未来将会支持 S3 兼容存储),具有高压缩比,低磁盘空间占用和低成本。支持多种语言和 Docker,k8s,EC2 等多种平台注入,Python,Rube,Java,DotNet 都是通过 pyrosocope 的命令启动相关 Agent 来执行监控,针对 metric-export 和 eBPF 有也有相关支持</p>\n<p>Pyrosocpe UI 使用的方式和 Grafana 相似,可以使用 Grafana Plugin 也可以使用 Pyroscope UI 使用,名词使用:inuse_object,alloc_objects,inuse_space,alloc_space, 分别对应已分配或者尚未分配的对象在内存中的占用</p>\n<p>Pyroscope UI</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/d55c62e802b5406e948200bf8d25b9c8_image.png\\" alt=\\"image.png\\" /></p>\n<p>Pyroscope + Grafana Logs: 根据当前 Logs volume 找到存在性能问题的代码行,快速定位问题</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/7eec273f7e5549f4b1f021a11b990608_image.png\\" alt=\\"image.png\\" /></p>\n<p>Pyroscope + Tracing(Jaeger) : 根据 Pyroscope_id 在 jaeger 中找到对应的请求用于故障排除</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/d0655332f38446ff8cd7b30279657b85_image.png\\" alt=\\"image.png\\" /></p>\n<h3><a id=\\"_33\\"></a><strong>性能告警</strong></h3>\\n<p>Pyrosocpe 支持将应用服务性能指标导出到 Prometheus,联动 Prometheus 全家桶进行服务耗时跟踪和性能的异常告警,只需要将 Pyroscope 配置到Prometheus配置文件中。使得 Prometheus 可以使用 Kubernetes_sd 主动发现数据并采集上报</p>\n<h3><a id=\\"_37\\"></a><strong>部署指南</strong></h3>\\n<ul>\\n<li>将样例代码的远端仓库克隆到本地</li>\n</ul>\\n<pre><code class=\\"lang-\\">git clone [github.com/Hoverhuang-er/eks-fargate-ppf](http://github.com/Hoverhuang-er/eks-fargate-ppf) && mv eks-fargate-ppf ppf\\n</code></pre>\\n<ul>\\n<li>使用 Terraform 创建 AWS EKS Cluster 和 Fargate profile</li>\n</ul>\\n<pre><code class=\\"lang-\\">cd ppf/eks && terraform init && terraform apply -auto-approve\\n</code></pre>\\n<ul>\\n<li>使用 kubectl 部署 Pyroscope</li>\n</ul>\\n<pre><code class=\\"lang-\\">---\\napiVersion: v1\\nkind: Namespace\\nmetadata:\\n name: fg1\\n---\\napiVersion: apps/v1\\nkind: StatefulSet\\nmetadata:\\n namespace: fg1\\n name: pyroscope-server\\nspec:\\n volumeClaimTemplates:\\n - metadata:\\n name: pyroscope-server-storage\\n spec:\\n accessModes: [ "ReadWriteOnce" ]\\n storageClassName: "gp2"\\n resources:\\n requests:\\n storage: 8Gi\\n minReadySeconds: 10\\n selector:\\n matchLabels:\\n app.kubernetes.io/name: pyroscope-server\\n replicas: 1\\n template:\\n metadata:\\n labels:\\n app.kubernetes.io/name: pyroscope-server\\n spec:\\n containers:\\n - image: dockerhub.io/pyroscope/pyroscope:latest\\n imagePullPolicy: Always\\n name: pyroscope-server\\n ports:\\n - containerPort: 80\\n---\\napiVersion: v1\\nkind: Service\\nmetadata:\\n namespace: fg1\\n name: pyroscope-server-services\\nspec:\\n ports:\\n - port: 80\\n targetPort: 80\\n protocol: TCP\\n type: NodePort\\n selector:\\n app.kubernetes.io/name: pyroscope-server\\n---\\napiVersion: networking.k8s.io/v1\\nkind: Ingress\\nmetadata:\\n namespace: fg1\\n name: pyroscope-server-ingress\\n annotations:\\n alb.ingress.kubernetes.io/scheme: internet-facing\\n alb.ingress.kubernetes.io/target-type: ip\\nspec:\\n ingressClassName: alb\\n rules:\\n - http:\\n paths:\\n - path: /*\\n pathType: Prefix\\n backend:\\n service:\\n name: pyroscope-server\\n port:\\n number: 80\\n</code></pre>\\n<ul>\\n<li>使用 Skooner 或者<br />\\n<a href=\\"http://Potainer.io\\" target=\\"_blank\\">Potainer.io</a> 对EKS 集群进行简单管理</li>\\n<li>kubectl apply -f ppf/dashboard.yaml</li>\n</ul>\\n<h3><a id=\\"_Pyroscope__130\\"></a><strong>如何使用 Pyroscope 进行性能优化</strong></h3>\\n<p>Pyroscope 具有代码侵入性,如需进一步使用,请谨慎考虑</p>\n<p>样例代码:Ruby</p>\n<pre><code class=\\"lang-\\">require "pyroscope"\\n\\nPyroscope.configure do |config|\\n config.app_name = "test.ruby.app"\\n config.server_address = ENV["PYROSCOPE_SERVER_ADDRESS"]\\n config.tags = {\\n :region => "ap-southeast-1",\\n :hostname => ENV["HOSTNAME"]\\n }\\nend\\n\\ndef work(n)\\n i = 0\\n while i < n\\n i += 1\\n end\\nend\\n\\ndef fast_function\\n Pyroscope.tag_wrapper({ "function" => "fast" }) do\\n work(20000)\\n end\\nend\\n\\ndef slow_function\\n Pyroscope.tag({ "function" => "slow" })\\n work(80000)\\n Pyroscope.remove_tags("function")\\nend\\n\\nwhile true\\n fast_function\\n slow_function\\nend\\n</code></pre>\\n<p>用于部署的 Dockerfile:</p>\n<pre><code class=\\"lang-\\">FROM ruby:3.0.1\\n\\nWORKDIR /usr/src/app\\n\\nRUN adduser --disabled-password --gecos --quiet pyroscope\\nUSER pyroscope\\n\\nCOPY --from=pyroscope/pyroscope:latest /usr/bin/pyroscope /usr/bin/pyroscope\\nCOPY main.rb ./main.rb\\nCOPY Gemfile ./Gemfile\\nCOPY Gemfile.lock ./Gemfile.lock\\n\\nENV PYROSCOPE_APPLICATION_NAME=simple.ruby.app\\nENV PYROSCOPE_SERVER_ADDRESS=http://172.31.0.233:4040/\\nENV PYROSCOPE_LOG_LEVEL=debug\\n\\nRUN bundle install\\n\\nCMD ["ruby", "main.rb"]\\n</code></pre>\\n<h3><a id=\\"_App__196\\"></a><strong>运行 App 即可发现性能问题</strong></h3>\\n<p>根据下图中的耗时高的问题进行分析是否可以优化</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/442e3b5ac00b4a72b64df7a2864a29a8_image.png\\" alt=\\"image.png\\" /></p>\n<h3><a id=\\"_202\\"></a><strong>综述</strong></h3>\\n<p>使用 Pyroscope 有助于开发人员持续提高应用程序的性能。减少耗时爆点的存在和影响,并可以将数据输出到 Grafana,协助开发人员持续优化服务并有效降低成本,使用 Amazon EKS Fargate 搭建 Pyroscope 在帮助开发人员和维护人员进行系统服务性能架构优化的同时,基于 Serveless contaienr 减少维护成本。</p>\n<h3><a id=\\"_206\\"></a><strong>本篇作者</strong></h3>\\n<p><img src=\\"https://dev-media.amazoncloud.cn/af5e08e34faa4fe08f9e04fdcbb7012a_image.png\\" alt=\\"image.png\\" /></p>\n<h4><a id=\\"_210\\"></a><strong>黄书昊</strong></h4>\\n<p>Amazon ProServe DevOps 顾问,致力于解决企业客户 DevOps 咨询和实施,在云原生 /DevOps/ 微服务框架/性能优化和加速研发效能领域有深入研究的热情</p>\n<p><img src=\\"https://dev-media.amazoncloud.cn/1a66c0cd2684439f91b4eb83e9321666_image.png\\" alt=\\"image.png\\" /></p>\n<h4><a id=\\"_216\\"></a><strong>王帅</strong></h4>\\n<p>Amazon 专业服务团队 Devops 顾问。提倡融合文化,实践和工具的Devops 理念,致力于帮助客户使组织能够以更高的速度和可靠性交付产品并获得业务价值。擅长平台规划,迁移和工具链设计。对新鲜事物充满热情</p>\n"}