业务背景

  业务背景就是需要将多张业务表中的数据增量同步到一张大宽表中,后台系统基于这张大宽表开展业务,所以就开发了一个数据同步工具,由中间件采集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. #define及其用法

    #define     在#define中,标准只定义了#和##两种操作.#用来把参数转换成字符串,##则用来连接前后两个参数,把它们变成一个字符     串. #include<stdio.h ...

  2. [Usaco2006 Open]The Climbing Wall 攀岩

    Description One of the most popular attractions at the county fair is the climbing wall. Bessie want ...

  3. 组合游戏 - SG函数和SG定理

    在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念:        P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败.        N点:必胜点 ...

  4. VMware Workstation安装CentOS 7和开发环境

    VMware Workstation新建虚拟机 此处使用的是VMware Workstation 10,其安装过程即是常规Windos系统下软件安装方式,略过. 安装完成双击图标: 打开虚拟机主界面: ...

  5. 三种将list转换为map的方法(传统方法、jdk8 Stream流、guava)

    三种将list转换为map的方法 - jackyrong - ITeye博客:http://jackyrong.iteye.com/blog/2158009

  6. 前端css3样式前缀自动补全工具--autoprefixer

    最近在学习一份来自git的动画框架源码,看懂70%的核心代码后,打算自己动手实践一版,然鹅,所有框架搭起来以后,在动画这块却出了问题: 想设计一个slideInLeft的动画,必然想到了要从偏移-10 ...

  7. Apache Tomcat 之路(三 部署多个应用)

    想要在一台服务器上部署多个web应用的时候有两种部署方式:1.拷贝多个tomcat 服务器,每个服务器启动不同的web应用;2.一个tomcat容器部署多个web应用 两种方式的优缺点:多个tomca ...

  8. Elasticsearch の 查询类型

    查询类型SearchType Es中一共有四种查询类型:QUERY_AND_FETCH.QUERY_THEN_FETCH.DFS_QUERY_AND_FETCH.DFS_QUERY_THEN_FETC ...

  9. 什么是LambdaExpression,如何转换成Func或Action(2)

    序言 在上一篇中,我们认识了什么是表达式树.什么是委托,以及它们的关系.可能是我功力不好,貌似大家都不怎么关注,没有讲解出不同角度的问题. 学习一种新技术,是枯燥的过程,只有在你掌握后并能运用时才能从 ...

  10. bat获取注册表值

    @echo off Setlocal enabledelayedexpansion for /f "skip=2 delims=: tokens=1,*" %%i in ('reg ...