jvm 调优-排查线上 cpu 使用率高的问题
今天小编给各位分享cpu使用率忽高忽低是怎么回事的知识,文中也会对其通过jvm 调优-排查线上 cpu 使用率高的问题和JVM性能调优指南(一)等多篇文章进行知识讲解,如果文章内容对您有帮助,别忘了关注本站,现在进入正文!
内容导航:
一、jvm 调优-排查线上 cpu 使用率高的问题
仁者见之谓之仁,智者见之谓之智。
在工作是和面试中,都会被问到一些调优的内容,比如 mysql jvm tomcat 之类的,因为这个问题比较大,今天就只说一点,也是面试会遇到的问题,线上排除 cpu 长时间超过 100%的问题。这里需要强调的是,top 命令展示的 cpu 使用率是总体的,单个 cpu 的使用率要除以 cpu 的核数才能得到结果。
通常的排查步骤如下:
1 通过 top 命令找到消耗 cpu 高的进程 id 号 pid2 根据 pid 找到消耗 cpu 资源比较高的线程 id3 对当前的线程做 stack,输出前进程的所有堆栈信息4 将第 2 步中得到的线程 id 转换成 16 进制进得到结果5 根据相应的线程 id 在堆栈信息中找到相关的内容6 解读对应的堆栈信息,定位代码位置并排查问题原因1 定位进程在 linux 系统中,一般使用 top 或者 ps 命令来定位查找进程信息。假设我们找出来了一个进程号为 19505 的应用。
# 查看 top 命令 按 x 按 cpu 进行排序top -d 2# 如果确定是 java 进程,可以使用ps 命令来查号进程ps -aux | grep java# 如果觉得top 命令显示的数据太多,可以使用以下命令,只展示前几行top | grep "top - " -A 8
2 查找线程信息查找进程内的线程情况,可以使用 ps 或者 top 命令来查看,查看进程 19505 内的线程信息。
# ps 查看进程的 pid 线程情况 -o 后面是打印输出列ps -mp 19505 -o THREAD,tid,time# 使用 top 命令查看当前进程内的线程情况top -Hp 19505 -d 1 -n 1# 使用 shell 的打印命令将线程高的线程 id 转换成 16进制,假设我们找到了一个线程ID 为 89043 ,那么转换成 16 进制就为 15bd3。printf "%x" tid
3 查找线程堆栈情况打印线程堆栈信息,需要使用 jvm 自带的命令 jstack , 当因当前进程的信息,然后使用 grep 命令直接匹配搜索线程相关情况。或者将线程堆栈信息存储为文本,然后再进行搜索查找。使用 jstack 命令查询堆栈信息
# 查看 19505 进程的 tid=15bd3 线程的堆栈情况jstack 19505 |grep tid -A 30# 使用 jstat 查看 gc 信息和内存使用情况jstat -gc 或者 jstat -gcutil
总结一般情况下,排查线上 cpu 飙高的步骤已经说明,但是基本没有哪家公司允许线上排除问题的,从线上摘掉有问题的服务进行操作观察处理。在实际工作中,这种操作一般不常见,99%的问题可以通过日志就能定位问题,复杂的系统也有相应的链路追踪系统,用到这种操作的基本不多,只是在面试的时候会用到,考察的点也是对 jvm 和 linux 操作系统的熟练程度。
作者:斜月链接:https://juejin.cn/post/7056657568000802824来源:稀土掘金
一、JVM性能调优指南(一)
-help-server -client
-version -showversion
-cp -classpath
调整为 完全解释执行 编译模式:
调整为 编译执行 编译模式:
最后一行的 mixed mode 表明JVM默认使用的编译模式是 混合模式
使用最多的一种参数类型
格式: -XX:[+/-] 表示启用或者禁用name属性
比如:
-XX:+UseConcMarkSweepGC 表示启用CMS垃圾回收器
-XX:+UseG1GC 表示启用G1垃圾回收器
格式: -XX: = 表示name属性的值为value
比如:
-XX:MaxGCPauseMillis=500 表示GC最大停顿时间是500毫秒
-XX:GCTimeRatio=19 表示...
虽然1以X开头,但是不是X类型参数,而是XX类型的参数
如查看JVM版本信息: java -XX:+PrintFlagsFinal -version > ~/version.txt
注: = 表示默认值, =: 表示修改后的值
关于jps等命令的详解,可参考此文档
如查看一个java进程id为9723的tomcat服务最大堆内存大小
查看一个进程的所有运行时参数:
Non-default VM flags 表示手动赋值过的参数,其中有些是tomcat设置的
Command line :与 Non-default VM flags
查看垃圾回收器信息
格式: jstat -class 进程id 每隔多少毫秒 一共输出多少次
如:查看一个进程id为29159的java进程,每隔1s输出,一共输出10次
要查看一个java进程的垃圾收集器信息,可使用 jstat -gc 进程id 每隔多少毫秒 一共输出多少次
S0C : Current survivor space 0 capacity (kB). 表示survivor 0区的总大小
S1C : Current survivor space 1 capacity (kB). 表示survivor 1区的总大小
S0U : Survivor space 0 utilization (kB). 表示survivor 0区使用了的大小
S1U : Survivor space 1 utilization (kB). 表示survivor 1区使用了的大小
EC : Current eden space capacity (kB). 表示eden区总大小
EU : Eden space utilization (kB). 表示eden区使用了的大小
OC : Current old space capacity (kB). 表示old区总大小
OU : Old space utilization (kB). 表示old区使用了的大小
MC : Metaspace capacity (kB). 表示Metaspace区总大小
MU : Metacspace utilization (kB). 表示Metaspace区使用了的大小
CCSC : Compressed class space capacity (kB). 表示压缩类空间总量
CCSU : Compressed class space used (kB). 表示压缩类空间使用量
YGC : Number of young generation garbage collection events. 表示Young GC的次数
YGCT : Young generation garbage collection time. 表示Young GC的时间
FGC : Number of full GC events. 表示full GC的次数
FGCT : Full garbage collection time. 表示full GC的时间
GCT : Total garbage collection time. 表示总的 GC的时间
模拟内存溢出:
设置启动参数:
启动application,发现出现内存溢出
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./
格式: jmap -dump:format=b,file=路径/heap.hprof 进程id
其他命令: jmap -heap 进程id 查看堆信息
右键查看com.imooc.monitor_tuning.chapter2.User的强引用
也可以查看对象树:
格式: jstack 进程id
访问/loop端点三次,然后使用top命令:
然后在导出的7930.txt文件中找到2037
访问/loop端点,制造死循环,使用jstack命令导出线程堆栈信息:
最后一行已提示:Found 1 deadlock
相关资料:
jdk8工具集
Troubleshooting
jps
jinfo
jstat
jmap:
mat:
jstack:
java线程的状态
tooldescr034.html
java线程状态转化:
死循环导致CPU负载高
正则表达式导致死循环:
二、CPU使用率达100%什么原因
电脑CPU使用率100%怎么办?CPU使用率就是电脑运行的程序占用的CPU资源,表示机器在某个时间点运行程序的情况。一般情况下CPU百分比越高电脑就会越慢,下面我们就来看下CPU使用率100%的处理方法。有人会问到:该如何确定自己电脑的CPU使用率达到了100%呢?这个问题很简单,直接右键单击任务栏空白处,选择“启动任务管理器”,切换到“性能”标签,就会看到CPU使用率.
电脑CPU使用率100%,总有一定的原因,我们来具体分析下:
一、杀毒软件造成
金山和瑞星之类杀毒软件都加入了对网页、插件和邮件的随机监控,这就增大了系统的负担。小编建议大家尽量使用最少的监控服务,或者升级硬件配置。
二、病毒、木马造成
有可能电脑中毒,大量的蠕虫病毒在系统内部迅速复制,造成CPU占用极速增加。小编建议大家要用可靠的杀毒软件彻底清理系统内存和本地硬盘,并打开系统设置软件,查看有无
异常启动的程序;经常更新杀毒软件和防火墙,加强防毒意识,掌握正确的防杀毒知识。
三、驱动没有经过认证造成
大量的测试版驱动在网上泛滥,造成了难以发现的故障原因。这就要求大家要特别注意显卡驱动,建议使用微软认证的或由官方发布的驱动,并且严格核对型号、版本。
四、启动项太多造成
很多人都喜欢将软件设置成开机启动,电脑的启动项越来越多,CPU使用率自然就会明显升高。建议大家关闭不必要的启动项,点击 开始—运行—输入msconfig—关闭不需要的启动项。
五、运行大型程序造成
有些网友在显卡等硬件配置没有满足需求的情况下,运行大型程序,比如网游,CPU占用率当然会高。小编建议在运行大型程序之前,查看电脑配置是否满足运行该程序的最低配置,如果确实是电脑配置不行的话,那就要将电脑进行硬件升级了。
六、系统文件错误造成
有时候系统文件会出现错误,可能造成CPU使用率高,甚至是高达100%。大家可以用系统自带的分区检查和整理工具进行检查和整理,开始—运行—输入CMD,在命令行里输入“chkdsk d: /b /x”,硬盘碎片用系统自带的就行;针对坏道,可以用硬盘坏道测试修复软件测试确定存在后,进行修复。
总结六种可能导致CPU占用率高的情况,大家可以根据自己的具体情况进行排查。
三、linux cpu使用率过高排查
方法一
第一步:使用
top命令,然后按shift+p按照CPU排序
找到占用CPU过高的进程的pid
第二步:使用
top -H -p [进程id]
找到进程中消耗资源最高的线程的id
第三步:使用
echo 'obase=16;[线程id]' | bc或者printf "%x\n" [线程id]
将线程id转换为16进制(字母要小写)
bc是linux的计算器命令
第四步:执行
jstack [进程id] |grep -A 10 [线程id的16进制]”
查看线程状态信息
方法二
第一步:使用
top命令,然后按shift+p按照CPU排序
找到占用CPU过高的进程
第二步:使用
ps -mp pid -o THREAD,tid,time | sort -rn
获取线程信息,并找到占用CPU高的线程
第三步:使用
echo 'obase=16;[线程id]' | bc或者printf "%x\n" [线程id]
将需要的线程ID转换为16进制格式
第四步:使用
jstack pid |grep tid -A 30 [线程id的16进制]
打印线程的堆栈信息
案例分析
场景描述
生产环境下JAVA进程高CPU占用故障排查
解决过程
1、根据top命令,发现PID为2633的Java进程占用CPU高达300%,出现故障。
2、找到该进程后,如何定位具体线程或代码呢,首先显示线程列表,并按照CPU占用高的线程排序:
1[root@localhost ~]# ps -mp 2633 -o THREAD,tid,time | sort -rn
显示结果如下:
找到了耗时最高的线程(TID)3626,占用CPU时间有12分钟了!
3、将需要的线程TID转换为16进制格式
12[root@localhost ~]# printf "%x\n" 3626e18
4、最后使用jstack命令打印出该进程下面的此线程的堆栈信息:
1[root@localhost ~]# jstack 2633 |grep "e18" -A 30
相比故障的解决而言,发现故障也同等的重要!市场上的大多数监控软件都能实现服务器负载的实时观测,比如:Zabbix、Nagios、阿里云监控(针对云服务器)等。但是当中大部分的软件都需要运维同学主动去设置规则或者检测才能发现问题,如何被动的也能收到告警呢?
推荐大家一个实用的运维软件——王教授,对于业务部署在阿里云上的用户,只需绑定需要监控的只读AcessKey,即可将云上资源的告警信息及时通知给对应的团队成员。
化主动为被动的方式,一方面减轻了运维工程师的工作,另一方面也减小了运维漏看或者忽略告警的情况发生。
关于cpu使用率忽高忽低是怎么回事的问题,通过《CPU使用率达100%什么原因》、《linux cpu使用率过高排查》等文章的解答希望已经帮助到您了!如您想了解更多关于cpu使用率忽高忽低是怎么回事的相关信息,请到本站进行查找!
爱资源吧版权声明:以上文中内容来自网络,如有侵权请联系删除,谢谢。