Java项目排查cpu负载高
背景
我负责的其中一个项目在空负载的情况下,CPU占用率依然保持着100%左右,线上、测试、开发的服务都一样;是什么导致的呢?在开发环境我查看了请求流量,这个流量可以忽略但CPU占用率一直在60%-100%之间浮动。
分析问题
流量可以忽略,但CPU占用依然极其高说明不是请求多导致的资源占用,原因应该是项目本身自发导致的;自发包括定时任务与死循环,而具体哪一段代码现在也确定不了。现在我们就可以借助原生的jdk分析工具来定位是项目哪块出现了问题(你可以用更高级的jprofilter等,一连接,问题一目了然),以下我就采用jdk自带工具jstack、jstat 、jmap等来逐步定位。
定位问题
- 在Linux环境下用top查看cpu、内存等资源占用情况(可采用: top -p pid 具体查看某个应用)。发现pid=4179的java应用占用cpu很高
- 查看pid=4179的应用各个线程占用cpu的时间片情况:ps -mp 4179 -o THREAD,tid,time (ps -mp pid -o THREAD,tid,time)。发现tid =4528的线程一直长时间占有着cpu并且占用率达100%
- 将 4528转为16进制,便于在堆栈信息中查询定位代码块:printf "%x\n" 4528,转成16进制为 11b0
- 在堆栈信息中定位报错代码块:jstack 4179|grep 11b0 -A 30 ( jstack pid|grep TID(16进制) -A 30 )
总结
从堆栈信息中我们可以看到是 WAITING导致,这个说明有一个线程长时间占用资源,而其他线程一直处于等待的状态。最终定位出是在一个分布式锁实现的模块中有一个保持锁的代码块有问题。然后通过优化这个分布式锁最终解决了这个问题。通过此次优化,大大节省出了服务器资源(目前这个系统在线上是4台集群,相当于节省了1*4 个cpu,如果是一个上百甚至上千的集群,那么这个资源占用是无法想象的),最主要的是避免了这种情况对系统本身的影响,避免了对正常请求的阻塞。
Java项目排查cpu负载高的更多相关文章
- 线上Java程序占用 CPU 过高,请说一下排查方法?
我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...
- 服务器CPU又爆了?Linux快速排查Java程序占用CPU很高的方法
这个问题可以说是 Java 面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的. 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 1.场 ...
- Linux系统排查——CPU负载篇
本随笔介绍CPU负载的排查手段. 查看系统负载的工具:uptime,w,都能查看系统负载,系统平均负载是处于运行或不可打扰状态的进程的平均数, 可运行:运行态,占用CPU,或就绪态,等待CPU调度. ...
- SQLSERVER排查CPU占用高的情况
SQLSERVER排查CPU占用高的情况 今天中午,有朋友叫我帮他看一下数据库,操作系统是Windows2008R2 ,数据库是SQL2008R2 64位 64G内存,16核CPU 硬件配置还是比较高 ...
- JVM调优之Java进程消耗CPU过高
JVM调优之Java进程消耗CPU过高 查找问题思路 1.查看cpu使用率,发现有线程cpu占用率很高 tops 咱们拿18092线程举例示范 2.查询pid对应的进程 ps -ef|grep 18 ...
- Windows服务器java.exe占用CPU过高问题分析及解决
最近在测试一个用java语言实现的数据采集接口时发现,接口一旦运行起来,CPU利用率瞬间飙升到85%-95%,一旦停止就恢复到40%以下,这让我不得不面对以前从未关注过的程序性能问题. 在硬着头皮查找 ...
- linux中Java项目占用cpu、内存过高时的排查经历
一.使用top命令查看占用高资源的java项目的进程ID(pid): top 二.查看该进程中的线程所占用资源的情况:top -Hp pid 三.查看该线程对应的16进制:printf %x 1112 ...
- Linux排查Java程序占用CPU很高的解决办法
Java的工具集相当强大,学习成本也很低,处理线上问题时,jstack这个工具就比微软的windbg,好学好用很多,3步找出占用CPU很高的源所在.而windbg反人类的各种命令,实在不敢恭维. 故意 ...
- Java中的CPU占用高和内存占用高的问题排查
下面通过模拟实例分析排查Java应用程序CPU和内存占用过高的过程.如果是Java面试,这2个问题在面试过程中出现的概率很高,所以我打算在这里好好总结一下. 1.Java CPU过高的问题排查 举个例 ...
随机推荐
- svn 未提交的显示黑色的星*
1.在eclipse中,选择window-->Preferences,里面找到svn,如下图,勾选上Outgoing changes即可
- mysql中的find_in_set的使用
原文 http://www.php-note.com/article/detail/383 举个例子来说: 有个文章表里面有个type字段,它存储的是文章类型,有 1头条.2推荐.3热点.4图文... ...
- Sencha Architect打开闪退问题修复
删除以下位置的cache文件夹 C:\Users\Administrator\AppData\Local\Sencha\Sencha Architect 3.2\Cache bug解决参考 https ...
- js数组与字符串处理 slice、splice、substring、substr、push、pop、shift、reverse、sort、join、split
数组 方法 1.在数组末尾添加.删除元素 push()方法可以接收任意数量的参数,把它们逐个添加到数组的末尾,并返回修改后数组的长度.改变原数组 pop()方法则从数组末尾移除最后一个元素,减少数组的 ...
- package.json中版本理解
一个完整的版本号可以理解为: [主要版本号,次要版本号,补丁版本号]版本号 x.y.z :其中z 表示一些小的bugfix, y表示一些大的版本更改,比如一些API的变化x表示一些设计的变动及模块的重 ...
- Vue.js基础2
声明式渲染 Vue.js 的核心是一个允许采用简洁的模板语法来声明式的将数据渲染进 DOM: <div id="app"> {{ message }} </div ...
- vue的事件
vue的事件: vue事件简写: vue中事件是 v-on:click=' show()' 但是我嫌弃它写太长每次都要 v-on: 事件 vue中就有事件简写 @click='show()' ...
- 关于ES7里面的async和await
async / await是ES7的重要特性之一,也是目前社区里公认的优秀异步解决方案.目前,async / await这个特性已经是stage 3的建议,可以看看TC39的进度,本篇文章将分享asy ...
- Java不带.classpath的svn项目下载,转成到eclipse中
.classpath是Eclipse的工程文件,别人没有将工程的信息传到SVN库中,就检查不出.classpath文件,识别不了项目结构. 这种做法也是比较提倡的方法.SVN上只要有项目的源码信息就可 ...
- 【Leetcode】【Easy】Reverse Linked List
题目: Reverse a singly linked list. 解题: 反转单链表,不再多介绍了. 如果会“先条件->定参数->确定不变式->验证后条件”的思维方法,一定会bug ...