背景
在日常开发过程中,遇到类似崩溃或者cpu飚高时刻没法获取到有效的pprof数据,从而去优化修复项目。所以我们需要引入持续性分析且能够允许我们随着时间的推移了解系统资源的使用情况,从而定位、调试和修复性能相关的问题。
使用场景
-
查找代码中的性能问题
-
解决高 CPU 利用率的问题
-
定位并修复内存泄漏
-
理解应用程序的调用树
-
跟踪指标随时间的变化
性能及原理
-
关于采集文件存储:在官方文档有说明:为避免丢失最新数据,当它检测到数据路径所在的卷接近磁盘不足,Pyroscope 将删除最旧的块。
-
pyroscope是定时从runtime提供的几个函数获取系统指标数据,以及pprof上报是通过http上传到远程server中,只要上传和获取频率不是非常大,对业务本身影响并不大
部署
为便于使用,目前采用的是Go Agent ,采用push模式,参考文档
dockerfile
docker run -it --name=pyroscope-go -p 4040:4040 pyroscope/pyroscope:latest server
go
go get github.com/grafana/pyroscope-go
package main
import "github.com/grafana/pyroscope-go"
func main() {
// These 2 lines are only required if you're using mutex or block profiling
// Read the explanation below for how to set these rates:
runtime.SetMutexProfileFraction(5)
runtime.SetBlockProfileRate(5)
pyroscope.Start(pyroscope.Config{
ApplicationName: "simple.golang.app", //自定义应用名称
// replace this with the address of pyroscope server
ServerAddress: "http://pyroscope-server:4040", //本地是http://127.0.0.1:4040
// you can disable logging by setting this to nil
Logger: pyroscope.StandardLogger,
// you can provide static tags via a map:
Tags: map[string]string{"hostname": os.Getenv("HOSTNAME")},
ProfileTypes: []pyroscope.ProfileType{
// these profile types are enabled by default:
pyroscope.ProfileCPU,
pyroscope.ProfileAllocObjects,
pyroscope.ProfileAllocSpace,
pyroscope.ProfileInuseObjects,
pyroscope.ProfileInuseSpace,
// these profile types are optional:
pyroscope.ProfileGoroutines,
pyroscope.ProfileMutexCount,
pyroscope.ProfileMutexDuration,
pyroscope.ProfileBlockCount,
pyroscope.ProfileBlockDuration,
},
})
// your code goes here
}
只要以上两步,访问127.0.0.1:4040你就可以看到布灵布灵的火焰图了



目前我本地只是做了pprof的收集分析,大佬们后续可以考虑线上k8s环境中借鉴七猫技术团队的方案的引入holmes,发现业务性能问题,和上报机制
本文参考文档如下: