平均负载
单位时间内,系统处于可运行状态(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使用率高
用mpstat
#每隔5秒查看每个cpu的指标,以及整体cpu平均指标
$mpstat -P ALL 5
-
%usr
值很高,%iowait低,说明cpu都花费在计算上
用pidstat
- 查看进程cpu使用情况
每隔5秒输出一组进程cpu使用数据(-u)
$ pidstat -u 5
- 可以看到是stress引起的负载升高
-
%usr高,说明stress进程cpu利用率高,%wait高,说明cpu不够用在等待cpu调度上花费了不少时间。
# 查看pid=1859进程的cpu利用率情况
$pidstat -p 1859 -u 5
-
%wait为33.8%,说明等待情况有点久。
IO密集型应用
$stress -i 1
htop观察
最近1分钟的负载为1.02,说明当前的平均活跃进程为1(即状态为R或D的进程)
红色,代表当前使用cpu的进程是io型
stress进程的状态为D
mpstat
mpstat -P ALL 5
-
%idle值搞,说明cpu整体在空闲。%iowait高,说明cpu在等待io上花费时间多。
pidstat
- 查看进程io和cpu情况
pidstat -ud 5
-
stress进程的iodelay延迟很高,但是rd,wr不高,cpu利率也底,说明在进行sync操作,都花在了io同步上了。
大量等待CPU调度
# 进程数大于cpu数,会导致cpu切换频繁(此时系统cpu为4)
$stress -c 8
mpstat
-
每个cpu利用率都高,但是过多进程竞争,也会导致cpu整体利用率高(all)
pidstat
-
可以看到,8个进程在竞争4个cpu,每个进程等待cpu的时间达到50%(%wait),这些超出cpu计算能力的进程,导致了负载变高