如何排查用户态CPU使用率高

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何排查用户态CPU使用率高相关的知识,希望对你有一定的参考价值。

  • 查看CPU使用
    在 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 7574

    如果提示perf: command not found,使用yum install perf安装。
    技术图片
    perf是Linux 2.6+内核中的一个工具,在内核源码包中的位置 tools/perf。
    perf利用Linux的trace特性,可以用于实时跟踪,统计event计数(perf stat);或者使用采样(perf record),报告(perf report|script|annotate)的使用方式进行诊断。

  • 以上是关于如何排查用户态CPU使用率高的主要内容,如果未能解决你的问题,请参考以下文章

    cpu高 问题定位

    系统负载高,如何排查?

    MongoDB CPU 利用率高排查

    线上服务器CPU占用率高如何排查定位

    高CPU排查方法分享

    linux 性能优化之CPU性能