java应用cpu使用率过高问题排查
---------------------------------------linux下如何定位代码问题-------------------------------
1、先通过top命令找到消耗cpu很高的进程id假设是123
2、执行top -p 123单独监控该进程
3、在第2步的监控界面输入H,获取当前进程下的所有线程信息
4、找到消耗cpu特别高的线程编号,假设是123
5、执行jstack 123456对当前的进程做dump,输出所有的线程信息
6 将第4步得到的线程编号11354转成16进制是0x7b
7 根据第6步得到的0x7b在第5步的线程信息里面去找对应线程内容
8 解读线程信息,定位具体代码位置
-----------------------------分割线----------------------------------------------
最近在压力测试工作中碰到java应用某台机器cpu比较高的情况,特地下笔记以后总结:
一个简单的淘宝认证接口 需要插入读写数据库2次。每次爬取数据,入库。完成。
正常情况下:
应用使用cpu在 :50%--80%
压力高--异常情况下:
cpu利用率在:90%---90%
在网上查了下,一般java应用cpu过高基本上是因为
1.程序计算比较密集
2.程序死循环
3.程序逻请求堵塞
4.IO读写太高
方法一:
分析步骤:
1.登陆应用机器,top -d 1命令查看 当前占用cpu资源最多的,一般排名第一位肯定是java进程
一般也可能存在多个java进程

观察 top 消耗第一的资源是PID=1679的线程
2.查看进程的哪个线程占用cpu比较高,取线上另外一台正常情况下利用cpu比较高的应用:通过
ps -mp pid -o THREAD,tid,time命令查看该进程的线程情况


通过以上线程CPU切片 耗时在pid=1679 Tid =1896 耗时 1分59秒,4%CPU占用最大。时间最长。
TID为1679的线程利用cpu资源比较多,怎么能看到这个线程在干什么呢?
需要将1896 转换为16进制,便于在jvm堆栈中查找。
printf "%x\n" 1896 ----768
通过jstack命令来查看下当前内存状态:

