首页 > 其他分享 >基于 EKS Fargate 搭建微服务性能分析系统

基于 EKS Fargate 搭建微服务性能分析系统

时间:2023-05-06 19:55:58浏览次数:53  
标签:Fargate pyroscope 性能 name Pyroscope server EKS 搭建

 

背景

近期 Amazon Fargate 在中国区正式落地,因 Fargate 使用 Serverless 架构,更加适合对性能要求不敏感的服务使用,Pyroscope 是一款基于 Golang 开发的应用程序性能分析工具,Pyroscope 的服务端为无状态服务且性能要求不敏感,使用 EKS Fargate 搭建 Pyroscope,Pyroscope 的客户端使用 DNS 地址连接到服务端。将为单次性能测试和持续性能优化提供保障,并且每当应用服务上线或更新后,流量增加或者功能故障都会造成终端用户的体验变差,如何定位性能瓶颈便成为了重点,在 EKS Fargate上 搭建 Pyroscope 既能减少开发者的维护成本又能给开发者开箱即用的性能瓶颈快速定位到代码的平台,而且 Pyroscope 支持 Python,Rust,NodeJS,Rube,Java,DotNet,Golang 等多语言环境

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!

 

使用场景

  • 快速发现源代码中的存在的性能问题
  • 根据指标监控发现高 CPU 利用率的问题
  • 快速定位内存泄漏和修复辅助提供有效支撑
  • 深入理解应用程序的调用耗时和依赖树
  • 跟踪指标和时间轴以便于定位性能异常点
  • 集成到 CI 定位每次变更的性能情况

介绍下 Pyroscope

这是一款开源的实时性能监控平台,使用 Agent/SDK – Server 架构,让开发者可以轻松监控服务性能,因 Pyroscope 监控的级别足够深入。不管是最近5秒的数据还是长期存储的性能数据,都可以快速通过 Grafana Plugin 或者 Pyroscope UI 进行定位。且因为使用分块采样的能力。使得使用 Pyrosocpe 的 Agent 对应用程序的 CPU 占用较低。

 

Pyroscope Server 采用 BadgerDB 作为 Key-value 数据存储(未来将会支持 S3 兼容存储),具有高压缩比,低磁盘空间占用和低成本。支持多种语言和 Docker,k8s,EC2 等多种平台注入,Python,Rube,Java,DotNet 都是通过 pyrosocope 的命令启动相关 Agent 来执行监控,针对 metric-export 和 eBPF 有也有相关支持

Pyrosocpe UI 使用的方式和 Grafana 相似,可以使用 Grafana Plugin 也可以使用 Pyroscope UI 使用,名词使用:inuse_object,alloc_objects,inuse_space,alloc_space, 分别对应已分配或者尚未分配的对象在内存中的占用

Pyroscope UI

image.png

Pyroscope + Grafana Logs: 根据当前 Logs volume 找到存在性能问题的代码行,快速定位问题

image.png

Pyroscope + Tracing(Jaeger) : 根据 Pyroscope_id 在 jaeger 中找到对应的请求用于故障排除

image.png

性能告警

Pyrosocpe 支持将应用服务性能指标导出到 Prometheus,联动 Prometheus 全家桶进行服务耗时跟踪和性能的异常告警,只需要将 Pyroscope 配置到Prometheus配置文件中。使得 Prometheus 可以使用 Kubernetes_sd 主动发现数据并采集上报

部署指南

  • 将样例代码的远端仓库克隆到本地
