开发人员常常需要跟踪生产环境中的应用程序的性能瓶颈,并试图找出造成瓶颈的根本原因。要做到这一点,他们通常会通过日志来收集这些信息。不幸的是,这种方法可能会很耗时,而且无法提供有关潜在问题的足够详细的信息。
一种现代且更先进的方法是应用和使用profiling技术和工具,突出显示最慢的应用程序代码和消耗大部分资源(如CPU和内存)的方法。持续分析(Continuous profiling)是在生产环境中持续 收集应用程序性能数据,并将这些数据提供给开发人员进行深入分析的过程。
通过,我们通过采集程序的指标,生成一个概要文件(Profile)进行单次的分析。Go语言提供了pprof工具,可以很方便的生成profile文件。你可以通过程序调用runtime/pprof生成CPU、Heap等概要文件,也可以使用net/http/pprof集成到web应用程序中,通过go tool pprof工具在命令行或者web页面中进行分析。
有时候,我们不能及时的进行pprof分析,故障可能消失了或者程序已经crash了。另外我们可能需要不同时段的profile进行对比,进行比较才能发现问题,比如内存泄露的问题。这个时候持续分析(continuous profiling)就很重要了。很多云服务厂商都提供持续分析的功能,比如[Go Continuous Profiler | Datadog](https://www.datadoghq.com/dg/apm/ts/profiler/go-continuous-profiler-ts/?utm_source=advertisement&utm_medium=search&utm_campaign=dg-google-profiler-emea-goprofiling-tshirt&utm_keyword=%2Bgo %2Bprofiling&utm_matchtype=b&utm_campaignid=15426873343&utm_adgroupid=128217964697&gclid=Cj0KCQiA_8OPBhDtARIsAKQu0gYymyElbglw_I7uZJkZ7ynxfzn1nVojVZJ9rkm_6_hbchG09w4CCmEaAkWfEALw_wcB)、Cloud Profiler | Google Cloud、Amazon CodeGuru Profiler等。
Pyroscope简介
如果你想在自己的生产系统中使用持续分析,可以考虑Pyroscope。
Pyroscope是一个开源的持续分析系统,使用Go语言实现。服务端使用web页面查看,提供丰富的分析的功能,客户端提供Go、Java、Python、Ruby、PHP、.NET等多种语言的支持,并且支持PUSH、PULL两种采集方式。
首先,你需要部署一个Pyroscope server,它底层采用BadgerDB作为存储引擎,对profile数据进行了优化处理。
Pyroscope server负责接收(或者拉取,下面我们主要演示推的方式)agent上传的profile数据,并提供时间线界面,可以查看一段时间以内的profile数据。比如下图演示了一个rpcx微服务程序12个小时的profile数据。
Pyroscope server安装
Pyroscope server端可以通过docker安装:
1 | docker run -it -p 4040:4040 pyroscope/pyroscope:latest server |
也可以在各中操作系统中直接安装。
比如Mac:
1 | brew install pyroscope-io/brew/pyroscope |
各Liunx发行版也方便安装,比如Cebtos:
1 | wget https://dl.pyroscope.io/release/pyroscope-0.8.0-1-x86_64.rpm |
比如ubuntu:
1 | wget https://dl.pyroscope.io/release/pyroscope_0.8.0_amd64.deb |
安装完成后,就可以通过web界面访问了: http://localhost:4040, 你可以通过配置文件更改监听端口以及其它一些配置项。
客户端集成
上面已经提到,Pyroscope提供了好几种语言的agent sdk, 我们以Go Push方式为例。在你需要持续分析的应用程序的开始加入agent的配置:
1 | pyroscope.Start(pyroscope.Config{ |
主要配置ApplicationName的名称,这个名称会显示在Pyroscope的服务端下拉框中。profile数据要发送到哪一个Pyroscope服务器上,你可以配置ServerAddress,以及通过ProfileTypes监控要监控的Profile项。
只需加上这几行启动程序后,你就可以在Pyroscope server的web界面上查看持续分析的数据了。
