Go (推送模式)
我们的 Go 剖析器是一款尖端的工具,旨在优化 Golang 应用程序。通过与 Pyroscope 集成,剖析器为开发人员提供了对其 Go 代码库的深入了解,从而实现实时性能分析。这种强大的工具对于查明效率低下、简化代码执行和确保 Go 应用程序的峰值性能至关重要。
Pyroscope 使用标准的 runtime/pprof
包来收集剖析数据。有关详细信息,请参阅 官方文档。
注意
有关 Go 支持的剖析类型列表,请参阅 可用剖析类型。
开始之前
要捕获和分析剖析数据,您需要一个托管的 Pyroscope OSS 服务器或一个托管的 具有 Grafana Cloud Profiles 的 Pyroscope 实例(需要一个免费的 Grafana Cloud 帐户)。
Pyroscope 服务器可以是用于开发的本地服务器或用于生产使用的远程服务器。
配置 Go 客户端
要开始剖析 Go 应用程序,您需要在应用程序中包含 Go 模块
go get github.com/grafana/pyroscope-go
注意
如果您更喜欢使用拉取模式,可以使用 Grafana Agent。
然后将以下代码添加到您的应用程序
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",
// 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
}
向您的应用程序添加剖析标签
您可以向剖析数据添加标签(标签)。这些标签可用于在 UI 中筛选数据。有一个与 go-native pprof API 一致的自定义 API
// these two ways of adding tags are equivalent:
pyroscope.TagWrapper(context.Background(), pyroscope.Labels("controller", "slow_controller"), func(c context.Context) {
slowCode()
})
pprof.Do(context.Background(), pprof.Labels("controller", "slow_controller"), func(c context.Context) {
slowCode()
})
互斥锁剖析
互斥锁剖析有助于查找应用程序中的争用来源。它可以帮助您找出哪些互斥锁由哪些 goroutine 持有。
要启用互斥锁剖析,您需要将以下代码添加到您的应用程序
runtime.SetMutexProfileFraction(rate)
rate
参数控制互斥锁配置文件中报告的互斥锁竞争事件的比例。平均情况下会报告 1/rate 个事件。
阻塞分析
阻塞分析可帮助您分析程序在以下阻塞操作上等待的时间:
- select
- 通道发送/接收
- semacquire
- notifyListWait
要启用阻塞分析,您需要在应用程序中添加以下代码:
runtime.SetBlockProfileRate(rate)
rate
参数控制阻塞配置文件中报告的协程阻塞事件的比例。分析器旨在平均每阻塞 rate 纳秒采样一个阻塞事件。
将数据发送到 Pyroscope OSS 或 Grafana Cloud Profiles
pyroscope.Start(pyroscope.Config{
ApplicationName: "example.golang.app",
ServerAddress: "<URL>",
// Optional HTTP Basic authentication
BasicAuthUser: "<User>",
BasicAuthPassword: "<Password>",
// Optional Pyroscope tenant ID (only needed if using multi-tenancy). Not needed for Grafana Cloud.
// TenantID: "<TenantID>",
ProfileTypes: []pyroscope.ProfileType{
pyroscope.ProfileCPU,
pyroscope.ProfileInuseObjects,
pyroscope.ProfileAllocObjects,
pyroscope.ProfileInuseSpace,
pyroscope.ProfileAllocSpace,
},
})
要将 Golang SDK 配置为将数据发送到 Pyroscope,请将 <URL>
占位符替换为适当的服务器 URL。这可能是 Grafana Cloud URL 或您自己的自定义 Pyroscope 服务器 URL。
如果您需要将数据发送到 Grafana Cloud,则需要配置 HTTP 基本身份验证。将 <User>
替换为您的 Grafana Cloud 堆栈用户,将 <Password>
替换为您的 Grafana Cloud API 密钥。
如果您的 Pyroscope 服务器启用了多租户功能,则需要配置租户 ID。将 <TenantID>
替换为您的 Pyroscope 租户 ID。
Golang 分析示例
查看以下资源,详细了解 Golang 分析