git clone [github.com/Hoverhuang-er/eks-fargate-ppf](http://github.com/Hoverhuang-er/eks-fargate-ppf) && mv eks-fargate-ppf ppf
  • 使用 Terraform 创建 AWS EKS Cluster 和 Fargate profile
cd ppf/eks && terraform init && terraform apply -auto-approve
  • 使用 kubectl 部署 Pyroscope
---
apiVersion: v1
kind: Namespace
metadata:
  name: fg1
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: fg1
  name: pyroscope-server
spec:
  volumeClaimTemplates:
    - metadata:
        name: pyroscope-server-storage
      spec:
        accessModes: [ "ReadWriteOnce" ]
        storageClassName: "gp2"
        resources:
          requests:
            storage: 8Gi
  minReadySeconds: 10
  selector:
    matchLabels:
      app.kubernetes.io/name: pyroscope-server
  replicas: 1
  template:
    metadata:
      labels:
        app.kubernetes.io/name: pyroscope-server
    spec:
      containers:
      - image: dockerhub.io/pyroscope/pyroscope:latest
        imagePullPolicy: Always
        name: pyroscope-server
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  namespace: fg1
  name: pyroscope-server-services
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  type: NodePort
  selector:
    app.kubernetes.io/name: pyroscope-server
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: fg1
  name: pyroscope-server-ingress
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
spec:
  ingressClassName: alb
  rules:
    - http:
        paths:
        - path: /*
          pathType: Prefix
          backend:
            service:
              name: pyroscope-server
              port:
                number: 80
  • 使用 Skooner 或者 Potainer.io 对EKS 集群进行简单管理
  • kubectl apply -f ppf/dashboard.yaml

如何使用 Pyroscope 进行性能优化

Pyroscope 具有代码侵入性,如需进一步使用,请谨慎考虑

样例代码:Ruby

require "pyroscope"

Pyroscope.configure do |config|
  config.app_name = "test.ruby.app"
  config.server_address = ENV["PYROSCOPE_SERVER_ADDRESS"]
  config.tags = {
    :region => "ap-southeast-1",
    :hostname => ENV["HOSTNAME"]
  }
end

def work(n)
  i = 0
  while i < n
    i += 1
  end
end

def fast_function
  Pyroscope.tag_wrapper({ "function" => "fast" }) do
    work(20000)
  end
end

def slow_function
  Pyroscope.tag({ "function" => "slow" })
    work(80000)
  Pyroscope.remove_tags("function")
end

while true
  fast_function
  slow_function
end

用于部署的 Dockerfile:

FROM ruby:3.0.1

WORKDIR /usr/src/app

RUN adduser --disabled-password --gecos --quiet pyroscope
USER pyroscope

COPY --from=pyroscope/pyroscope:latest /usr/bin/pyroscope /usr/bin/pyroscope
COPY main.rb ./main.rb
COPY Gemfile ./Gemfile
COPY Gemfile.lock ./Gemfile.lock

ENV PYROSCOPE_APPLICATION_NAME=simple.ruby.app
ENV PYROSCOPE_SERVER_ADDRESS=http://172.31.0.233:4040/
ENV PYROSCOPE_LOG_LEVEL=debug

RUN bundle install

CMD ["ruby", "main.rb"]

运行 App 即可发现性能问题

根据下图中的耗时高的问题进行分析是否可以优化

image.png

综述

使用 Pyroscope 有助于开发人员持续提高应用程序的性能。减少耗时爆点的存在和影响,并可以将数据输出到 Grafana,协助开发人员持续优化服务并有效降低成本,使用 Amazon EKS Fargate 搭建 Pyroscope 在帮助开发人员和维护人员进行系统服务性能架构优化的同时,基于 Serveless contaienr 减少维护成本。

本篇作者

image.png

黄书昊

Amazon ProServe DevOps 顾问,致力于解决企业客户 DevOps 咨询和实施,在云原生 /DevOps/ 微服务框架/性能优化和加速研发效能领域有深入研究的热情

image.png

王帅

Amazon 专业服务团队 Devops 顾问。提倡融合文化,实践和工具的Devops 理念,致力于帮助客户使组织能够以更高的速度和可靠性交付产品并获得业务价值。擅长平台规划,迁移和工具链设计。对新鲜事物充满热情

文章来源:https://dev.amazoncloud.cn/column/article/6309aed2e0f88a79bcfae7f2?sc_medium=regulartraffic&amp;sc_campaign=crossplatform&amp;sc_channel=bokey

标签:Fargate,pyroscope,性能,name,Pyroscope,server,EKS,搭建
From: https://www.cnblogs.com/AmazonwebService/p/17378336.html

相关文章

  • Tapdata 的 ∞ 实践:中小企业如何轻量、高效地搭建起一个灵活易用的数字化平台
    数字化浪潮的裹挟下,企业的转型之路正在变得愈加清晰。然而在数字化转型这条企业生存和发展的必由之路上,更易受到市场变化冲击、所处环境竞争压力更大的中小企业无疑在面临更多的困难和挑战。一方面,中小企业为了顺应时代潮流、适应市场需求,需要积极采取措施,推进数字化转型,实现自......
  • 搭建keepalived+LVS+nginx高可用集群负载均衡
    在LVS服务器上安装Keepalived,参考(https://www.cnblogs.com/xiaodunan/p/17374699.html)修改核心配置文件cd/etc/keepalived/vimkeepalived.confglobal_defs{router_idLVS_1}vrrp_instanceVI_1{stateMASTERinterfaceeth0virtual_router_id41......
  • CentOS7搭建LAMP环境
    一、LMAP版本VMware版本:16.2.4Linux版本:CentOS7.7Apache版本:Apache2.4.6MySQL版本:MySQL5.6.51PHP版本:PHP7.2.34二、Apache环境配置1.安装配置LAMP环境需要的辅助工具(vim、tmux和wget)yuminstallvimtmuxwget-y2.安装Apache(×)yum-yinstallhttpd......
  • spring cloud、gradle、父子项目、微服务框架搭建---搭建父子级多模块项目,并注册到Eu
    一、新建一个父级gradl模块1.在桌面或新建文件里面,右键,打开IDEA选择Flie>NEW>Module选择Gradle,选择ModuleSDK1.8,选择Java创建完成后,idea中会多出一个项目,如下图示例然后直接关闭当前idea,进入刚才创建好的文件下,再次打开项目可以直接删除src目录二、新建子级gradl模......
  • 在docker中搭建nominatim服务
    nominatim推荐配置(https://nominatim.org/release-docs/4.2/admin/Installation/#tuning-the-postgresql-database):至少需要2GB的RAM,否则安装将失败。对于完整的星球导入,强烈建议使用128GB或更多的RAM。如果您的RAM小于64GB,请不要报告内存不足问题。对于完整的星球安装,您......
  • 使用MASA全家桶从零开始搭建IoT平台(二)设备注册
    前言我们不希望任何设备都可以接入我们的IoT平台,所以一个设备正常的接入流程是这样的,1、上位机软件通过串口或其他方式读取设备的唯一标识码UUID。2、上位机调用IoT后台接口,发送UUID和ProductID。3、后台接口判断设备是否注册过,如果没有注册过,就根据ProductID并按照一定规律生......
  • Linux下搭建Python2.7环境
    Python(英语发音:/ˈpaɪθən/),是一种面向对象、解释型计算机程序设计语言,由1989年底发明。python具有简单、易学、免费、开源、可移植性、解释性、可嵌入性等特点,是一种不受局限、跨平台的开源编程语言,它功能强大且简单易学,因而得到了广泛应用和支持。1.Python下载Pyt......
  • 怎么搭建web组态
    web组态是指通过可视化拖拽组件的方式,低代码搭建监控大屏、web页面。物联网各行业的数据以及监控场景,每个行业的业务不同,需要展示的页面也不同。组态快速搭建页面的优势,能更好的满足不同定制化监控页面的需求。BY组态软件,专注于能源电力、工业互联网、智能制造、原型设计等领域......
  • 怎么搭建web组态
    Web组态是指通过可视化拖拽组件的方式,低代码搭建监控大屏、web页面。物联网各行业的数据以及监控场景,每个行业的业务不同,需要展示的页面也不同。组态快速搭建页面的优势,能更好的满足不同定制化监控页面的需求。BY组态软件,专注于能源电力、工业互联网、智能制造、原型设计等领域的......
  • 力扣vscode刷题环境搭建
    1.安装nodejs环境https://nodejs.cn/download/2.vscode下载leetcode插件3.配置插件配置以上2项后重启vscode4.登录leetcode账号......