CPU负载过高异常排查实践与总结

devopsec 等级 323 0 0

昨天下午突然收到运维邮件报警,显示数据平台服务器cpu利用率达到了98.94%,而且最近一段时间一直持续在70%以上,看起来像是硬件资源到瓶颈需要扩容了,但仔细思考就会发现咱们的业务系统并不是一个高并发或者CPU密集型的应用,这个利用率有点太夸张,硬件瓶颈应该不会这么快就到了,一定是哪里的业务代码逻辑有问题。

1、排查思路

1.1 定位高负载进程

首先登录到服务器使用top命令确认服务器的具体情况,根据具体情况再进行分析判断。

CPU负载过高异常排查实践与总结

通过观察load average,以及负载评判标准(8核),可以确认服务器存在负载较高的情况;

CPU负载过高异常排查实践与总结

观察各个进程资源使用情况,可以看出进程id为682的进程,有着较高的CPU占比

1.2 定位具体的异常业务

这里咱们可以使用 pwdx 命令根据 pid 找到业务进程路径,进而定位到负责人和项目:

CPU负载过高异常排查实践与总结

可得出结论:该进程对应的就是数据平台的web服务。

1.3 定位异常线程及具体代码行

传统的方案一般是4步:

  1. top oder by with P:1040 // 首先按进程负载排序找到 maxLoad(pid)
  2. top -Hp 进程PID:1073 // 找到相关负载 线程PID
  3. printf “0x%x\n”线程PID: 0x431 // 将线程PID转换为 16进制,为后面查找 jstack 日志做准备
  4. jstack 进程PID | vim +/十六进制线程PID - // 例如:jstack 1040|vim +/0x431 -

但是对于线上问题定位来说,分秒必争,上面的 4 步还是太繁琐耗时了,之前介绍过淘宝的oldratlee 同学就将上面的流程封装为了一个工具:show-busy-java-threads.sh,可以很方便的定位线上的这类问题:

CPU负载过高异常排查实践与总结

可得出结论:是系统中一个时间工具类方法的执行cpu占比较高,定位到具体方法后,查看代码逻辑是否存在性能问题。

※ 如果线上问题比较紧急,可以省略 2.1、2.2 直接执行 2.3,这里从多角度剖析只是为了给大家呈现一个完整的分析思路。

2、根因分析

经过前面的分析与排查,最终定位到一个时间工具类的问题,造成了服务器负载以及cpu使用率的过高。

  • 异常方法逻辑:是把时间戳转成对应的具体的日期时间格式;
  • 上层调用:计算当天凌晨至当前时间所有秒数,转化成对应的格式放入到set中返回结果;
  • 逻辑层:对应的是数据平台实时报表的查询逻辑,实时报表会按照固定的时间间隔来,并且在一次查询中有多次(n次)方法调用。

那么可以得到结论,如果现在时间是当天上午10点,一次查询的计算次数就是 10*60*60*n次=36,000*n次计算,而且随着时间增长,越接近午夜单次查询次数会线性增加。由于实时查询、实时报警等模块大量的查询请求都需要多次调用该方法,导致了大量CPU资源的占用与浪费。

3、解决方案

定位到问题之后,首先考虑是要减少计算次数,优化异常方法。排查后发现,在逻辑层使用时,并没有使用该方法返回的set集合中的内容,而是简单的用set的size数值。确认逻辑后,通过新方法简化计算(当前秒数-当天凌晨的秒数),替换调用的方法,解决计算过多的问题。上线后观察服务器负载和cpu使用率,对比异常时间段下降了30倍,恢复至正常状态,至此该问题得已解决。

CPU负载过高异常排查实践与总结

4、总结

  • 在编码的过程中,除了要实现业务的逻辑,也要注重代码性能的优化。一个业务需求,能实现,和能实现的更高效、更优雅其实是两种截然不同的工程师能力和境界的体现,而后者也是工程师的核心竞争力。
  • 在代码编写完成之后,多做 review,多思考是不是可以用更好的方式来实现。
  • 线上问题不放过任何一个小细节!细节是魔鬼,技术的同学需要有刨根问题的求知欲和追求卓越的精神,只有这样,才能不断的成长和提升。

本文转自 https://www.cnblogs.com/linuxprobe-sarah/p/10013150.html,如有侵权,请联系删除。

收藏
评论区

相关推荐

