• CPU 使用率 100% 怎么办


    CPU 使用率 100% 怎么办

    独家号 码上实战 作者 flyhero原文链接

    工作中遇到CPU使用率100%,不要慌,一起来找出原因并fix掉它。

    记住这里大致流程,当线上突然遇到时,也不必手足无措。

    总体流程

    找出CPU比较高的进程PID

    top

    打印该进程下线程的CPU占用比较高的tid

    top -Hp {PID}

    将该tid进行16进制转换id

    printf "%x
    " {tid}

    打印线程的堆栈信息

    jstack {PID} |grep {id} -A 100

    当然这四步的执行需要时间,但我们可以将这几步写成shell脚本来执行。

    安装JDK命令行工具

    服务器上安装的OpenJDK ,是否有常用的命令行工具?

    验证是否安装

    [root@op-system ~]$ jstack -h
    Usage:
        jstack [-l] <pid>
            (to connect to running process)
        jstack -F [-m] [-l] <pid>
            (to connect to a hung process)
        jstack [-m] [-l] <executable> <core>
            (to connect to a core file)
        jstack [-m] [-l] [server_id@]<remote server IP or hostname>
            (to connect to a remote debug server)
    

    如果输出如上内容表明,已经拥有工具,倘若没有,那么继续下面。

    安装

    • 查看JDK版本
    [root@op-system ~]$ java -version
    openjdk version "1.8.0_201"
    OpenJDK Runtime Environment (build 1.8.0_201-b09)
    OpenJDK 64-Bit Server VM (build 25.201-b09, mixed mode)
    
    • 看openJDK有jstack的yum源
    [root@op-system ~]$ yum whatprovides '*/jstack'
    1:java-1.8.0-openjdk-devel-debug-1.8.0.201.b09-2.el7_6.x86_64 : OpenJDK Development Environment 8 with full debug on
    Repo        : @updates
    Matched from:
    Filename    : /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-2.el7_6.x86_64-debug/bin/jstack
    

    找到和JDK版本对应的yum源。

    • 安装
    [root@op-system ~]$ sudo yum install java-1.8.0-openjdk-devel-debug-1.8.0.201.b09-2.el7_6.x86_64

    寻找问题所在

    • 查出使用率最高的进程

    [root@op-system ~]$ top

    发现 123067 这个进程特别消耗CPU。

    • 查看进程中线程情况
    [root@op-system ~]$ top -p 123067 -H

    发现 127510 这个线程特别消耗CPU,那么我们来看看这个线程到底是做什么的。

    • 十进制id转十六进制

    [root@op-system ~]$ printf "%x
    " 127510
    1eaec
    
    • 使用jstack打印出线程的堆栈信息
    [root@op-system ~]$ jstack 123067 |grep 1eaec -A 100

    从打印出来的信息中发现了很熟悉的代码,对,就是这里。

    解决问题

    那么既然找到了问题,我们就只能通过,数据库索引、SQL优化、算法优化、快速返回等方法来最这段代码优化了。

  • 相关阅读:
    秒杀系统性能测试和优化
    性能测试分析过程(三)linux下查看最消耗CPU/内存的进程
    [改善Java代码]注意方法中传递的参数要求(replaceAll和replace的区别)
    [改善Java代码]由点及面,一叶知秋----集合大家族
    [改善Java代码]非稳定排序推荐使用List
    [改善Java代码]多线程使用Vector或HashTable
    [改善Java代码]减少HashMap中元素的数量
    [改善Java代码]使用shuffle打乱列表
    [改善Java代码]集合运算时使用更优雅的方式
    [改善Java代码]集合中的元素必须做到compareTo和equals同步
  • 原文地址:https://www.cnblogs.com/xuanbjut/p/11731129.html
Copyright © 2020-2023  润新知