pprof web形式的调优配置及案例介绍

本文介绍了如何使用Go语言的pprof工具进行性能分析,特别是针对goroutine的监控。在程序运行中发现goroutine数量不断增加的问题,通过pprof的web接口定位到问题源——一个定时调度程序中的DelayIfStillRunning方法。调整定时任务的周期后,成功解决了goroutine数量异常增长的问题,保持在20左右波动。
摘要由CSDN通过智能技术生成

go是一门比较重视性能的语言,经常需要对程序进行性能分析和优化
首选的性能分析和优化工具为pprof,常用的有两种
1、runtime/pprof是一种导入性能分析日志到文件的形式
2、net/http/pprof是一种WEB形式

配置介绍

  • 本文介绍一下第2种,web形式的pprof调优
  • 配置方式如下,在main函数中起一个goroutine,第一个参数为ip和port
import(
	_ "net/http/pprof"
)
func main() {
	go func() {
		http.ListenAndServe("127.0.0.1:6060", nil)
	}()
	...
}
  • 浏览器输入刚当的ip:port/debug/pprof/进入主页,本案例地址即为http://127.0.0.1:6060/debug/pprof/
    在这里插入图片描述
  • 可以直接点击allocs、goroutine、heap、mutex等查看对应的具体信息

案例介绍

  • 下面以我本次调优的一个定时调度程序为例介绍下对goroutine的分析
    我在程序运行中,使用runtime.NumGoroutine()不断打印出groutine的数量,发现goroutine的数量随着程序的运行越来越多,如下所示
goroutine number: 12 ---- 0
goroutine number: 12 ---- 0
goroutine number: 15 ---- 3
goroutine number: 15 ---- 3
goroutine number: 18 ---- 6
goroutine number: 18 ---- 6
goroutine number: 21 ---- 5
goroutine number: 20 ---- 5
......
goroutine number: 162 ---- 8
goroutine number: 163 ---- 5
goroutine number: 162 ---- 5
goroutine number: 161 ---- 5
goroutine number: 161 ---- 5
goroutine number: 162 ---- 6
goroutine number: 162 ---- 6
  • 一开始我以为是我自己起的goroutine执行完程序后没有关闭,我就对我写得go func进行了检查,并没有发现问题
  • 最后通过前面介绍的pprof进行配置,查看goroutine的情况
    在这里插入图片描述
  • 根据内容可以发现,一共230个goroutine,竟然有一段代码起了210个goroutine,根据信息可以发现,问题出现在cron.go文件中的DelayIfStillRunning方法,这个方法是当一个任务在执行时发现当前有任务正在执行,因此会起一个goroutine监控等待任务执行结束再运行本次任务
  • 程序在调试阶段,配置的定时周期比较随意,没有结合程序的具体运行时间,导致出现一直Delay延迟执行,那么这样就会产生大量goroutine出现
  • 通过对问题分析之后,结合任务运行时间合理配置定时周期后重新测试,发现goroutine数量正常,一直在20左右波动,问题解决
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值