高QPS CPU密集型服务如何获取goroutine平均调度等待时间
Go goroutine调度等待时长获取方案
针对CPU密集型高QPS服务的goroutine调度监控需求,可通过以下3种方式获取goroutine从runnable状态到被调度执行的平均等待时长:
- 利用你已采集的trace文件直接分析
执行go tool trace [trace文件路径]启动分析页面,选择「Goroutine analysis」功能项,可查看所有goroutine的生命周期耗时明细,包含调度等待时长、执行时长、IO阻塞时长等字段,可直接统计得出平均调度等待时长,还可筛选出等待超时的异常goroutine。 - 通过block profile采集调度阻塞数据
在代码中调用runtime.SetBlockProfileRate(1)开启全量阻塞事件采样,采集完成后生成block profile文件,用go tool pprof分析时,调度等待耗时会归类到sched_latency统计项中,可直接提取数据计算平均值。 - 线上服务可直接读取内置runtime metrics(Go 1.19及以上版本支持)
官方内置了调度延迟直方图指标/sched/latencies:seconds,该指标统计了所有goroutine进入runnable队列后到被调度执行的耗时分布,可直接读取该指标计算平均值、P99等分位值,无需额外采集trace或profile,适合线上实时监控场景。
补充说明:如果trace图中的runnable goroutine数量长期大于你设置的GOMAXPROCS值,说明CPU资源已经饱和,调度等待耗时必然会上升,可结合计算出来的等待时长判断是否需要优化计算逻辑、调整并发度或者扩容实例。
内容的提问来源于stack exchange,提问作者jeremie
相关产品推荐
相关产品推荐

