zoukankan      html  css  js  c++  java
  • linux进程cpu使用率过高分析与排查

    最近在工作中遇到一台生产的服务器CPU使用率过高报警,直线上升,基本上到了100%:

    CPU使用率

    看到报警后第一想到的就是使用top和ps -aux --sort=-pcpu|head -10 命令查看一下进程和CPU

    top命令执行结果

    发现最高的就是pid=2375的JAVA进程,需要进一步找到对应的线程(这里啰嗦一句就是:进程好比一个工厂,线程就好比工厂里面的一个工人)top -H p pid可以查看某个进程的线程信息:-H 显示线程信息,-p指定pid :

    发现CPU和内存都偏高的线程id(tid)有2377/2378/2379/2380这四个。使用jstack打印进程信息并导入指定日志文件,最后多执行几次,可供分析的数据会多一些,如下:

    jstack -F 2377 >/root/2377_err_1.log

    jstack -F 2378 >/root/2378_err_1.log

    jstack -F 2379 >/root/2379_err_1.log

    jstack -F 2380 >/root/2380_err_1.log

    再将线程十进制的线程id=2377转换为十六进制,因为在导出的日志文件中他们存在的方式是nid=0x+16进制线程id.

    printf "%x " 2377 输出的是:949 对应nid=0x949

    printf "%x " 2378 输出的是:94a 对应nid=0x94a

    printf "%x " 2379 输出的是:94b 对应nid=0x94b

    printf "%x " 2380 输出的是:94c 对应nid=0x94c

    这些信息都有了之后再回去分析刚才jstack导出的日志,可以在linux上使用:grep -A 10 nid 日志文件 (eg: grep -A 10 0x949 /root/2377_err_1.log ) 分析,也可以拿到本地分析.

    再来看一下思路和基础知识

    在 Linux 系统下,使用 top 命令查看 CPU 使用情况。

    %Cpu(s): 0.3 us, 0.1 sy, 0.0 ni, 99.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

    us(user):表示 CPU 在用户运行的时间百分比,通常用户 CPU 高表示有应用程序比较繁忙。典型的用户程序有:数据库、Web 服务器等。

    sy(sys):表示 CPU 在内核态运行的时间百分比(不包括中断),通常内核态 CPU 越低越好,否则表示系统存在某些瓶颈。

    ni(nice):表示用 nice 修正进程优先级的用户进程执行的 CPU 时间。nice 是一个进程优先级的修正值,如果进程通过它修改了优先级,则会单独统计 CPU 开销。

    id(idle):表示 CPU 处于空闲态的时间占比,此时,CPU 会执行一个特定的虚拟进程,名为 System Idle Process。

    wa(iowait):表示 CPU 在等待 I/O 操作完成所花费的时间,通常该指标越低越好,否则表示 I/O 存在瓶颈,可以用 iostat 等命令做进一步分析。

    hi(hardirq):表示 CPU 处理硬中断所花费的时间。硬中断是由外设硬件(如键盘控制器、硬件传感器等)发出的,需要有中断控制器参与,特点是快速执行。

    si(softirq):表示 CPU 处理软中断所花费的时间。软中断是由软件程序(如网络收发、定时调度等)发出的中断信号,特点是延迟执行。

    st(steal):表示 CPU 被其他虚拟机占用的时间,仅出现在多虚拟机场景。如果该指标过高,可以检查下宿主机或其他虚拟机是否异常。

    排查用户 CPU 使用率高
    用户 CPU 使用率反映了应用程序的繁忙程度

    大概步骤如下

    1)、通过 top 命令找到 CPU 消耗最多的进程号;
    2)、通过 top -Hp 进程号命令找到 CPU 消耗最多的线程号(列名仍然为 PID);
    3)、通过printf "%x " 线程号命令输出该线程号对应的 16 进制数字;
    4)、PID进程在内核调用情况。如果是Java应用可通过 jstack 进程号 | grep 16进制线程号 -A 10 命令找到 CPU 消耗最多的线程方法堆栈。
    非 Java 应用可使用 perf
    perf top -p pid_number

    perf命令不存在,使用yum install perf安装。

  • 相关阅读:
    UWP&WP8.1 基础控件——Grid
    UWP&WP8.1 基础控件——Border
    UWP&WP8.1 基础控件——Image
    UWP&WP8.1 基础控件—Button
    UWP&WP8.1 基础控件—TextBlock和TextBox
    UWP &WP8.1 依赖属性和用户控件 依赖属性简单使用 uwp添加UserControl
    UWP_开源小程序 水印添加器
    UWP&WP8.1 附加属性 和WebView的NavigateToString方法XAML绑定方法
    Sql Server 中锁的概念
    MSSQL 查询表空间
  • 原文地址:https://www.cnblogs.com/52py/p/14780806.html
Copyright © 2011-2022 走看看