衡量cpu使用情况 - 占用率和负载

说明

  • 在对程序进行性能优化过程中,我体会到:正确的衡量cpu的使用情况(各种指标),是进行代码优化的前提条件;CPU是计算机的大脑,所有代码都是由CPU运行,不管是任何因素导致的性能问题,即使是资源不足(例如:内存不足,io较慢等)最终都能在CPU运行指标上得到体现,所以我们通过衡量cpu的各种指标即可对程序性能进行解释。

表现

  • 程序是否卡顿,通常由其外在表现体现,例如:对于GUI程序而言,用户操作时界面是否卡顿,操作是否有延时,对于非GUI程序而言,程序是否反应及时,这些都间接的体现了CPU使用情况;程序的外在表现体现的卡顿都是个人的主观感受,例如:GUI程序卡顿现象是操作延时过大给人造成的卡顿感觉,每个人的容忍度可能也不一样。
  • 我们通常使用运行时长来具体的描述程序性能, 程序的外在表现也都能通过指令运行时长来解释,程序的运行时长体现了当时CPU的使用情况,是各种指标的综合结果。
  • 卡顿是指用户长时间得不到响应,体现在时长上。
  • 影响程序运行时长和体现cpu使用情况的两个重要CPU指标:
  1. cpu使用率
  2. cpu负载
  3. 系统空闲时间

占用率

  • cpu 使用率可以通过top命令观察,按百分比显示,如下:
xxx@midcompser:~$ top
top - 12:17:03 up 223 days, 23:38, 28 users,  load average: 0.44, 1.11, 4.11
Tasks: 1349 total,   1 running, 1250 sleeping,  96 stopped,   2 zombie
%Cpu(s):  1.1 us,  0.8 sy,  3.2 ni, 94.6 id,  0.4 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:  13189618+total, 10773692+used, 24159264 free, 31246788 buffers
KiB Swap: 12695296+total,  8214784 used, 11873817+free. 64272436 cached Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                       
 54267 xxx       20   0   26040   3804   2356 R  16.5  0.0   0:00.05 top                                                                                                                                           
     1 root      20   0   33648   2336   1140 S   0.0  0.0   0:48.69 init                                                                                                                                          
     2 root      20   0       0      0      0 S   0.0  0.0   0:06.13 kthreadd                                                                                                                                      
     3 root      20   0       0      0      0 S   0.0  0.0  57:30.25 ksoftirqd/0         
* top 可以显示每个进程的CPU占用,以及第三行中的id表示总体剩余cpu资源。
  1. 占用率的理解
  • cpu 使用率并不是大家想象中的瞬时使用率,是一定时间内cpu使用时间与总时间的百分比,例如:top每隔1s统计一次cpu使用率,那么cpu 使用率就是这1s内,cpu非空闲时间与总时间的比例。
  • 每个进程的CPU使用率也是通过该方法计算出来的,如果某个进程的cpu使用率低,也可能并不是因为该进程不怎么占用cpu,也可能是优先级不高,没分到多少运行时间。
  1. 进程一直在运行,为什么CPU还会有空闲时间
  • linux下cpu调度是以进程(线程是轻量级进程,在调度时进程和线程是一样的)为单位,每个cpu核都有一个进程执行队列,当正在运行和可运行队列为空时,cpu就空闲了,队列为空是因为进程做sleep操作或者阻塞操作导致状态变为不可运行。
  • cpu使用率很少达到100%,实际上我们并没有充分使用cpu,这需要依靠系统配置和优秀的程序设计实现。

负载

查看

  • 可通过top命令或者/proc/loadavg或者uptime命令来查看cpu负载信息,数据是一样的,如下:
* top 信息中的第三行
Mem: 20656K used, 2676K free, 0K shrd, 5K buff, 882024K cached
CPU: 32.0% usr 28.0% sys  0.0% nic 40.0% idle  0.0% io  0.0% irq  0.0% sirq
Load average: 14.67 14.52 14.39 1/79 1203
  PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND
  459     1 root     S    48400207.3   0 32.0 cardv -o -N 1
