CPU性能--平均负载

平均负载

  • 单位时间内,系统处于可运行状态(R)不可中断状态(D)的平均进程数,也就是平均活跃进程数,和cpu没有直接关系。

  • 那么进程常见状态解释和代号如下:

$ man ps
Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the state of a process:
               D    uninterruptible sleep (usually IO)
               R    running or runnable (on run queue) )
               S    interruptible sleep (waiting for an event to complete)
               T    stopped by job control signal
               t    stopped by debugger during the tracing
               W    paging (not valid since the 2.6.xx kernel)
               X    dead (should never be seen)
               Z    defunct ("zombie") process, terminated but not reaped by its parent
  • 可运行状态进程:正在使用或者等待cpu的进程。ps命令看到的处于R状态(Running or Runnable)的进程。

  • 不可中断状态进程:处于和IO访问状态,并且这些流程是不可打断的。比如常见的是等待硬件设备的/IO响应。ps命令看到的D状态(Uniterruptible Sleep 也称Disk Sleep)的进程。

    • 不可中断状态实际上是对进程和硬件的一种保护机制。
    • 比如:当一个进程向磁盘写数据时,为了保证数据一致性,在得到磁盘回复之前,它是不能被其它进程中断打断的,这个时候进程处于不可中断状态。
  • 查看系统负载情况

# 周期性查看系统负载信息,并显示变化的部分
$ watch -d uptime
 当前时间  系统运行时间     正在登陆的用户 1分钟、5分钟、15分钟的平均负载
 07:49:31 up 1 day,  7:59,  1 user,  load average: 0.00, 0.01, 0.05

CPU使用率

  • 单位时间内CPU繁忙情况的统计,和平均负载不一定完全对应。

平均负载高产生原因

  • CPU密集型进程,使用大量CPU会导致平均负载高,此时cpu使用率也高。
  • I/O密集型进程,等待I/O导致负载升高,但CPU使用率不一定高。
  • 大量等待CPU的进程调度也会导致平均负载升高,此时CPU使用率也会比较高。
# 查看系统有几个cpu
$ grep 'model name' /proc/cpuinfo | wc -l
40

平均负载多少合理

  • 平均负载理想情况是等于CPU个数。
  • 一般平均负载高于CPU数量70%的时候,应该分析。(不是绝对)
  • 负载变高会导致进程响应变慢,进而影响服务正常功能。

平均负载案例分析

  • 压力测试工具:stress,用来模拟进程平均负载身高情况
  • 性能分析工具:sysstat,用来监控分析系统性能,这个包包含了mpstat、pidstat两个命令
    • mpstat: 用来查看每个cpu性能指标,以及所有cpu平均指标。
    • pidstat: 实时查看进程的cpu、内存、I/O以及上下文切换等性能指标。
# 安装
$ sudo yum install sysstat  stress

查看应用是CPU密集型还是IO密集型

  • 1.先查看当前系统负载uptime是否高
$ watch -d uptime
  • 2.查看负载升高的原因?
    cpu密集(%usr)、io密集(%iowait,%system)、大量等待cpu进程调度(负载明显大于cpu数)
每隔5秒查看每个cpu的指标,以及整体cpu平均指标
$ mpstat -P ALL 5 
  • 3.查看哪个应用造成了负载升高,即哪个应用,造成了上面的cpu密集(%CPU)、io密集(%system%wait)、大量等等cpu进程调度(%wait)。(如果当前系统只有一个应用,那就很方便了,不然,有可能是多个应用造成的)。
每隔5秒输出一组进程cpu使用数据(-u)
$ pidstat -u 5 1

测试环境

项目 说明
总的cpu核心 2
内存 4.3G

CPU密集型应用

# 开启两个worker进行耗费cpu计算
$ stress -c 2

$ uptime
# 负载大于cup核心数,说明负载高
16:34:34 up 45 min,  2 users,  load average: 3.00, 2.71, 1.59

用htop观察

$ htop
  • 进程的颜色是绿色,cpu使用率高


    image.png

用mpstat

#每隔5秒查看每个cpu的指标,以及整体cpu平均指标
$mpstat -P ALL 5
  • %usr值很高,%iowait低,说明cpu都花费在计算上
    image.png

用pidstat

  • 查看进程cpu使用情况
每隔5秒输出一组进程cpu使用数据(-u)
$ pidstat -u 5
  • 可以看到是stress引起的负载升高
  • %usr高,说明stress进程cpu利用率高,%wait高,说明cpu不够用在等待cpu调度上花费了不少时间。


    看应用的cpu使用情况
# 查看pid=1859进程的cpu利用率情况
$pidstat -p 1859 -u 5
  • %wait为33.8%,说明等待情况有点久。


    image.png

IO密集型应用

$stress -i 1

htop观察

  • 最近1分钟的负载为1.02,说明当前的平均活跃进程为1(即状态为R或D的进程)

  • 红色,代表当前使用cpu的进程是io型

  • stress进程的状态为D

io密集型表现

mpstat

mpstat -P ALL 5
  • %idle值搞,说明cpu整体在空闲。%iowait高,说明cpu在等待io上花费时间多。


    image.png

pidstat

  • 查看进程io和cpu情况
pidstat -ud 5
  • stress进程的iodelay延迟很高,但是rd,wr不高,cpu利率也底,说明在进行sync操作,都花在了io同步上了。


    image.png

大量等待CPU调度

# 进程数大于cpu数,会导致cpu切换频繁(此时系统cpu为4)
$stress -c 8
系统负载为8高于cpu个数4

mpstat

  • 每个cpu利用率都高,但是过多进程竞争,也会导致cpu整体利用率高(all)


pidstat

  • 可以看到,8个进程在竞争4个cpu,每个进程等待cpu的时间达到50%(%wait),这些超出cpu计算能力的进程,导致了负载变高


    竞争

推荐阅读更多精彩内容