Go pprof 快速分析 CPU 高负载问题

本文讲述了如何使用 Go 的 pprof 工具分析并解决一个因协程泄露导致的 CPU 100% 高负载问题。通过分析 pprof 火焰图和调用链,定位到 writeLoop 不断调用 Close() 方法,最终发现缺少 return 导致的忙轮询。利用 pprof 可以快速定位此类由 bug 引起的性能问题。
摘要由CSDN通过智能技术生成

公司一个同事使用 Go Websocket 开发了 k8s 在线调试服务,该服务也部署在 k8s 集群中,没几天运维那边通告说 cpu 100% 高负载了,还把限制的范围内的 cpu core 都干满了。由于那人休假,我帮忙处理下。

通常来说这类 cpu 高负载的问题相对好排查,多是 bug 造成的。像这个调试服务在一个量级请求完毕后,cpu 使用率居然还是爆满。???? 不用想,肯定是协程泄露了,造成了某个逻辑的忙轮询。

该服务在 k8s 集群中部署,没有接入 ingress,所以在有外网的 k8s node 上做了一个端口映射。这样开发机就可以 go tool pprof 外网地址。

还有一个好方法是我以前常用的,在 k8s node 上把 golang 的 pprof 可分析数据导入到文件里,然后把文件 post 到一个支持上传的服务,比如 http upload,后面大家就知道该怎么操作了。

下面是pprof生成的火焰图和调用链耗时图,很明显的看到 writeLoop 不断的调用 Close() 方法。

既然确定了问题,通过 pprof source 定位热点代码,为什么会不断调用 wsConn.Close() 呢 ?因为没有 return,既然已感知连接关闭,那么就应该 return 出去!!!

// xiaorui.cc

  Total:       2.31s   1.35mi
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值