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

背景

近期 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

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

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

性能告警

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 即可发现性能问题

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

综述

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

本篇作者

黄书昊

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

王帅

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

部署simple-chat项目

simple-chat介绍&#xff1a;此项目是基于openAI3.5模型的h5端人工智能聊天项目&#xff0c;无需翻墙即可体验。 simple-chat线上地址&#xff1a;simple-chat simple-chat项目地址&#xff1a;GitHub - AMxiaoming/simple-chat nginx部署前端步骤&#xff1a; https://blo…

MySQL基础(十八)MySQL8其它新特性

1. MySQL8新特性概述 MySQL从5.7版本直接跳跃发布了8.0版本&#xff0c;可见这是一个令人兴奋的里程碑版本。MySQL 8版本在功能上做了显著的改进与增强&#xff0c;开发者对MySQL的源代码进行了重构&#xff0c;最突出的一点是MySQL Optimizer优化器进行了改进。不仅在速度上得…

HashSet和HashMap内部结构分析

首先明确一点&#xff1a;HashSet的底层就是HashMap HashSet与HashMap的不同点&#xff1a; HashMap存储的是键值对&#xff08;也就是key-value&#xff09;&#xff0c;即在调用HashMap的put方法时传入的两个值&#xff0c;而HashSet其实也是存储的键值对&#xff0c;但是键…

阿里云服务器镜像怎么选?操作系统版本选择说明

阿里云服务器镜像怎么选择&#xff1f;云服务器操作系统镜像分为Linux和Windows两大类&#xff0c;Linux可以选择Alibaba Cloud Linux&#xff0c;Windows可以选择Windows Server 2022数据中心版64位中文版&#xff0c;阿里云百科来详细说下阿里云服务器操作系统有哪些&#xf…

