linux学习

CPU-使用率

一、CPU使用率介绍

  1. 概念:单位时间内CPU使用情况的统计
  2. 参考范围:cpu利用率在30%左右或者15%左右是正常的,只要使用率不是长期处于50%以上就都属于正常现象

二、查看CPU使用率的工具

在查看CPU使用率中可以用到的工具:

  1. top:显示了系统总体的 CPU 和内存使用情况,以及各个进程的资源使用情况,但是界面简单,不够直观,交互性差
  2. htop:显示了系统每个的 CPU 的使用情况和内存使用情况,以及各个进程的资源使用情况,同时提供了更直观的界面和更丰富的交互功能,允许用户使用鼠标进行交互操作
  3. ps:只显示了每个进程的资源使用情况。
  4. pidstat:是一个专门分析每个进程 CPU 使用情况的工具

pidstat各个参数的介绍:

# 每隔1秒输出一组数据,共输出5组
$ pidstat 1 5
15:56:02      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
15:56:03        0     15006    0.00    0.99    0.00    0.00    0.99     1  dockerd

...

Average:      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
Average:        0     15006    0.00    0.99    0.00    0.00    0.99     -  dockerd

用户态 CPU 使用率 (%usr);

内核态 CPU 使用率(%system);

运行虚拟机 CPU 使用率(%guest);

等待 CPU 使用率(%wait);

以及总的 CPU 使用率(%CPU);

Average 部分,还计算了 5 组数据的平均值。

分析:

  1. CPU 使用率是最直观和最常用的系统性能指标,更是我们在排查性能问题时,通常会关注的第一个指标。所以我们更要熟悉它的含义,尤其要弄清楚用户(%user)、Nice(%nice)、系统(%system) 、等待 I/O(%iowait) 、中断(%irq)以及软中断(%softirq)这几种不同 CPU 的使用率
  2. 用户 CPU 和 Nice CPU 高,说明用户态进程占用了较多的 CPU,所以应该着重排查进程的性能问题。
  3. 系统 CPU 高,说明内核态占用了较多的 CPU,所以应该着重排查内核线程或者系统调用的性能问题。
  4. I/O 等待 CPU 高,说明等待 I/O 的时间比较长,所以应该着重排查系统存储是不是出现了 I/O 问题。
  5. 软中断和硬中断高,说明软中断或硬中断的处理程序占用了较多的 CPU,所以应该着重排查内核中的中断服务程序。

三、cpu使用率过高的排查

  1. 通过 top、ps、pidstat 等工具,可以轻松找到 CPU 使用率较高(比如 100% )的进程,接着找出占用 CPU 的代码中的函数

    1. 第一种方法是 perf top,类似于 top,它能够实时显示占用 CPU 时钟最多的函数或者指令,因此可以用来查找热点函数,使用界面如下所示:

      $ perf top
      Samples: 833  of event 'cpu-clock', Event count (approx.): 97742399
      Overhead  Shared Object       Symbol
       7.28%  perf                [.] 0x00000000001f78a4
       4.72%  [kernel]            [k] vsnprintf
       4.32%  [kernel]            [k] module_get_kallsym
       3.65%  [kernel]            [k] _raw_spin_unlock_irqrestore
      ...

      第一行包含三个数据,分别是采样数(Samples)、事件类型(event)和事件总数量(Event count)

      第一列 Overhead ,是该符号的性能事件在所有采样中的比例,用百分比来表示。

      第二列 Shared ,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。

      第三列 Object ,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。

      最后一列 Symbol 是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示。

    2. 第二种方法,也就是 perf record 和 perf report。 perf top 虽然实时展示了系统的性能信息,但它的缺点是并不保存数据,也就无法用于离线或者后续的分析。而 perf record 则提供了保存数据的功能,保存后的数据,需要你用 perf report 解析展示。还经常为 perf top 和 perf record 加上 -g 参数,开启调用关系的采样,方便我们根据调用链来分析性能问题。

      $ perf record # 按Ctrl+C终止采样
      [ perf record: Woken up 1 times to write data ]
      [ perf record: Captured and wrote 0.452 MB perf.data (6093 samples) ]
      
      $ perf report # 展示类似于perf top的报告
  2. 碰到常规问题无法解释的 CPU 使用率情况时,首先要想到有可能是短时应用导致的问题,比如有可能是下面这两种情况。

    1. 第一,应用里直接调用了其他二进制程序,这些程序通常运行时间比较短,通过 top 等工具也不容易发现。
    2. 第二,应用本身在不停地崩溃重启,而启动过程的资源初始化,很可能会占用相当多的 CPU。
    3. 对于这类进程,我们可以用 pstree 或者 execsnoop 找到它们的父进程,再从父进程所在的应用入手,排查问题的根源。

留言

您的电子邮箱地址不会被公开。 必填项已用 * 标注