Linux环境下使用Arthas定位cpu飙高问题

Linux环境下使用Arthas(阿尔萨斯)定位cpu飙高问题

  • 生产环境cpu飙高的原因
  • Arthas工具如何排查Linux环境下cpu飙高的问题
  • jvisualvm工具如何排查linux环境下cpu飙高的问题(需要做个配置,才能做远程连接)
  • 生产环境下内存泄露产生的原因
  • Arthas工具如何排查Linux环境下内存泄露的问题

生产环境cpu飙高的原因

cpu上运行的是线程
产生原因:

  1. CAS自旋,没有控制自旋次数(synchronized锁:就是使用的自旋,但是如果一直没有获取到锁的话,就会将当前线程从运行状态变为阻塞状态) CAS修改值内容,但是CAS也有缺点,就是如果CAS修改值失败的话,会不断的进行重试,重试的过程一直是运行状态的,并且重试是通过循环来实现的,所以是非常消耗cpu资源的
    • 解决方案,如果我们在使用乐观锁的时候,要限制重试的次数,不要一直重试
  2. 云服务器上安装Redis,黑客攻击6379端口号,注入挖矿程序
    • Redis端口不要外网访问
  3. 并发量比较大,或者恶意攻击
    • 解决方式:限流
  4. 服务器端被DDOS攻击
    • 其实攻击不好处理,一般是使用限流,ip黑名单,图形验证码,防止机器模拟攻击
  5. 死循环
    • 一定要加上循环结束条件

创建线程过程中,要配置线程名称:阿里巴巴开发手册中有相应规定,便于排查是那些业务相关问题

在Windows下排查的话,主要是查看任务管理下的进程,根据进程定位到业务相关,如果是找不到业务相关,则表示你的线程命名不规范

在Linux下,可以使用top -c查看那个进程的cpu占比比较高
Linux环境下使用Arthas定位cpu飙高问题

在Windows下,可以使用jdk自带的jvisualvm排查cpu,但是在1.8之后就没这个组件了,需要单独下载jvisualvm独立版下载

Linux环境下使用Arthas定位cpu飙高问题
Linux环境下使用Arthas定位cpu飙高问题
如果没有配置线程名称,则该线程可能为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,将代码进行复制
如图所示
Linux环境下使用Arthas定位cpu飙高问题
之后通过javac命令对其进行编译

javac Test04.java

Linux环境下使用Arthas定位cpu飙高问题
就会得到class文件,之后使用java Test04执行该文件,不要加.class,如果是一个jar包的话,则应该是java -jar 项目.jar

如何排查cpu飙高的问题呢,需要使用到arthas,首先下载
阿里云下载

curl -O https://arthas.aliyun.com/arthas-boot.jar

Linux环境下使用Arthas定位cpu飙高问题
如果执行使用以下命令运行的话,会报错,错误原因在于当前服务器没有一个关于JVM的进程,没有的话就会报错,也就是想要使用Arthas的话,必须先要启动一个关于JVM的进程,因为没有找到的话,是不能做监控的,所以需要先运行java程序

java -jar arthas-boot.jar

Linux环境下使用Arthas定位cpu飙高问题
这个时候如果先运行Test04这个class,再次执行Arthas启动命令,就又会有提示
Linux环境下使用Arthas定位cpu飙高问题
通过top -c查看进程
Linux环境下使用Arthas定位cpu飙高问题
因为有时候可能会检测到多个,这个时候仅仅只有一个[1],所以可以使用1来代替这个进程,之后回车
Linux环境下使用Arthas定位cpu飙高问题
Linux环境下使用Arthas定位cpu飙高问题
这个时候就会对这个4501这个进程做监控了,如何查看当前进程的哪个线程占cpu比较高呢,就可以使用以下命令

# 查看当前进程中前3个占用cpu比较高的线程
thread -n 3

Linux环境下使用Arthas定位cpu飙高问题

一般大型公司都会搭建监控系统,去监控机器,如果cpu飙高,则会发送邮件通知,一般千万不要超过90%,超过就挂掉了,挂掉就不能排查了
一般是根据一些征兆去提前告警的

上一篇:《Arthas系列2》 阿里居然是这样列出机器上的所有java进程


下一篇:阿里三面:算法题+JVM,成功入职字节跳动