【sop】基于灵敏度分析的有源配电网智能软开关优化配置(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

从爆火的“哇呀挖”,思考我软件开发的人生意义何在?

【 在什么样的花园里面&#xff0c;挖呀挖呀挖&#xff0c;种什么样的种子&#xff0c;开什么样的花&#xff0c;在小小的花园里面&#xff0c;挖呀挖呀挖&#xff0c;种小小的种子&#xff0c;开小小的花&#xff0c;在大大的花园里面&#xff0c;挖呀挖呀挖&#xff0c;种大大…

国内GPU渲染农场有哪些值得推荐?

GPU凭借它在图形渲染领域强大的架构和计算能力&#xff0c;给广大用户带来了一种更为高效的解决方案&#xff0c;我们启用GPU渲染加速&#xff0c;实际就是调用GPU加速图形的渲染和填充。既然聊到GPU渲染&#xff0c;CG行业的朋友们肯定也好奇国内值得推荐的GPU渲染农场有哪些&…

​射频PCB 设计​的六大条技巧

即使是最自信的设计人员&#xff0c;对于射频电路也往往望而却步&#xff0c;因为它会带来巨大的设计挑战&#xff0c;并且需要专业的设计和分析工具。这里将为您介绍六条技巧&#xff0c;来帮助您简化任何射频PCB 设计任务和减轻工作压力&#xff01; 1、保持完好、精确的射频…

Android网络代理原理及实现

网络代理简介 代理典型的分为三种类型&#xff1a; 正向代理 缓存服务器使用的代理机制最早是放在客户端一侧的&#xff0c;是代理的原型&#xff0c;称为正向代理。其目的之一 是缓存&#xff0c;另一目的是用来实现防火墙&#xff08;阻止互联网与公司内网之间的包&#x…

第十二章_Redis单线程 VS 多线程

Redis为什么选择单线程&#xff1f; 是什么 这种问法其实并不严谨&#xff0c;为啥这么说呢? Redis的版本很多3.x、4.x、6.x&#xff0c;版本不同架构也是不同的&#xff0c;不限定版本问是否单线程也不太严谨。 1 版本3.x &#xff0c;最早版本&#xff0c;也就是大家口口相…

Day965.从持续集成到持续部署 -遗留系统现代化实战

从持续集成到持续部署 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于从持续集成到持续部署的内容。 只有做好任务分解和小步提交&#xff0c;才能放心大胆地 PUSH 代码&#xff0c;触发持续构建&#xff1b; 只有通过质量门禁&#xff0c;才能得到一个有信心的制…

( 位运算 ) 268. 丢失的数字 ——【Leetcode每日一题】

❓268. 丢失的数字 难度&#xff1a;简单 给定一个包含 [0, n] 中 n 个数的数组 nums &#xff0c;找出 [0, n] 这个范围内没有出现在数组中的那个数。 示例 1&#xff1a; 输入&#xff1a;nums [3,0,1] 输出&#xff1a;2 解释&#xff1a;n 3&#xff0c;因为有 3 个数…

干货分享|一款让企业知识管理变得简单高效的工具软件

互联网发展到下半场&#xff0c;很多企业都开始进行数字化转型&#xff0c;在这个过程中&#xff0c;很多企业都忽视了极为重要的一点——企业的知识管理。如今信息化的时代&#xff0c;可以说企业的知识管理是引领企业数字化转型、进行创新的关键。 企业知识管理的实质就是对…

视频文本检索之CLIP4Clip

论文&#xff1a;CLIP4Clip: An Empirical Study of CLIP for End to End Video Clip Retrieval GitHub&#xff1a;https://github.com/ArrowLuo/CLIP4Clip 学习是一种行动反射&#xff0c; 不是为了晓得些“知识”&#xff0c; 要切己体察&#xff0c;代入自己&#xff0c…

mid360激光雷达跑Point-LIO算法

在商场里面上下楼穿梭,使用mid360激光雷达,完成建图 以下是建图的运行过程及参数配置 mid360激光雷达驱动 安装(ubuntu20.4 ) /ws_livox/src/livox_ros_driver2$source /opt/ros/noetic/setup.sh /ws_livox/src/livox_ros_driver2$./build.sh ROS1配置修改MID360_confi…

可拓展哈希

可拓展哈希 借CMU 15445的ppt截图来说明问题。 我们传统静态hash的过程是hash函数后直接将值存入对应的bucket&#xff0c;但是在可扩展hash中&#xff0c;得查询Directory&#xff08;左&#xff09;&#xff0c;存入directory指向的bucket&#xff08;右&#xff09;。 下面…

ASEMI代理ADI亚德诺LTC6992IS6-1#TRMPBF车规级芯片

编辑-Z LTC6992IS6-1#TRMPBF参数描述&#xff1a; 型号&#xff1a;LTC6992IS6-1#TRMPBF 输出频率&#xff1a;3.81Hz 工作电源电压范围&#xff1a;2.25 - 5.5V 通电复位电压&#xff1a;1.95V 电源电流&#xff1a;105-365A SET引脚处的电压&#xff1a;1V 频率设置电…

物联网|IAR集成开发环境简介|cc254核心板硬件资源|物联网之蓝牙4.0 BLE基础-学习笔记(3)

文章目录 4、IAR集成开发环境简介5、 cc254核心板硬件资源 4、IAR集成开发环境简介 完整稳定的专业嵌入式开发环境&#xff0c;对不同的处理器有统一的用户界面&#xff0c;支持35种以上的MCU&#xff0c;包括8&#xff0c;16&#xff0c;32位&#xff0c; 完全兼容C语言的 高…

FPN和PAN的内容及区别

FPN和PAN都是用于解决在目标检测中特征金字塔网络(FPN)在多尺度检测任务上的不足的方法。下面分别详细介绍一下它们的原理和区别。 FPN FPN全称Feature Pyramid Network&#xff0c;是由FAIR在2017年提出的一种处理多尺度问题的方法。FPN的主要思路是通过构建金字塔式的特征图…

【CSS系列】第四章 · CSS字体属性

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…
最新文章