前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go pprof 快速分析 CPU 高负载问题

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

作者头像
梦醒人间
发布2021-01-04 10:32:36
1.7K0
发布2021-01-04 10:32:36
举报
文章被收录于专栏:码农桃花源码农桃花源

公司一个同事使用 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 出去!!!

代码语言:javascript
复制
// xiaorui.cc

  Total:       2.31s   1.35mins (flat, cum) 99.25%
     76            .          .                } 
     77            .          .           } 
     78            .          .            
     79            .          .           // 发送协程 
     80            .          .           func (wsConn *WsConnection) wsWriteLoop() { 
     81        330ms      330ms                defer fmt.Println("write exited") 
     82            .          .                for { 
     83        740ms   1.05mins                        select { 
     84        720ms      730ms                        case msg = <-wsConn.outChan: 
     85            .          .                                if err = wsConn.socket.WriteMessage(msg.MessageType, msg.Data); err != nil { 
     86            .          .                                        log.Error("websocket write message error", err) 
     87            .          .                                } 
     88        220ms      220ms                        case <-wsConn.closeChan: 
     89        300ms     16.21s                                wsConn.Close() 
     90            .          .                        } 
     91            .          .                } 
     92            .          .           }

相比性能调优,这类由于 bug 引起的 cpu 高负载问题反而特别容易处理,基本上通过 pprof 看火焰图就可以快速定位问题。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农桃花源 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档