定位到cpu过高是IO读写太高 ,接下来就是找开发人员确认这段代码是否可以优化。
方法二:
在做压测的时候,开发给了一个工具 show-busy-java-threads.sh
在排查Java的CPU性能问题时,找出Java进程中消耗cpu多(top us值过高)的线程,查看它的线程栈,从而找出有性能问题的方法调用。
####截取一段
#!/bin/bash
# @Function
# Find out the highest cpu consumed threads of java, and print the stack of these threads.
#
# @Usage
# $ ./show-busy-java-threads.sh
#
# @author Jerry Lee
readonly PROG=`basename $0`
readonly -a COMMAND_LINE=("$0" "$@")
usage() {
cat <<EOF
Usage: ${PROG} [OPTION]...
Find out the highest cpu consumed threads of java, and print the stack of these threads.
Example: ${PROG} -c 10
...................后面略
其实就是个shell文件,把这个文件上传到目标服务器(linux),记得更改文件的读写权限: chmod -R 777 show-busy-java-threads.sh
接方法一 top之后,只需要下命令 :./show-busy-java-threads.sh -p pid 后面CPU占用高的定位就分析出来了,具体如图

java应用cpu使用率过高问题排查的更多相关文章
- linux Java项目CPU内存占用高故障排查
linux Java项目CPU内存占用高故障排查 top -Hp 进程号 显示进程中每个线程信息,配合jstack定位java线程运行情况 # 线程详情 jstack 线程PID # 查看堆内存中的对 ...
- Java程序CPU使用率过高
Java程序CPU使用率过高 通过top命令找到使用率过高的java进程PID 根据进程号查找线程TID:ps -mp PID -o THREAD,tid,time 将TID转换成16进制:print ...
- kubelet CPU 使用率过高问题排查
kubelet CPU 使用率过高问题排查 问题背景 客户的k8s集群环境,发现所有的worker节点的kubelet进程的CPU使用率长时间占用过高,通过pidstat可以看到CPU使用率高达100 ...
- 记一次java应用cpu利用率过高调试经历
1,现象 写的一个storm应用,主要是通过mysql的binlog来同步表到hbase.运行一段时间后发现,经常会出现cpu使用率飙升到200%以上,然后各种消息堆积报警等等出现各种问题 2,调研过 ...
- Java进程CPU使用率高排查
Java进程CPU使用率高排查 生产java应用,CPU使用率一直很高,经常达到100%,通过以下步骤完美解决,分享一下.1.jps 获取Java进程的PID.2.jstack pid >> ...
- 服务器CPU使用率过高排查与解决思路
发现服务器的cpu使用率特别高 排查思路: -使用top或者mpstat查看cpu的使用情况# mpstat -P ALL 2 1Linux 2.6.32-358.el6.x86_64 (linux— ...
- 排查tomcat服务器CPU使用率过高
tomcat要运行依赖于JDK,tomcat服务器的CPU使用率过高,大多都是因为部署的web程序的问题. 一.现象描述 在一次线上环境,前台访问页面的速度越来越慢,从浏览器F12中看到发出的请求都是 ...
- 服务器cpu负载过高问题排查
https://blog.csdn.net/MrZhangXL/article/details/77711996 第一步 :执行top命令,查出当前机器线程情况 top - 09:14:36 up 1 ...
- 空循环导致CPU使用率很高
业务背景 业务背景就是需要将多张业务表中的数据增量同步到一张大宽表中,后台系统基于这张大宽表开展业务,所以就开发了一个数据同步工具,由中间件采集binlog消息到kafka里,然后我去消费,实现增量同 ...
随机推荐
- 将本地的java项目提交到github出错解决
1.我们新建一个了java项目后,需要提交到github进行版本控制 2.如果此时github中的仓库不为空,我们在本地使用git push提交时会报以下错误, ! [rejected] ...
- 启动angular项目,端口被占用
启动项目,npm start,报如下错误: 解决:1.win+R,输入CMD,启动命令行窗口. 2.输入netstat -ano或者netstat -ano|findstr 8080,查看8080端口 ...
- IntelliJ IDEA 2017 提示“Unmapped Spring configuration files found.Please configure Spring facet.”解决办法
当把自己的一个项目导入IDEA之后,Event Log提示“Unmapped Spring configuration files found.Please configure Spring face ...
- SQL Server 2005还原数据库时出现“不能选择文件或文件组XXX_log用于此操作的解决办法
SQL2005 还原数据库失败,提示如下: SQL Server 2005还原数据库时出现“不能选择文件或文件组XXX_log用于此操作的解决办法 出现错误时操作步骤为:右击数据库--->任务- ...
- discuz论坛后台部分设置更改之后,清除了缓存网站前台不更新不生效的解决办法
discuz论坛后台部分设置更改之后,清除了缓存但网站前台不更新不生效的解决办法 在config/config_global.php 把 $_config['memory']['eaccelera ...
- CodeForces - 841D Leha and another game about graph
给出一个连通图,并给每个点赋一个d值0或1或-1,要求选出一个边的集合,使得所有的点i要么d[i] == -1,要么 dgree[i] % 2 == d[i],dgree[i]代表i结点的度数. 考虑 ...
- 数据结构-STL序列式容器总结
根据序列在容器中的排列特性,将常见数据结构分为:序列式容器和关联式容器. 常见序列式容器有 1.array(build-in)c++內建 2.vector 3.heap(以算法方式呈现) 4.prio ...
- WIN 7 的vs2008 试用版评估期结束的解决方法
1. 在VS2008安装目录下把Setup/setup.sdb文件中的 [Product Key] T2CRQGDKBVW7KJR8C6CKXMW3D 改成 [Product Key] PYHYPWX ...
- 使用net命令启动MongoDB服务发生系统错误,返回值为5
使用net命令启动MongoDB服务发生系统错误,返回值为5 错误的截图如下: 解决的方案是以管理员的身份运行命令窗口,参考如下: https://www.cnblogs.com/fanblogs/p ...
- 部署jumpserver
参考:https://jumpserver.readthedocs.io/zh/master/setup_by_centos7.html yum update -y systemctl start f ...