现象: 当前项目启动一段时间,有一个服务导致CPU使用率持续超过30%

环境:Windows 7,  CPU: 8核, 内存: 8g内存

定位过程:

启动项目,查看Java进程ID

查看Event Processor 的CPU使用情况,此时基本维持在1%左右:

开启Simulator发送几包数据,再次查看,发现CPU已经飚上去了:

关闭Simulator,等待数据都处理完毕,再次查看,CPU并未降下去:

使用ProcessExplorer查看Event Processor线程的CPU使用情况,发现线程40160和40156的CPU占用率持续很高,

使用jstack -l 35684 打印出Event Process的线程栈,查看线程ID(需转化成16进制)对应(40160-> 9CE0, 40156-> 9CDC)的线程栈:

可以看出,线程TaskScheduler_com.delta.atm.services.impl.AutoTTExecutorServiceImpl和TaskScheduler_com.delta.atm.services.impl.AlarmExecutorServiceImpl处于运行状态,持续打印线程信息发现这两个线程一直处于RUNNABLE的状态,此时并未开启simulator,此线程应该处于睡眠才对。

先走读代码,查看AlarmServiceImpl,

再查看SchedulerServiceImpl,

从下面代码的角度看,在没有数据的情况下takeTask应该只会执行一次,然后休眠,等待唤醒。

根据打印的线程栈发现,这两个线程都长时间运行在takeTask方法,所以猜测这个部分有死循环,而且由于此机器是8核,1/8=0.125,如果有两个线程持续While循环,则基本就会占用25%的CPU资源。

加上输出,打印出全局的count,找到原因了,线程睡眠的条件是count为0才睡眠,但是数据都处理完了打印出来的count不为0所以线程会一直空转,

但是为什么会出现数据处理完count还不为0的情况呢?

从代码结果来看alarmService每收到一包数据count就会加1,每取一包数据,count就会减1,而且count是AtomicInteger线程安全类型。

由于alarmService用的是一个生产者-消费者模型,大概结构如下图所示,需要一个全局的count来表示所有queue里面的数据,当count数量为0的时候Task Schedule则睡眠,否则会持续调度。

查看当前queue里面的数据是空的,说明queue里面的数据已经处理完了,但是count的值却不是0。

查看下面的代码找到原因,这个queue是我们自己封装的,每个site对应一个queue,key值是dataTime,这个值是根据印度的box取的且只有10位,精确到秒,但是simulator每个站点数据的发送频率经常会一秒钟发送多包数据,所以就会有重复的dataTime,也就造成了queue里面数据被覆盖了,这个时候queue的总大小就和记录的count不匹配了。

其实这个queue的内部我们使用的是一个treeMap,所以不允许key值重复,最好的办法是重写一个允许key值重复并且可排序的一个队列,但是考虑到现实环境中每个站点3分钟才发一包数据不可能出现每秒多包数据的情况,而且TreeMap内部用的是红黑树效率挺高的,如果自己写排序算法效率可能不会太好,所以暂时使用判断做规避,如果同一个站点queue里面已经有相同的dataTime则直接忽略这一包数据。

重新打包启动查看输出, count已经降下来了

查看CPU使用率如下

查看线程状态,已经处于waiting,问题解决。

一次服务器CPU占用率高的定位分析的更多相关文章

  1. Linux下java进程CPU占用率高分析方法

    Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源 ...

  2. CPU占用率高分析方法步骤[转载]

    由于涉及到私有代码,所有图片都隐去 1.执行TOP命令,确认CPU占用较高的进程PID 根据top命令,发现PID为8691的Java进程占用CPU高达3858%,出现故障 2.确认该进程中CPU占用 ...

  3. Linux下分析某个进程CPU占用率高的原因

      Linux下分析某个进程CPU占用率高的原因 通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用  1.top 查到占用cpu高的进程pid 2.查看该pid的线程 ...

  4. Java CPU占用率高分析

    首先,通过top命令找出CPU占用率高的进程: 然后,通过ps -o THREAD,tid,time -mp 2066命令找出执行时间最长的线程的TID 将有问题的TID转为16进制格式: print ...

  5. (转)Linux下java进程CPU占用率高-分析方法

    Linux下java进程CPU占用率高-分析方法 原文:http://itindex.net/detail/47420-linux-java-%E8%BF%9B%E7%A8%8B?utm_source ...

  6. Linux下java进程CPU占用率高分析方法(一)

    Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源 ...

  7. 查看Windows下引起Oracle CPU占用率高的神器-qslice

    前言: qslice是一个win2000的工具包,能分析进程的cpu占用率,我们用于分析oracle的性能 这是绿色的软件无需安装. 我们经常会碰到oracle的CPU占用居高不下,无法快速定位到问题 ...

  8. 线上Java程序导致服务器CPU占用率过高的问题排除过程

    博文转至:http://www.jianshu.com/p/3667157d63bb,博文更好效果看原版,转本博文的目的就算是个书签吧,需要时候可以定位原文学习 1.故障现象 客服同事反馈平台系统运行 ...

  9. 记一次线上Java程序导致服务器CPU占用率过高的问题排除过程

    博文转至:http://www.jianshu.com/p/3667157d63bb,转本博文的目的就是需要的时候以防忘记 1.故障现象 客服同事反馈平台系统运行缓慢,网页卡顿严重,多次重启系统后问题 ...

随机推荐

  1. php url字符转义操作

    遇到一段代码,从数据库里读出来带 \ 字符 需要转义成中文~ 用到url_decode(); //$info 为刚从数据库中读取的二维数组 foreach($info as $key1 => & ...

  2. web2.0最全的国外API应用集合

    web2.0最全的国外API应用集合 原文地址:http://www.buguat.com/post/98.html 2.0时代,越来越多的API被大家广泛应用,如果你还不了解API是何物,请看这里的 ...

  3. Swift(三.函数)

    一.swift中的函数分为以下几类吧 1>无参无返   2>无参有返 3>有参无返  4>有参有返  5>有参多返 二.看下面几个例子吧 1>无参无返 func a ...

  4. 【STM32】STM32 GPIO模式理解

    stm32的GPIO的配置模式有好几种,包括: 1. 模拟输入: 2. 浮空输入: 3. 上拉输入: 4. 下拉输入: 5. 开漏输出: 6. 推挽输出: 7. 复用开漏输出: 8. 复用推挽输出 如 ...

  5. Hdu 2971 Tower

    Description Alan loves to construct the towers of building bricks. His towers consist of many cuboid ...

  6. 把 Eclipse 中的工程 Push 到 Github(适用 Windows 平台)

    今天发现一小技巧,关于如何把Eclipse的某一个Existing project push 到github服务器. Eclipse 应该是 JavaEE 版本. 在project 右键 team, ...

  7. Analysis Guidelines

    This section describes some best practices for analysis. These practices come from experience of ana ...

  8. 【LA3523】 Knights of the Round Table (点双连通分量+染色问题?)

    Being a knight is a very attractive career: searching for the Holy Grail, saving damsels in distress ...

  9. 使用php-emoji类让网页显示emoji表情

    需要的材料: php-emoji类库的下载地址:https://github.com/iamcal/php-emoji 代码示例:(该代码来自官网) <?php include('emoji.p ...

  10. Win7新建ftp快捷方式(原XP网上邻居中客户端图标)

      2014-6-2 XP逐渐隐退,新机器一般都是Win7或者Win8了.有很多朋友反映在这两个新系统中找不到类似XP网上邻居中的ftp链接图标.故稍微研究了下,以Win7为例,总结如下. 1.骨灰级 ...