Linux环境下使用Arthas(阿尔萨斯)定位cpu飙高问题
- 生产环境cpu飙高的原因
- Arthas工具如何排查Linux环境下cpu飙高的问题
- jvisualvm工具如何排查linux环境下cpu飙高的问题(需要做个配置,才能做远程连接)
- 生产环境下内存泄露产生的原因
- Arthas工具如何排查Linux环境下内存泄露的问题
生产环境cpu飙高的原因
cpu上运行的是线程
产生原因:
- CAS自旋,没有控制自旋次数(synchronized锁:就是使用的自旋,但是如果一直没有获取到锁的话,就会将当前线程从运行状态变为阻塞状态) CAS修改值内容,但是CAS也有缺点,就是如果CAS修改值失败的话,会不断的进行重试,重试的过程一直是运行状态的,并且重试是通过循环来实现的,所以是非常消耗cpu资源的
- 解决方案,如果我们在使用乐观锁的时候,要限制重试的次数,不要一直重试
- 云服务器上安装Redis,黑客攻击6379端口号,注入挖矿程序
- Redis端口不要外网访问
- 并发量比较大,或者恶意攻击
- 解决方式:限流
- 服务器端被DDOS攻击
- 其实攻击不好处理,一般是使用限流,ip黑名单,图形验证码,防止机器模拟攻击
- 死循环
- 一定要加上循环结束条件
创建线程过程中,要配置线程名称:阿里巴巴开发手册中有相应规定,便于排查是那些业务相关问题
在Windows下排查的话,主要是查看任务管理下的进程,根据进程定位到业务相关,如果是找不到业务相关,则表示你的线程命名不规范
在Linux下,可以使用top -c查看那个进程的cpu占比比较高
在Windows下,可以使用jdk自带的jvisualvm排查cpu,但是在1.8之后就没这个组件了,需要单独下载jvisualvm独立版下载
如果没有配置线程名称,则该线程可能为Thread-n,从而无法定位业务问题,所以在开启线程的时候,一定要定义线程名称、
实际上jvisualvm也是可以连接远程的,但是链接远程比较麻烦
linux下排查cpu占比
新建java文件,如Test04.java
public class Test04 {
public static void main(String[] args) {
new Thread(() -> {
while (true) {
System.out.println("1111111");
}
}, "hahaha").start();
}
}
上传至linux或者在linux中新建Test04.java,将代码进行复制
如图所示
之后通过javac命令对其进行编译
javac Test04.java
就会得到class文件,之后使用java Test04执行该文件,不要加.class,如果是一个jar包的话,则应该是java -jar 项目.jar
如何排查cpu飙高的问题呢,需要使用到arthas,首先下载
阿里云下载
curl -O https://arthas.aliyun.com/arthas-boot.jar
如果执行使用以下命令运行的话,会报错,错误原因在于当前服务器没有一个关于JVM的进程,没有的话就会报错,也就是想要使用Arthas的话,必须先要启动一个关于JVM的进程,因为没有找到的话,是不能做监控的,所以需要先运行java程序
java -jar arthas-boot.jar
这个时候如果先运行Test04这个class,再次执行Arthas启动命令,就又会有提示
通过top -c查看进程
因为有时候可能会检测到多个,这个时候仅仅只有一个[1],所以可以使用1来代替这个进程,之后回车
这个时候就会对这个4501这个进程做监控了,如何查看当前进程的哪个线程占cpu比较高呢,就可以使用以下命令
# 查看当前进程中前3个占用cpu比较高的线程
thread -n 3
一般大型公司都会搭建监控系统,去监控机器,如果cpu飙高,则会发送邮件通知,一般千万不要超过90%,超过就挂掉了,挂掉就不能排查了
一般是根据一些征兆去提前告警的