当前位置: 首页 > news >正文

一次服务器CPU占用率高的定位分析

背景:通过性能监控发现上线服务器cpu某核占用率已经达到了100%,而且是由我们的某个核心服务导致的。幸亏由于我们的服务进程由多个相同worker(线程)调度承担的,所以除了CPU占用率高之外,并没有对服务造成影响。随着上次我们找到那个吃IO的罪犯,这次我们要追捕的是潜伏在团体中的特务,更加惊险刺激哟!


系统环境

wKiom1P2jSPi5DkFAABnC85tHrE367.jpg

top命令很容易定位到是谁占用CPU最高。

wKioL1P70pvB-yfpAADsLIYJdMc829.jpg

以我们的这个业务进程(imDevServer)举例,为什么说这货是个潜伏者呢?因为这是个多线程的进程,我们要知道实际上占用cpu的最小单位是线程,所以肯定是众线程中的某一个或几个占用CPU过高导致的。top -H -p pid命令查看进程内各个线程占用的CPU百分比

wKioL1P70obxRp3tAAFC0E_uv3k946.jpg

如上图所示我们可以看出id为8863的线程cpu占用率最高。好,我们现在只要能找到他偷走的cpu就好了,虽然这小子嘴巴严,但是我们有一套完善的审问流程,不怕他不招。首先出马的是strace -T -r -c -p pid命令

wKiom1P70VvQh_8OAADA6MBgQag126.jpg

它的作用是查看系统调用和花费的时间,epoll_wait虽然占用的调用时间多,但是他本身是个正常的阻塞调用。

我们接着让pstack pid出马

wKioL1P70k-Col9DAAdHOufy_ec026.jpg

可以看到每个线程的调用堆栈,找到已经找出的占用CPU最高的那个线程,然后看他的调用堆栈,很容易看出在哪一步逻辑上导致了busy loop,

再使用trace -p tid看看线程的调用过程接着定位到代码,修复bug,找回被偷走的cpu。

后记:其实作为一个程序员,我感觉最大的乐趣不是洋洋洒洒的写程序,而是去寻找一些“高端”bug,也许就和有些刑警痴迷于侦破案件一样,这就是对技术的热爱。


相关文章:

  • [HNOI2015]实验比较
  • Springboot简介01
  • 我的作业,来看看把
  • ReentrantLock
  • OSChina 周日乱弹 —— 去应聘男友吧
  • 在网站开发中很有用的8个 jQuery 效果【附源码】
  • 装上这几个 VSCode 插件后,上班划水摸鱼不是梦
  • 三谈属性动画——Keyframe以及ViewPropertyAnimator
  • 湖北分布式智能数据采集方法有哪些?
  • C#用正则表达式一键Unicode转UTF8(解决LitJson中文问题)
  • vue + echarts画圈圈
  • 微软职位内部推荐-SENIOR SDE
  • 23种设计模式之抽象工厂
  • Prototype 原型模式
  • web应用与http协议
  • @jsonView过滤属性
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • uva 10370 Above Average
  • 阿里研究院入选中国企业智库系统影响力榜
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 京东美团研发面经
  • 三分钟教你同步 Visual Studio Code 设置
  • 正则表达式小结
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​批处理文件中的errorlevel用法
  • #pragma once
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (Matlab)使用竞争神经网络实现数据聚类
  • (windows2012共享文件夹和防火墙设置
  • (超详细)语音信号处理之特征提取
  • (分布式缓存)Redis哨兵
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (四)汇编语言——简单程序
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)C#调用WebService 基础
  • (转载)Google Chrome调试JS
  • .Family_物联网
  • .Net Web窗口页属性
  • .NET 使用 XPath 来读写 XML 文件
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET企业级应用架构设计系列之应用服务器
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • /etc/motd and /etc/issue
  • @EnableConfigurationProperties注解使用
  • [20161101]rman备份与数据文件变化7.txt
  • [Android]常见的数据传递方式
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • [BeginCTF]真龙之力
  • [CareerCup] 6.1 Find Heavy Bottle 寻找重瓶子