Linux性能优化从入门到实战:04 基础篇:CPU使用率

版权声明: https://blog.csdn.net/qccz123456/article/details/85221628

  CPU使用率是单位时间内CPU使用情况的统计,以百分比方式展示。

$ top
top - 11:46:45 up 7 days, 11:52,  1 user,  load average: 0.00, 0.01, 0.00
Tasks: 198 total,   1 running, 197 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.2 us,  0.2 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  4044232 total,   420136 free,  1061244 used,  2562852 buff/cache
KiB Swap:  1046524 total,  1043128 free,     3396 used.  2619124 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                        
  921 root      20   0  531332 138408  58972 S   0.7  3.4  41:31.24 Xorg                                                                           

  参数解析如下:

  • %user(us),代表用户态 CPU 时间。不包括下面的 nice 时间,但包括了 guest 时间。
  • %nice(ni),代表低优先级用户态 CPU 时间,也就是进程的 nice 值被调整为 1-19 之间时的 CPU 时间。nice 可取值范围是 -20 到 19,数值越大,优先级反而越低。
  • %system(sys),代表内核态 CPU 时间。
  • %idle(id),代表空闲时间。不包括等待 I/O 的时间(iowait)。
  • %iowait(wa),代表等待 I/O 的 CPU 时间。
  • %irq(hi),代表处理硬中断的 CPU 时间。
  • %softirq(si),代表处理软中断的 CPU 时间。
  • %steal(st),代表当系统运行在虚拟机中的时候,被其他虚拟机占用的 CPU 时间。
  • %guest(guest),代表通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的 CPU 时间。
  • %guest_nice(gnice),代表以低优先级运行虚拟机的时间。
  • %CPU,每个进程的实时 CPU 使用率,是用户态和内核态 CPU 使用率的总和。包括进程用户空间使用的 CPU、通过系统调用执行的的内核空间 CPU 、以及在就绪队列等待运行的 CPU。在虚拟化环境中,它还包括了运行虚拟机占用的 CPU。
      

查看CPU使用的命令

  (1)top 默认使用 3 秒时间间隔,显示了系统总体的 CPU 和内存使用情况,以及各个进程的资源总体使用情况。vmstat、mpstat 提高更详细的分析多进程或者多线程应用。
  (2)ps 使用的却是进程的整个生命周期,显示了每个进程的资源使用情况。
  (3)pidstat 查看每个进程的详细CPU使用情况,包括用户态和内核态CPU。

  

CPU使用率是通过CPU时间计数计算而来

  而我们通常所说的 CPU 使用率,就是除了空闲时间外的其他时间占总 CPU 时间的百分比:
    在这里插入图片描述
  事实上,性能工具是取间隔时间作差,得到这段时间的平均CPU使用率:
    在这里插入图片描述
  同样Linux也给每个进程统计信息,/proc/[pid]/stat,通过上述方式计算使用率。
  为了维护 CPU 时间,Linux 通过事先定义的节拍率HZ,触发时间中断,并使用全局变量 Jiffies 记录了开机以来的节拍数。每发生一次时间中断,Jiffies 的值就加 1。节拍率 HZ 是内核的可配选项,可以设置为 100、250、、1000 等。不同的系统可能设置不同数值,你可以通过查询 /boot/config 内核选项来查看它的配置值。$ grep ‘CONFIG_HZ=’ /boot/conf-$(uname -r)
  节拍率 HZ 是内核选项,用户空间程序并不能直接访问,为了方便用户空间程序,内核还提供了一个用户空间节拍率 USE_HZ,它总是固定为 100,也就是 1/100 秒。
  Linux 通过 /proc 虚拟文件系统,向用户空间提供系统内部状态的信息,而 /proc/stat 提供的就是系统的 CPU 和任务统计信息,每一列则表示不同场景下 CPU 的累加节拍数,单位是 USER_HZ。
  

CPU使用率过高,如何进一步分析进程

  perf 以性能事件采样为基础,不仅可以分析系统的各种事件和内核性能,还可以用来分析指定应用程序的性能问题。
  (1)perf top,类似于 top,它能够实时显示占用 CPU.时钟最多的函数或者指令,中间不保存数据,因此可以用来查找热点函数。若定位到的函数是十六进制地址,说明没有找到待分析进程所依赖的库,解决方法是添加依赖库,或用perf record后在有依赖的环境中查看。

$ perf top
Samples: 175  of event 'cpu-clock', Event count (approx.): 43750000
Overhead  Shared Object            Symbol
   6.86%  perf                     [.] 0x00000000000a34ac
   5.71%  [kernel]                 [k] kallsyms_expand_symbol.constprop.1
   5.14%  [kernel]                 [k] format_decode

// 第一行 采样数(Samples)、事件类型(event)和事件总数量(Event count)
//        采集了 175 个 cpu-clock 事件,而总事件数则为 43750000
//        采样数过少,只有十几个时,下面的排序和百分比没有实际参考价值
// Overhead 是该符号的性能事件在所有采样中的比例
// Shared 是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。
// Object 是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。
// Symbol 是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示。

  (2)perf record 和 perf report,perf record 提供了保存数据的功能,保存后的数据,需要用 perf report 解析展示,用于离线或者后续的分析。

$ sudo perf record -g --all-cpus
// ^C 停止记录,数据保存在 perf.data 中,-g 开启调用关系的采样,--all-cpus 采集所有CPU事件
$ sudo perf report -g

  

CPU使用率过高的总体分析步骤

  Step1:通过 top、pidstat 找到哪个进程CPU使用率过高;
  Step2:通过 perf 找到该进程中具体哪个函数使用过高。$ perf top -g -p <pid_id>
  Step3:通过 grep 查看该函数中的具体内容。$ grep -nr "<function_name>" <file_path>
  性能问题:
  (1)用户 CPU 和 Nice CPU 高,说明用户态进程占用了较多的 CPU,所以应该着重排查进程的性能问题。
  (2)系统 CPU 高,说明内核态占用了较多的 CPU,所以应该着重排查内核线程或者系统调用的性能问题。
  (3)I/O 等待 CPU 高,说明等待 I/O 的时间比较长,所以应该着重排查系统存储是不是出现了 I/O 问题。
  (4)软中断和硬中断高,说明软中断或硬中断的处理程序占用了较多的CPU,所以应该着重排查内核中的中断服务程序。
  
  
  
  
  
  

猜你喜欢

转载自blog.csdn.net/qccz123456/article/details/85221628