arthas排查jvm中CPU占用过高问题解决

目录
  • 安装 小试
  • 找出CPU的元凶
  • 查看线程栈的参数

安装 小试

记一次使用arthas排查jvm中CPU占用过高问题。这工具屌爆了 碾压我目前使用的全部JVM工具。

curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar --repo-mirror aliyun --use-http

jar后面的参数也可以不加 加上只是为了下载速度更快

接下来arthas 控制台中显示了当前机器上jvm进程列表 输入需要排查的jvm进程号即可进入监控命令模式

找出CPU的元凶

处理问题之前 先想想如何去找到问题的原因 这个是解决问题个人觉得最重要的一步。

当前的现状是jvm启动后 cpu直接飙升到80+%。而内存是正常的,可以认为大概率是某个线程占用了计算资源 导致的。所以第一步需要先把占用过高线程给揪出来。

这次使用arthas排查。也顺便提一下以前记录过用top -Hp的方法找出占用资源的线程PID 方法 top -Hp方法参考 。

输入命令 thread 查看所有线程信息 默认是按照cpu资源占用排名的

可以看到当前线程lettuce-nioEventLoop-4-1 占用cpu高达47.75。其实这个线程名称已经能定位到具体某个方向的问题了,所以线程名称的定义需要有意义 为了方便排查问题。

可以看出因为我们程序使用了lettuce做redis的客户端,主要是使用了redis stream

StreamMessageListenerContainer.StreamMessageListenerContainerOptions<String, ObjectRecord<String, String>> containerOptions =
        StreamMessageListenerContainer.StreamMessageListenerContainerOptions.builder()
                .batchSize(10) // 一次性最多拉取多少条消息
                .targetType(String.class) // 目标类型。统一使用 String
                .executor(mqConsumerExecutor)
                .pollTimeout(Duration.ZERO)//0不超时
                .build();

.pollTimeout(Duration.ZERO)这一句改为 .pollTimeout(Duration.ofMillis(10))cpu就正常了。

原因就是设置了永不超时 资源得不到释放。

改为指定时间超时后 程序一点问题都没有了。

查看线程栈的参数

可以直接使用thread pid 上图占用最高的id为22 则输入 thread 22 能看到类似jstack的功能

"lettuce-nioEventLoop-4-1" Id=22 RUNNABLE
    at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
    at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
    at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)
    at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
    at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
    at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101)

还有一个更好用的命令 -n参数能显示top-n-threads 比上面一种更详细

"lettuce-nioEventLoop-4-1" Id=22 cpuUsage=49.51% deltaTime=99ms time=392976ms RUNNABLE
    at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
    at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
    at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)
    at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
    at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
    at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:101)

可以看出使用arthas排除这类问题 比使用top -Hp方便太多。当然这只是它的一个小功能而已。

以上就是arthas排查jvm中CPU占用过高问题解决的详细内容,更多关于arthas排查jvm CPU过高的资料请关注我们其它相关文章!

(0)

