共计 4179 个字符,预计需要花费 11 分钟才能阅读完成。
背景
近期 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/6309aed2e0f88a79bcf…