一. 上节回顾
怎么查看CPU使用率?
top:显示了系统总体的CPU和内存使用情况,以及各个进程的资源使用情况。默认每隔3s刷新一次
ps:只显示每个进程的资源使用情况
top并没有细分进程的用户态CPU和内核态CPU
pidstat:可以分析每个进程的CPU使用情况
通过top,ps,pidstat这些工具,能够很快找到CPU使用率较高的进程。要知道CPU到底是哪个函数导致的问题,需要其它的工具,比如:perf top
perf top:类似于top,它能够实时显示占用CPU时间最多的函数或命令,因此可以用来查找热点函数
二. java进程占用CPU高
1. 准备工作
前提条件:
(1) 安装并配置好jdk环境变量(安装位置:/usr/local),安装教程:CentOS7安装JDK1.8图文教程
(2) 安装tomcat(安装位置:/data),注意和jdk版本的对应关系(tomcat 9-->jdk 8)
安装完成后,需要在Centos7上关闭防火墙
#查看防火墙状态firewall-cmd --state
#关闭防火墙
systemctl stop firewalld.service
(3) 把pertest.war放到/data/apache-tomcat-9.0.19/webapps下,启动tomcat,看能不能访问http://192.168.0.109:8080/pertest/init1.jsp
(4) 使用Jmeter制造阶梯型场景,并发20个线程数,持续运行20分钟,需要产生一个比较大的压力,看服务器的资源使用情况
(5) 根据top命令,发现pid:1480的进程占用CPU高达90%以上。输入top按1
(6) 通过命令:ps aux | grep 1480,进一步确定是tomcat的进程导致的
(7) 怎么定位到是哪个线程或者代码导致的?
这个时候就需要显示线程列表:ps -mp 1480-o THREAD,tid,time
找到耗时最高的线程,可以看到1482这个线程,占用时间变化较大
比如:1482这个线程,占用CPU盖度82%,它还在不断的升高
(8) 把这个线程的id转为16进制格式:printf "%x\n" 1482
(9) 打印线程的堆栈信息:jstack 1480 | grep 5ca -A60
(10) 在日志里查看:grep 'OutOf' catalina.out,可以看到内存溢出了
日志里也可以看到一些BLOCKED,WAITING等