相关推荐

  • Eclipse IDE中如何设置JVM启动参数

    目录 如何设置JVM启动参数 下面是一些设置的步骤 在Eclipse上手动设置jvm参数 典型设置 如何设置JVM启动参数 关于<深入理解Java虚拟机>里面测试OutOfMemoryError异常的部分,需要对虚拟机的启动参数进行设置 下面是一些设置的步骤 1. 右键选择项目,在弹出的菜单进行选择 2. 在弹出的Debug Configurations面板,左侧的type filter text下面选择Java Application,找到自己的项目,例如我的项目HeapOOM. 3. 在D

  • 分享JVM 的四种引用方式

    目录 前言 一.强引用 二.软引用 三.弱引用 四.虚引用 前言 Java中提供这四种引用类型主要有两个目的: 可以让程序员通过代码的方式决定某些对象的生命周期: 有利于JVM进行垃圾回收 java.lang.ref包下的引用类结构图: 一.强引用 特点:GC时,永远不会被回收 是指创建一个对象并把这个对象赋给一个引用变量. 比如: Object object = new Object(); String str = "hello" 强引用有引用变量指向时永远不会被垃圾回收,JVM宁愿

  • JVM中最耗cpu的线程查找方法

    目录 正文 GC总体内存概述 正文 1.top命令查找出cpu最高的java进程pid 2.top -Hp 命令找出进程内最耗线程的pid top -Hp 22293 3.获取到上一步线程的pid后 将pid 16进制输出 # printf '%x\n' 22801 5911 4 使用jstack命令找出线程信息 jstack 进程pid |grep 16进制后的线程号 # jstack 22293|grep 5911 "DubboServerHandler-192.168.0.11:20880

  • java高级用法之绑定CPU的线程Thread Affinity简介

    目录 简介 Java Thread Affinity简介 AffinityLock的使用 使用API直接分配CPU 总结 简介 在现代计算机系统中,可以有多个CPU,每个CPU又可以有多核.为了充分利用现代CPU的功能,JAVA中引入了多线程,不同的线程可以同时在不同CPU或者不同CPU核中运行.但是对于JAVA程序猿来说创建多少线程是可以自己控制的,但是线程到底运行在哪个CPU上,则是一个黑盒子,一般来说很难得知. 但是如果是不同CPU核对同一线程进行调度,则可能会出现CPU切换造成的性能损失

  • Java多线程导致CPU占用100%解决及线程池正确关闭方式

    简介 情景:1000万表数据导入内存数据库,按分页大小10000查询,多线程,15条线程跑. 使用了ExecutorService executor = Executors.newFixedThreadPool(15) 本地跑了一段时间后,发现电脑CPU逐渐升高,最后CPU占用100%卡死,内存使用也高达80%. 排查问题 Debug 发现虽然创建了定长15的线程池,但是因为数据量大,在For中循环分页查询的List会持续加入LinkedBlockingQueue() 队列中每一个等待的任务,又

  • JVM---jstack分析Java线程CPU占用,线程死锁的解决

    本文章主要演示在Windows环境,Linux环境也差不多. 一.分析CPU占用飙高 首先写一个Java程序,并模拟一个死循环.让CPU使用率飙高.CPU负载过大的话,新的请求就处理不了了,这就是很多程序变慢了甚至不能访问的原因之一. 下面是我这里的Controller,启动程序之后,开多个请求访问这个方法.死循环代码就不贴了,自己构造.我这里模拟的一个截取字符串的死循环. /** * 演示死循环导致cpu使用率飙高 * */ @RequestMapping("/loop") publ

  • arthas排查jvm中CPU占用过高问题解决

    目录 安装 小试 找出CPU的元凶 查看线程栈的参数 安装 小试 记一次使用arthas排查jvm中CPU占用过高问题.这工具屌爆了 碾压我目前使用的全部JVM工具. curl -O https://arthas.aliyun.com/arthas-boot.jar java -jar arthas-boot.jar --repo-mirror aliyun --use-http jar后面的参数也可以不加 加上只是为了下载速度更快 接下来arthas 控制台中显示了当前机器上jvm进程列表 输

  • Java进程cpu占用过高问题解决

    cpu是时分(time division)的,操作系统里有很多线程,每个线程的运行时间由cpu决定,cpu会分给每个线程一个时间片,时间片是一个很短的时间长度,如果在时间片内,线程一直占有,则是100%:我们应该意识到,cpu运行速度很快(主频非常高),除非密集型耗费cpu的运算,其它类型任务都会在小于时间片的时间内结束. 产生CPU100%的原因: 某一程序一直占用CPU是导致CPU100%的原因,大概有以下几种情况: 1.Java 内存不够或溢出导致GC overhead问题, GC ove

  • 记一次tomcat进程cpu占用过高的问题排查记录

    本文主要记录一次tomcat进程,因TCP连接过多导致CPU占用过高的问题排查记录. 问题描述 linux系统下,一个tomcat web服务的cpu占用率非常高,top显示结果超过200%.请求无法响应.反复重启依然同一个现象. 问题排查 1.获取进程信息 通过jdk提供的jps命令可以快速查出jvm进程, jps pid 2.查看jstack信息 jstack pid 发现存在大量log4j线程block,处于waiting lock状态 org.apache.log4j.Category.

  • java实战CPU占用过高问题的排查及解决

    最近一段时间 某台服务器上的一个应用总是隔一段时间就自己挂掉 用top看了看 从重新部署应用开始没有多长时间CPU占用上升得很快 排查步骤 1.使用top 定位到占用CPU高的进程PID top 2.通过ps aux | grep PID命令 获取线程信息,并找到占用CPU高的线程 ps -mp pid -o THREAD,tid,time | sort -rn 3.将需要的线程ID转换为16进制格式 printf "%x\n" tid 4.打印线程的堆栈信息 到了这一步具体看堆栈的日

  • Arthas排查Kubernetes中应用频繁挂掉重启异常

    目录 前言 Kubernetes容器的特殊性 使用到的工具Arthas Arthas的使用 异常解析: 异常解析: 最后的救命稻草 但是为什么堆内存会这么小呢? 解决问题 最后尝试下jmap 结语 前言 其实最终定位到的问题还是蛮好解决的,但是因为应用在Kubernetes容器中的特殊性,导致在使用Arthas过程中出现了各种问题,所以单独成文和大家分享下.照例先讲下问题发生的背景,一个很老的web系统部署在tomcat容器里.近期打成了镜像丢到了Kubernetes环境中运行,总是各种挂,在K

  • java应用cpu占用过高问题分析及解决方法

    使用jstack分析java程序cpu占用率过高的问题 1,使用jps查找出java进程的pid,如3707 2,使用top -p 14292 -H观察该进程中所有线程的CPU占用. [root@cp01-game-dudai-0100.cp01.baidu.com ~]# top -p 14292 -H top - 22:14:13 up 33 days, 7:29, 4 users, load average: 25.68, 32.11, 33.76 Tasks: 113 total, 2

  • mysqlreport显示Com_中change_db占用比例高的问题的解决方法

    首先说明一点,每天的访问量并不大每天才2W的访问量,按道理说,访问量再增加一倍这样的服务器也应该足以承受.可是我们的服务器为什么总是这样频频重启呢?经过mysqlreport显示mysql运行的状态如下:MySQL 5.1.28-rc-log uptime 0 0:4:48 Thu Apr 30 14:04:58 2009 __ Key _________________________________________________________________Buffer used 7.7

  • Mysql CPU占用高的问题解决方法小结

    通过以前对mysql的操作经验,先将mysql的配置问题排除了,查看msyql是否运行正常,通过查看mysql data目录里面的*.err文件(将扩展名改为.txt)记事本查看即可.如果过大不建议用记事本了,容易死掉,可以用editplus等工具 简单的分为下面几个步骤来解决这个问题: 1.mysql运行正常,也有可能是同步设置问题导致 2.如果mysql运行正常,那就是php的一些sql语句导致问题发现,用root用户进入mysql管理mysql -u root -p输入密码mysql:sh

  • MySQL服务器进程CPU占用100%的解决方法

    朋友主机(Windows 2003 + IIS + PHP + MYSQL )近来 MySQL 服务进程 (mysqld-nt.exe) CPU 占用率总为 100% 高居不下.此主机有10个左右的 database, 分别给十个网站调用.据朋友测试,导致 mysqld-nt.exe cpu 占用奇高的是网站A,一旦在 IIS 中将此网站停止服务,CPU 占用就降下来了.一启用,则马上上升. MYSQL CPU 占用 100% 的解决过程 今天早上仔细检查了一下.目前此网站的七日平均日 IP 为

随机推荐