公司一个同事使用 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.ccTotal:       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 看火焰图就可以快速定位问题。

Go pprof 快速分析 CPU 高负载问题相关推荐

  1. CPU高负载排查小技巧(2分钟速读版),细心的优化可能为公司节省一个亿!

    女主宣言 服务优化是一个细心.漫长的过程,一个很小的优化不仅可以为用户带来更稳定更快速的互联网体验,也许还会为公司降低百万以上的成本.熟练掌握服务端排错技巧,已经是"匠心工程师"的 ...

  2. ORACLE 11g 通过ASH结合AWR实战解决cpu高负载的详细过程

        ASH结合AWR实战解决oracle高负载               线上oracle数据库负载比较高,所以需要优化,一般进去看负载高的进程,如果是oracle进程,那么就是oracle运行 ...

  3. 又一次生产 CPU 高负载排查实践

    本文经授权转载自微信公众号:crossoverJie 前言 前几日早上打开邮箱收到一封监控报警邮件:某某 ip 服务器 CPU 负载较高,请研发尽快排查解决,发送时间正好是凌晨. 其实早在去年我也处理 ...

  4. 高cpu_再一次生产 CPU 高负载排查实践

    (给ImportNew加星标,提高Java技能) 作者:crossoverJie segmentfault.com/a/1190000019507028 前言 前几日早上打开邮箱收到一封监控报警邮件: ...

  5. java cpu io高_服务器负载过高问题分析-不是cpu高负载也不是IO负载如何处理(阿里 几乎是必考题)...

    关于top命令 经常问load average 参考:load average 定义(网易面试) 问题现象: 1,top命令查询服务器负载达到2.0-5之间,tomcat的cpu使用率达到104% l ...

  6. java获取cpu使用率_再一次生产 CPU 高负载排查实践

    前言 前几日早上打开邮箱收到一封监控报警邮件:某某 ip 服务器 CPU 负载较高,请研发尽快排查解决,发送时间正好是凌晨. 其实早在去年我也处理过类似的问题,并记录下来:<一次生产 CPU 1 ...

  7. qt获取cpu使用率_又一次生产 CPU 高负载排查实践

    以下文章来源于crossoverJie ,作者crossoverJie 前言 前几日早上打开邮箱收到一封监控报警邮件:某某 ip 服务器 CPU 负载较高,请研发尽快排查解决,发送时间正好是凌晨. 其 ...

  8. 如何查java当前负载_linux进程和线程排查 · 记一次JVM CPU高负载的排查办法

    前言 通过本文,你将学会: 1.linux上进程及进程中线程排查的基本方法,如查看进程中的线程数 此文中的线程一般指轻量级进程. 查看所有进程信息 top -H 加上-H这个选项启动top,top一行 ...

  9. 成功解决ThinkPad T14 高负载下CPU降频问题

    本人机器是ThinkPad T14 , CPU是 Intel i5-10210U,随着气温的升高,发现机器越来越卡,特别是在运行大型软件和处理大型文档的时候,看了下任务管理器,高负载时CPU不仅没有睿 ...

最新文章

  1. 计算机软件和硬件比较,软件与硬件RAID优劣之比较
  2. keil中文乱码解决和个人习惯字体设置
  3. D. Cut and Stick(Codeforces Round #716 (Div. 2))
  4. Codeforces Round #725 (Div. 3) G. Gift Set 二分
  5. 011 Android TabLayout+ViewPager实现顶部滑动效果(多个页面)
  6. 罗永浩回应被中消协点名;传前淘宝直播运营负责人因贪污被阿里通报;TypeScript 4.0 Beta发布​ | 极客头条...
  7. java格式化日期时分秒_java中的LocalDateTime
  8. python getopterror_python getopt抛出getopterror选项——mode不能有参数
  9. MDT错误之日志查看方法
  10. 004-集成maven和Spring boot的profile功能打包
  11. Mac OS Catalina 如何连接老旧的惠普 HP Laser Jet 1020 plus 打印机
  12. 单片机与触摸屏通信c语言,讲述如何实现单片机与触摸屏的通信
  13. 分享一个用turtle画的网易云logo
  14. 波峰波谷(凸点凹点)的检测算法
  15. orcale :SQL语句小测试select * from emp order by hiredate asc;
  16. Pro Tools播放引擎设置详解
  17. 点到点法式平面投影点的计算
  18. 手把手带你搭建一个简单的webpack脚手架(一)
  19. 风雨30年,电子表格惊人跨越,excel用户:表格都能生成软件了
  20. html 画梯形容器,css怎么画梯形?

热门文章

  1. 【客户案例】智能驾驶行业如何上云?
  2. 数据分析系统数据库选型
  3. WebView与JavaScript交互
  4. CSS清浮动处理(Clear与BFC)
  5. Java学习笔记50:JSONObject与JSONArray的使用
  6. 四、启动OpenLDAP服务器
  7. 牛客多校6 - Harmony Pairs(数位dp)
  8. java8的rmi_Java中的RMI
  9. 深度学习-人工神经网络概述
  10. php 中set是什么_php中set