操作系统
一、进程的相关概念 1.1 定义 进程用来描述一个程序及其执行过程中的信息,即描述一个执行中的程序, 所以才将其命名为进程,即进行中的程序,也可以说进程是程序的一次执行。 1.2 进程的状态 操作系统中的进程状态主要包括∶运行态—— 当前占有CPU、正在执行的进程状态;就绪态——一个进程具备了所有可以执行的条件,只要获得 CPU 就能开始执
android 面试题总结
Java部分 一、多线程   Join()  线程加入,执行此方法的线程优先使用cpu   Yeild()  线程释放资源使所有线程能有相等的机会使用cpu   Sleep() 相当于让线程睡眠,交出CPU,让CPU去执行其他的任务(不会释放锁)。 Wait()方法会让线程进入阻塞状态,并且会释放线程占有的锁,并交出CPU执行权限。
CPU负载过高异常排查实践与总结
昨天下午突然收到运维邮件报警,显示数据平台服务器cpu利用率达到了98.94%,而且最近一段时间一直持续在70%以上,看起来像是硬件资源到瓶颈需要扩容了,但仔细思考就会发现咱们的业务系统并不是一个高并发或者CPU密集型的应用,这个利用率有点太夸张,硬件瓶颈应该不会这么快就到了,一定是哪里的业务代码逻辑有问题。 1、排查思路 1.1 定位高负载进程 首先
python中的各种锁
一、全局解释器锁(GIL)   1、什么是全局解释器锁       在同一个进程中只要有一个线程获取了全局解释器(cpu)的使用权限,那么其他的线程就必须等待该线程的全局解释器(cpu)使    用权消失后才能使用全局解释器(cpu),即时多个线程直接不会相互影响在同一个进程下也只有一个线程使用cpu,这样的机制称为全局    解释器锁(GIL)。  
Kubernetes自定义调度器 — 初窥门径
通过上一篇文章对schedulerframework调度框架已经有了大致了解,根据我们的实际生产的一些问题(如计算服务没有被调度到实际CPU最优的节点)和需求,来实现一个简单的基于CPU指标的自定义调度器。自定义调度器通过kubernetes资源指标服务metricsserver来获取各节点的当前的资源情况,并进行打分,然后把Pod调度到分数最高的节
浅谈 vue 前端同构框架 nuxt 及其性能优化
前言使用 nuxt.js 做项目也接近快一年了,从立项到内测、公测、再到正式上线,还有后面的不断维护,也陆陆续续的踩了很多坑,其中最大的问题就是 node 的渲染性能问题了。模板转换是 cpu 密集型的操作,node 又是单线程的,并发一高,cpu 就会飙到 100% 。为了提
为什么单线程的Redis能支持高并发?
一、Redis为什么是单线程注意:redis 单线程指的是网络请求模块使用了一个线程,即一个线程处理所有网络请求,其他模块仍用了多个线程。因为CPU不是Redis的瓶颈。Redis的瓶颈最有可能是机器内存或者网络带宽,既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。关于redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万
商业数据分析从入门到入职(5)Python基本语法和数据类型
一、从计算机到Python 1.计算机与程序思维计算机最核心的三个部分为CPU、内存和硬盘,都在主板上面,除此之外,还包括键盘、鼠标等输入设备和屏幕等输出设备,如下:CPU用于进行计算,硬盘用于存储数据和文件,内存(包括缓存)用于连接CPU和硬盘,作为两者的缓冲,可以加快读取和处理速率。冯·诺依曼架构如下:程序是指定如何执行计
Prometheus + Grafana 快速上手
+ 快速上手,监控主机的 CPU, GPU, MEM, IO 等状态。 前提 客户端 Node Exporter用于采集 UNIX 内核主机的数据,并解压:bashwget https://github.com/prometheus/nodeexporter/releases/download/v1.1.2/nodeexporter1.1.2.linux
maven打包速度优化
mvn clean install T 1C Dmaven.test.skiptrue Dmaven.compile.forktrueT 1C :代表每个CPU核心跑一个工程。Dmaven.test.skiptrue :代表跳过测试。Dmaven.compile.forktrue :使用多线程编译注:我的项目快了十几秒jvm虚拟机优化:Xms256m Xmx
计算机组成原理4.1指令格式
4.1.1指令的基本概念和指令的基本格式操作码:指明CPU进行什么操作。地址码:知指明CPU对谁进行操作。PC:程序计数器,每执行一条指令会+1指向下一条指令。指令的概念和基本格式:是指一台计算机执行某种操作的命令,一台计算机的所有指令的集合构成指令集,也叫做指令系统,位于计算机的硬件和OS层面。不同计算机只能执行自己系统的指令,如Intel的x86架构,手
盘点golang中的开发神器
本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star。在Java中,我们用Junit做单元测试,用JMH做性能基准测试(benchmark),用asyncprofiler剖析cpu性能,用jstack、jmap、arthas等来排查问题。作为一名比较新的编程语言,golang的这些工具是否更加好用呢? 单元测
小白想学python,怎么做?
小白需要怎么学习python,python学习的难度大吗?学python需要从哪学起?学Python难?首先,我们普及一下编程语言的基础知识。编程语言的作用是为了让计算机干活,比如下载视频,音乐编辑文档等,而计算机干活的CPU只认识机器指令,所以,尽管编程语言不同,最后都要翻译成CPU能听懂的语言。而不同的编程语言,干同一个活,编写的代码量,差距也很大。Py
cpu分析利器 — async-profiler
本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star。 简介asyncprofiler是一款采集分析java性能的工具,翻译一下github上的项目介绍:asyncprofiler是一款没有Safepoint bias problem的低开销java采集分析器,它利用HotSpot特殊的api来收集栈信息以及
【面试必会】最新阿里+头条+腾讯大厂Java笔试真题
一、内存与线程 1、内存结构内存是计算机的重要部件之一,它是外存与CPU进行沟通的桥梁,计算机中所有程序的运行都在内存中进行,内存性能的强弱影响计算机整体发挥的水平。JVM的内存结构规定Java程序在执行时内存的申请、划分、使用、回收的管理策略,通说来说JVM的内存管理指运行时数据区这一大块的管理。 2、线程运行JVM中一个应用是可以有多个线程并行执行,线程