平均负载
平均负载:是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和cpu使用率没直接关系
可运行状态进程: 正在使用cpu或者正在等待使用cpu的进程,就是ps命令看到的处于R状态的进程
不可中断状态:处于内核态关键流程中的进程,这些进程是不可被打断的,如等待硬件设备的io相应,ps命令看到的处于D状态的进程
- 当一个进程向磁盘读写数据时,为保证数据一致性,在得到磁盘回复前,他是不能被其他进程或者中断打断的,这时候的进程就处于不可中断状态
当平均负载为2,在2个cpu上,意味着所有cpu被完全占用,在4个cpu上,意味着cpu有50%的空闲,在1个cpu上,意味着一半进程竞争不到cpu
平均负载最理想的情况是等于cpu个数
获取cpu个数命令:
# grep 'model name' /proc/cpuinfo |wc -l
一般会给出1分钟,5分钟,10分钟三个时间内的负载情况
- 如果三个时间段的值基本相同,或相差不大,那就说明系统负载很平稳
- 如果1分钟内的负载远小于15分钟的。说明系统最近1分钟内的负载在减少,而过去15分钟内却有很高的负载
- 如果1分钟内负载远大于15的,说明最近1分钟内负载在增加,这种增加可能是临时性的,也可能会持续下去,一旦1分钟内平均负载接近或超过cpu个数,就意味着系统正在发生过载问题,这就需要分析原因,进行优化了,一般平均负载高于cpu数量70%时,就要引起注意了,更好的办法是把系统的平均负载监控,根据历史数据,判断负载变化趋势,当负载有明显升高趋势时,就要进行分析了
平均负载与cpu使用率:
- CPU使用率:单位时间内cpu繁忙情况
- 对cpu密集型进程,使用大量cpu会导致平均负载升高,这时平均负载与cpu使用率是一致的
- io密集型进程,等待io进程会导致平均负载升高,但cpu使用率不一定高
- 大量等待cpu进程调度也会导致平均负载升高,此时cpu使用率也会比较高
平均负载分析案例
使用iostat,mpstat,pidstat三个工具在Ubuntu系统上演示
安装压力测试工具stress和工具包sysstat
# apt install stress sysstat
测试场景1: cpu密集型应用
- 开启三个终端,第一个终端运行stress命令
# stress --cpu 1 --timeout 600
- 第二个终端运行uptime命令
# watch -d uptime
- 第三个终端,运行mpstatmingl
# mpstat -P ALL 5 监控所以cpu,没5秒输出1次数据
- 第二个终端显示如下:此处会发现1分钟的平均负载会慢慢增加到1.00
load average: 1.14, 0.95, 0.55
- 第三个终端效果如下:看到正好又一个cpu使用率为100%,但iowait为0
04:44:22 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 04:44:27 PM all 50.10 0.00 0.10 0.00 0.00 0.00 0.00 0.00 0.00 49.80 04:44:27 PM 0 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 04:44:27 PM 1 0.20 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 99.60
- 终端4:
# pidstat -u 5 1 间隔5秒后输出一组数据 04:52:39 PM UID PID %usr %system %guest %wait %CPU CPU Command 04:52:44 PM 0 20175 0.00 0.20 0.00 0.00 0.20 0 mpstat 04:52:44 PM 0 21649 100.00 0.00 0.00 0.00 100.00 1 stress stress进程cpu占用率为100%
场景1总结,终端1启动一个cpu占用100%的进程,终端2看到负载达到1.14,终端3看到一个cpu占用100%,但iowait为0,终端4,看出占用cpu 100%的是进程stress,以上可以发现导致占用率100%的进程是stress,平均负载升高是由于cpu占用率100%导致的
- 开启三个终端,第一个终端运行stress命令
场景2: I/O密集型进程
终端1
stress -i 1 --timeout 600
终端2
watch -d upteme load average: 0.87, 0.47, 0.46
终端3
mpstat -P ALL 5 1 05:05:32 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 05:05:37 PM all 0.70 0.00 49.45 0.00 0.00 0.00 0.00 0.00 0.00 49.85 05:05:37 PM 0 0.20 0.00 0.40 0.00 0.00 0.00 0.00 0.00 0.00 99.40 05:05:37 PM 1 1.40 0.00 98.60 77.53 0.00 0.00 0.00 0.00 0.00 0.00 cpu系统占用98.6%,iowaite77.53%
终端4
pidstat -u 5 1 Average: UID PID %usr %system %guest %wait %CPU CPU Command Average: 0 19355 0.00 0.20 0.00 0.00 0.20 - kworker/0:0 Average: 0 22133 1.20 98.80 0.00 0.00 100.00 - stress 占用率高由stress进程导致 Average: 0 22134 0.20 0.00 0.00 0.00 0.20 - watch Average: 0 22144 0.00 0.20 0.00 0.00 0.20 - mpstat Average: 0 22840 0.00 0.20 0.00 0.00 0.20 - pidstat
场景2总结:终端1模拟io压力,终端2显示1分钟平均负载0.87,终端3显示,一个cpu占用98.6%,来自系统占用(%sys),iowait高达77.53%,终端4,看出占用率最高的进程是stress,综上得出平均负载升高是因为iowait过高导致
场景3: 大量进程的场景
终端1:
stress -c 8 --timeout 600
终端2:
watch -d uptime 7:18:05 up 1:17, 5 users, load average: 6.58, 2.69, 1.37
终端3:
mpstat -P ALL 5 05:22:27 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 05:22:32 PM all 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 05:22:32 PM 0 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 05:22:32 PM 1 100.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
终端4:
pidstat -u 5 1 05:19:08 PM UID PID %usr %system %guest %wait %CPU CPU Command 05:19:13 PM 0 23074 24.85 0.00 0.00 74.75 24.85 0 stress 05:19:13 PM 0 23075 24.65 0.00 0.00 74.55 24.65 1 stress 05:19:13 PM 0 23076 24.85 0.00 0.00 74.75 24.85 1 stress 05:19:13 PM 0 23077 24.85 0.00 0.00 74.95 24.85 1 stress 05:19:13 PM 0 23078 24.85 0.00 0.00 74.75 24.85 1 stress 05:19:13 PM 0 23079 24.85 0.00 0.00 74.35 24.85 0 stress 05:19:13 PM 0 23080 24.85 0.00 0.00 74.55 24.85 0 stress 05:19:13 PM 0 23081 24.85 0.00 0.00 74.55 24.85 0 stress 05:19:13 PM 0 23319 0.00 0.20 0.00 0.20 0.20 0 pidstat
场景3总结:终端1模拟8个进程运行,从终端2显示结果看出,cpu 1分钟平均负载高达6.58,终端3看出两个cpu占用率全部100%,终端4看出,8个stress进程争抢2个cpu资源,cpu等待时间高达74.75%,说明cpu过载