业务背景

  业务背景就是需要将多张业务表中的数据增量同步到一张大宽表中,后台系统基于这张大宽表开展业务,所以就开发了一个数据同步工具,由中间件采集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使用率很高的更多相关文章

  1. 06 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?

    上一节我讲了 CPU 使用率是什么,并通过一个案例教你使用 top.vmstat.pidstat 等工具,排查高 CPU 使用率的进程,然后再使用 perf top 工具,定位应用内部函数的问题.不过 ...

  2. 06讲案例篇:系统的CPU使用率很高,但为啥却找不到高CPU的应用

    小结 碰到常规问题无法解释的 CPU 使用率情况时,首先要想到有可能是短时应用导致的问题,比如有可能是下面这两种情况. 第一,应用里直接调用了其他二进制程序,这些程序通常运行时间比较短,通过 top ...

  3. 4 系统的 CPU 使用率很高,但为啥却找不到高 CPU的应用?

    上一节讲了 CPU 使用率是什么,并通过一个案例教你使用 top.vmstat.pidstat 等工具,排查高 CPU 使用率的进程,然后再使用 perf top 工具,定位应用内部函数的问题.不过就 ...

  4. 记录一次mysql查询速度慢造成CPU使用率很高情况

    1.某日zabbix告警,某台机器CPU使用率过高. 查看慢查询日志,看到很多sql语句都超过10秒 把sql语句拿出来放在查询窗口执行.前面加上explain就可以查看详细查询信息 playcode ...

  5. 性能分析(5)- 软中断导致 CPU 使用率过高的案例

    性能分析小案例系列,可以通过下面链接查看哦 https://www.cnblogs.com/poloyy/category/1814570.html 前言 软中断基本原理,可参考这篇博客:https: ...

  6. Oracle查询语句导致CPU使用率过高问题处理

    解决此问题的关键在于如何找到造成CPU使用率过高的SQL语句.步骤如下: 1.使用Process Explorer工具查看到Oracle进程,双击Oracle进程,在弹出的属性窗口的Threads选项 ...

  7. 解决linux中Kipmi0进程对CPU使用率很高问题

    kipmi is supposed to run with low priority. When you say it consumes 70-90% of the CPUs, is that con ...

  8. 代码死循环导致cpu使用率过高

    1. top命令查看进程pid  27081 2. ps -mp pid -o THREAD,tid,time  (tid:31128) 3.printf “%x\n” number  #将tid转换 ...

  9. 性能分析(3)- 短时进程导致用户 CPU 使用率过高案例

    性能分析小案例系列,可以通过下面链接查看哦 https://www.cnblogs.com/poloyy/category/1814570.html 系统架构背景 VM1:用作 Web 服务器,来模拟 ...

随机推荐

  1. 洛谷P3246 [HNOI2016]序列

    传送门 题解 //minamoto #include<iostream> #include<cstdio> #define ll long long using namespa ...

  2. 洛谷P2254 [NOI2005]瑰丽华尔兹(单调队列)

    传送门 题解 大概就是设$dp[i][x][y]$表示在第$i$个时间段,在$(x,y)$时的最大滑动距离 然后转移是$dp[i][x][y]=max(dp[i-1][x][y],dp[i][x'][ ...

  3. logstsh | logstash-input-jdbc 启动错误收集

    1: Failed to execute action {:action=>LogStash::PipelineAction::Create/pipeline_id:main, :excepti ...

  4. 洛谷 P2634 [国家集训队]聪聪可可

    点分板子2333 注释都是错过的地方 #include<cstdio> #include<algorithm> using namespace std; typedef lon ...

  5. PHP获取今天内的时间 今天开始和结束的时间戳

    $t = time(); $start = mktime(0,0,0,date("m",$t),date("d",$t),date("Y", ...

  6. Linux单机环境下HDFS伪分布式集群安装操作步骤v1.0

    公司平台的分布式文件系统基于Hadoop HDFS技术构建,为开发人员学习及后续项目中Hadoop HDFS相关操作提供技术参考特编写此文档.本文档描述了Linux单机环境下Hadoop HDFS伪分 ...

  7. AngularJS开发最常犯的10个错误

    简介 AngularJS是目前最为活跃的Javascript框架之一,AngularJS的目标之一是简化开发过程,这使得AngularJS非常善于构建小型app原型,但AngularJS对于全功能的客 ...

  8. 最新版Kubernetes常用命令大全

    #查看所有namespace的pods运行情况 kubectl get pods --all-namespaces #查看具体pods,记得后边跟namespace名字哦 kubectl get po ...

  9. 掌握Spark机器学习库-07-线性回归算法概述

    1)简介 自变量,因变量,线性关系,相关系数,一元线性关系,多元线性关系(平面,超平面) 2)使用线性回归算法的前提 3)应用例子 沸点与气压 浮力与表面积

  10. iOS Programming Web Services and UIWebView

    iOS Programming Web Services and UIWebView The work is divided into two parts. The first is connecti ...