空循环导致CPU使用率很高
业务背景
业务背景就是需要将多张业务表中的数据增量同步到一张大宽表中,后台系统基于这张大宽表开展业务,所以就开发了一个数据同步工具,由中间件采集binlog消息到kafka里,然后我去消费,实现增量同步。
生产环境发现的现象
在程序发布到生产环境时候,机器的CPU使用率立马被打到100%, load还在不停的上升,开始机器的配置是4核心8G内存,load可以到21,通过topc命令查看load average的三个值都大于20,说明机器非常的繁忙。
排查步骤及手段
1. 通过top命令查看到CPU使用率达到100%,但是内存却没有多大变化,内存变化可以通过gc日志可以观察的到。这时候配置文件中配置的是40个线程处理数据增量同步任务
2. 当时怀疑是不是线程数配置的多了原因导致的,所以将线程数调至为20个,但发现CPU依然是高位运行
3. 由于是生产环境,当时运维直接就建议升级服务器配置,有4核心8G内存升级到8核心8G内存。但是将程序部署到新服务器上后,新服务器的CPU使用率依然是100%,load也能达到20
4. 进一步将线程数调至为10个,CPU依然高位运行
5. 这是我就怀疑代码出问题了,top -Hp pid命令查看是那些线程最耗CPU,这里发现了一个奇怪的现象是:最耗CPU的线程数刚好10个,跟配置文件中配置的个数一样
6. 使用jstack命令查看thread dump日志,发现就是自己配置的10个线程的状态为Runnable,表示一直在那里运行。
排查到步骤6时,再结合第5点诡异的现象,回头再去看代码,在一个while(true)循环里不停的从队列中取数据,取到了则insert或update宽表, 取不到则立马进入下一轮循环,中间没有任何的sleep,导致系统会不停的调度该线程,占用CPU时间片,导致系统load飙升。
解决方法
在while(true)中如果从队列中取不到数据则sleep(1000), 加上这行代码之后,可以很明显的看到服务器的load在下降,知道下降到一个很低的值,因为这台机器的配置很高,只开了10个线程处理任务,负载当然很低。
空循环会导致CPU使用率很高
Linux系统中线程有几种状态:就绪状态,运行状态,阻塞状态,挂起状态,僵死状态。 Linux进程线程调度是对就绪队列中的线程进行时间片分配,阻塞状态和挂起都在阻塞队列中,只有唤醒之后才会被加入到就绪队列中等待内核的调度。
空循环虽然什么都没有做,也没有任何的阻塞条件(如sleep),进程一直处于运行状态,即使时间片一到被切换了,但是改进程还是处于就绪状态,等待下次调度。Linux内核调度是很复杂的,除了时间片之外还有优先级的权重,对于一直处于优先级的线程优先级会提高,这样空循环所在的线程分配的时间片的比重就会增多,导致系统负载上升。
至于空循环是如何影响CPU使用率和负载的,可以参考这边文章:https://www.2cto.com/kf/201601/488270.html
空循环导致CPU使用率很高的更多相关文章
- 06 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?
上一节我讲了 CPU 使用率是什么,并通过一个案例教你使用 top.vmstat.pidstat 等工具,排查高 CPU 使用率的进程,然后再使用 perf top 工具,定位应用内部函数的问题.不过 ...
- 06讲案例篇:系统的CPU使用率很高,但为啥却找不到高CPU的应用
小结 碰到常规问题无法解释的 CPU 使用率情况时,首先要想到有可能是短时应用导致的问题,比如有可能是下面这两种情况. 第一,应用里直接调用了其他二进制程序,这些程序通常运行时间比较短,通过 top ...
- 4 系统的 CPU 使用率很高,但为啥却找不到高 CPU的应用?
上一节讲了 CPU 使用率是什么,并通过一个案例教你使用 top.vmstat.pidstat 等工具,排查高 CPU 使用率的进程,然后再使用 perf top 工具,定位应用内部函数的问题.不过就 ...
- 记录一次mysql查询速度慢造成CPU使用率很高情况
1.某日zabbix告警,某台机器CPU使用率过高. 查看慢查询日志,看到很多sql语句都超过10秒 把sql语句拿出来放在查询窗口执行.前面加上explain就可以查看详细查询信息 playcode ...
- 性能分析(5)- 软中断导致 CPU 使用率过高的案例
性能分析小案例系列,可以通过下面链接查看哦 https://www.cnblogs.com/poloyy/category/1814570.html 前言 软中断基本原理,可参考这篇博客:https: ...
- Oracle查询语句导致CPU使用率过高问题处理
解决此问题的关键在于如何找到造成CPU使用率过高的SQL语句.步骤如下: 1.使用Process Explorer工具查看到Oracle进程,双击Oracle进程,在弹出的属性窗口的Threads选项 ...
- 解决linux中Kipmi0进程对CPU使用率很高问题
kipmi is supposed to run with low priority. When you say it consumes 70-90% of the CPUs, is that con ...
- 代码死循环导致cpu使用率过高
1. top命令查看进程pid 27081 2. ps -mp pid -o THREAD,tid,time (tid:31128) 3.printf “%x\n” number #将tid转换 ...
- 性能分析(3)- 短时进程导致用户 CPU 使用率过高案例
性能分析小案例系列,可以通过下面链接查看哦 https://www.cnblogs.com/poloyy/category/1814570.html 系统架构背景 VM1:用作 Web 服务器,来模拟 ...
随机推荐
- [App Store Connect帮助]八、维护您的 App(2)将 App 从 App Store 中移除
如果您不想继续向顾客提供您的 App,您可以将其从 App Store 中移除,这样会移除该 App 的所有版本.拥有该 App 先前版本的用户将无法更新 App,但只要您的合约有效,用户便仍可下载最 ...
- Tech 助力Fin ,大数据风控系统赋能掌众金服!
胡亚海 首席技术官 CTO 北京航空航天大学 博士 深耕互联网领域近20年,先后任职于普天信息技术研究院.摩托罗拉.宇龙酷派.百度等知名企业,曾主导宇龙酷派公司全员从WinCE向Android转型 ...
- C# 读写text 详细讲解
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> & ...
- 报错Cannot determine embedded database driver class for database type NONE解决方法
由于我不需要数据库,启动springboot报错: Cannot determine embedded database driver class for database type NONE If ...
- python常用的装饰器
一.为程序添加时间类的装饰器二.验证用户是否等陆 #.为函数添加统计时间的装饰器: import time def timeer(func): def inner(): starttime=time. ...
- Wannafly挑战赛10:A题:小H和迷宫
题目描述 小H陷入了一个迷宫中,迷宫里有一个可怕的怪兽,血量有N点,小H有三瓶魔法药水,分别可以使怪兽损失a%.b%.c%的血量(之后怪兽的血量会向下取整),小H想合理地运用这三瓶药水,使 ...
- 1475 建设国家 DP
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1475 这题转化过来就是,给定n个点,每个点都有一个过期时间,一个价值.现 ...
- mysql中int(1)与int(10)的区别
INT[(M)] [UNSIGNED] [ZEROFILL] 普通大小的整数.带符号的范围是-2147483648到2147483647.无符号的范围是0到4294967295. INT(1) 和 I ...
- InChatter系统之服务器开发(一)
服务器端是整个消息系统的中枢,类似与人类的大脑.没有他,根本无法实现客户端之间的交流,为什么呢?这也涉及到我们的系统涉及,在服务器端,每个客户端的标识数据都会在服务器端进行保存,在这种情况下,当某一个 ...
- Java对Redis基本使用
1 引入jar包 java是通过Jedis对redis进行操作的,首先引入jedis.jar <dependency> <groupId>redis.clients</g ...