* cat /proc/loadavg
14.48 14.50 14.40 1/80 1380
* uptime
21:01:20 up  1:15,  0 users,  load average: 14.65, 14.54, 14.42
  • 各项数据的含义:前三个数字是1、5、15分钟内的平均进程数,后面两个,第一个的分子是正在运行的进程数,分母是进程总数,另一个是最近运行的进程ID号。

负载理解

  • 既然cpu使用率都没到100%,说明cpu还有空闲,为什么程序会卡顿?这就要说到负载。
  • 负载是指cpu核正在执行和可执行的进程队列中的进程数量与cpu核的最大可执行进程数的比例;例如:一个cpu核1s钟可以执行100个进程,如果这1s内,正在执行和等待执行的进程数量是120,负载就为1.2。
  • 如果运行的进程数量多了,也会导致cpu的使用率增长,因为出现cpu空闲的几率就小了。
  • cpu使用率不高但是程序卡顿是因为,等待运行的进程数量过多,cpu负载较高,卡顿的进程需要等一段时间才能重新运行,等待时间长了,响应时间长了,给人的感觉就是卡顿了。

系统空闲时间

  • 可通过/proc/uptime查看系统空闲时间,如下:
cat /proc/uptime 
4666.15 1959.34
  • 数据含义:
  1. 第一列表示系统启动到现在的时间(以秒为单位)
  2. 第二列表示系统空闲的时间(以秒为单位)
  • 注意:在多核CPU以及SMP系统里,系统空闲的时间有时会是系统运行时间的几倍,这是因为系统空闲时间是多个核心空闲时间的总值。
  • 指标作用:系统空闲时长类似于CPU占用率,区别是系统空闲时长是总体的累加数据,而CPU占用率是单位时间内的数据,体现了CPU是否被充分使用,系统空闲时长较长说明CPU未被充分利用或者任务较少。

现实情况

  • 在现实场景中CPU的各种指标(例如:占用率和负载等)还和cpu核心的开启关闭以及cpu频率的降低增长有关,很多CPU都支持动态调节,在负载低的时候关闭cpu核以及降低cpu频率,例如联发科的CPU, 甚至会出现一核工作,7核围观的现象,因此衡量cpu的各种指标先要确认下CPU硬件资源。

查看cpu频率信息

  • 某些CPU可以通过sys系统查看cpu频率信息,例如:gm8136s 平台上通过以下命令查看。
* 最大频率
[root]# cat /sys/bus/cpu/devices/cpu0/cpufreq/cpuinfo_max_freq
712
* 当前频率
[root]# cat /sys/bus/cpu/devices/cpu0/cpufreq/cpuinfo_cur_freq
712

应用

  1. 性能监控
  • 有些软件产品,会加上性能监控模块,来做些资源释放或者异常规避处理;例如:之前公司在嵌入式设备上实现了一个监控模块,CPU使用过高的情况下,自动重启设备,以避免糟糕的使用体验,恢复正常使用。
  • 注意:这里需要监控的是负载而不是占用率,因为占用率是过去,而负载是将来,过去的使用情况已经没有意义了,知道将来的cpu使用情况才能做一些规避和调整。
  1. 性能优化
  • 程序性能问题导致体验不好。

性能优化个人经验

  1. CPU占用率不高,但是负载超过合理值
  • 说明CPU大部分时间都浪费在等待过程中,系统中存在过多的进程,CPU资源竞争激烈,并且大部分进程没有充分利用CPU,存在过多的等待操作(例如:延时sleep,等待io等),导致其它真正需要CPU资源的进程,得不到调度。
  1. CPU占用率高,负载低
  • 这才是理想状态。

你可能感兴趣的:(#,Linux,内核知识,性能优化,服务器,运维)