Linux优化实战之一:平均负载

平均负载

  • 平均负载:是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,它和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%导致的

  • 场景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过载


文章作者: BY 木易杨
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 BY 木易杨 !
评论
 上一篇
Linux系统优化之三:如何处理cpu占用100% Linux系统优化之三:如何处理cpu占用100%
cpu使用率linux通过proc这个虚拟文件系统,提供系统内部信息,/proc/stat提供的是系统cpu信息,可以使用以下命令查看: # cat /proc/stat |grep ^cpu cpu 241187 1658 242572
2020-04-25 BY 木易杨
下一篇 
MySQL实战之三:事务隔离 MySQL实战之三:事务隔离
本文是mysql实战专栏第三篇 事务隔离,为什么你改了我还看不见? 事务是要保证一组数据库操作,要么全部成功,要么全部失败,在mysql中,事务支持是在存储引擎层实现 隔离性与隔离级别 隔离性 Atomicity:原子性 Consi
2020-04-25 BY 木易杨