美文网首页
JVM占用CPU使用过高问题排查

JVM占用CPU使用过高问题排查

作者: 张九戒 | 来源:发表于2021-11-15 09:06 被阅读0次

    背景

    近期grafana告警测试服务器CPU使用过高,需要排查是什么原因导致并处理。


    告警信息

    排查

    使用TOP命令发现PID为98178的进程CPU占用达到397.5。

    top
    

    单独查看98178进程的使用情况

    top -p 98178
    

    各参数及意义如下:
    top - 10:17:20 up 202 days, 12:39, 1 user, load average: 14.19, 14.33, 14.28
    任务队列信息 含义
    10:17:20 当前时间
    202 days 系统运行时间
    12:39 用户在线时间
    1 users 在线用户数
    load average: 14.19, 14.33, 14.28 系统负载,即任务队列的平均长度。1分钟前、5分钟前、15分钟前平均负

    Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie

    进程信息 含义
    Tasks: 1 total 进程总数
    0 running 正在运行的进程数
    1 sleeping 睡眠的进程数
    0 stopped 停止的进程数
    0 zombie 僵尸进程数

    Cpu(s): 99.8%us, 0.2%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

    cpu信息 含义
    99.8% us 用户空间占用CPU百分比
    0.2% sy 内核空间占用CPU百分比
    0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
    0.0% id 空闲CPU百分比
    0.0% wa 等待输入输出的CPU时间百分比
    0.0% hi 硬件中断
    0.0% si 软件中断
    0.0%st 实时

    Mem: 16300292k total, 9979564k used, 6320728k free, 4288k buffers
    Swap: 8175612k total, 541836k used, 7633776k free, 82108k cached

    物理内存信息 含义
    Mem: 16300292k total 物理内存总量
    9979564k used 使用的物理内存总量
    6320728k free 空闲内存总量
    4288k buffers 用作内核缓存的内存量
    交换区信息 含义
    Swap: 8175612k total 交换区总量
    541836k used 使用的交换区总量
    7633776k free 空闲交换区总量
    82108k cached 缓冲的交换区总量

    查看线程情况,发现多个cpu高耗线程,并且cpu消耗接近,推断是一段问题代码被多次调用的结果。

    top -p 98178 -H
    

    查看最上面一个线程的TID,并转换成16进制

    printf "%x \n" 212019
    

    根据得到的16进制TID,通过jstack查找该线程后十行来定位问题代码。发现指向一个运行中(RUNNABLE)的线程,在代码ArchiveApi.java:519行。

    jstack 98178 | grep -A10 33c33
    

    解决

    找到查出来的代码,发现是一段文件写入的代码有个while(true)循环,推测是一直无法满足read==-1导致的CPU使用过高。



    修改代码并进行测试:

    修改代码 运行代码几次后查看cpu使用率

    CPU使用率2.3%,测试成功。

    相关文章

      网友评论

          本文标题:JVM占用CPU使用过高问题排查

          本文链接:https://www.haomeiwen.com/subject/svoftrtx.html