1、cpu平均负载和cpu使用率 排查cpu使用高问题

1. CPU

  1. cpu平均负载
    uptime 或 top 查看 cpu 平均负载(平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,,它和 CPU 使用率并没有直接关系)
$ uptime
02:34:03 up 2 days, 20:14, 1 user, load average: 0.63, 0.83, 0.88
当前时间     运行时间        正在登录用户数           1min   5min  15min
  1. 查看逻辑CPU个数 (当平均负载高于 CPU 数量 70% 的时候)
grep 'model name' /proc/cpuinfo | wc -l  逻辑CPU个数
  • 平均负载其实就是平均活跃进程数,那么最理想的,就是每个 CPU 上都刚好运行着一个进程,有了 CPU 个数,我们就可以判断出,当平均负载比 CPU 个数还大的时候,系统已经出现了过载。
    如果 1 分钟、5 分钟、15 分钟的三个值基本相同,或者相差不大,那就说明系统负载很平稳。
    但如果 1 分钟的值远小于 15 分钟的值,就说明系统最近 1 分钟的负载在减少,而过去 15 分钟内却有很大的负载。
  • 反过来,如果 1 分钟的值远大于 15 分钟的值,就说明最近 1 分钟的负载在增加,这种增加有可能只是临时性的,也有可能还会持续增加下去,所以就需要持续观察。一旦 1 分钟的平均负载接近或超过了 CPU 的个数,就意味着系统正在发生过载的问题,这时就得分析调查是哪里导致的问题,并要想办法优化了
  • 假设我们在一个单 CPU 系统上看到平均负载为 1.73,0.60,7.98,那么说明在过去 1 分钟内,系统有 73% 的超载,而在 15 分钟内,有 698% 的超载,从整体趋势来看,系统的负载在降低。

2. CPU 使用率

平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数。所以,它不仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程。
而 CPU 使用率,是单位时间内 CPU 繁忙情况的统计,跟平均负载并不一定完全对应。比如:
CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的;
I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高;
大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高。

3. 测试:

  1. 安装stress(Linux系统压力测试工具)和sysstat(Linux性能工具)(Centos7系统)
    安装stress(Linux系统压力测试工具)和sysstat(Linux性能工具)
    yum install stress 一直找不到镜像处理方式 所以用了rpm方式安装
    用rpm方式安装,先从下面的地址下载rpm包
    http://ftp.tu-chemnitz.de/pub/linux/dag/redhat/el7/en/x86_64/rpmforge/RPMS/stress-1.0.2-1.el7.rf.x86_64.rpm
    然后 rpm -Uvh stress-1.0.2-1.el7.rf.x86_64.rpm 安装
    sysstat使用yum安装 yum install sysstat
  • 查看平均负载变化率 watch -d uptime
$ watch -d uptime
...,  load average: 1.06, 0.58, 0.37
  • 查看cpu使用率 mpstat -P ALL 5
显示所有CPU的指标,并在间隔5秒输出一组数据
$ mpstat -P ALL 5 20
Linux 4.15.0 (ubuntu)     09/22/18     _x86_64_    (2 CPU)
13:41:28     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
13:41:33     all    0.21    0.00   12.07   32.67    0.00    0.21    0.00    0.00    0.00   54.84
13:41:33       0    0.43    0.00   23.87   67.53    0.00    0.43    0.00    0.00    0.00    7.74
13:41:33       1    0.00    0.00    0.81    0.20    0.00    0.00    0.00    0.00    0.00   98.99
  • 查看哪个进程占用cpu高 pidstat -u 5 1
# 间隔5秒后输出一组数据,-u表示CPU指标   pidstat输出中没有%wait的问题,
是因为CentOS默认的sysstat稍微有点老,源码或者RPM升级到11.5.5版本以后就可以看到了
$ pidstat -u 5 1
Linux 4.15.0 (ubuntu)     09/22/18     _x86_64_    (2 CPU)
13:42:08      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
13:42:13        0       104    0.00    3.39    0.00    0.00    3.39     1  kworker/1:1H
13:42:13        0       109    0.00    0.40    0.00    0.00    0.40     0  kworker/0:1H
13:42:13        0      2997    2.00   35.53    0.00    3.99   37.52     1  stress
13:42:13        0      3057    0.00    0.40    0.00    0.00    0.40     0  pidstat
  • 平均负载高有可能是 CPU 密集型进程导致的;
    平均负载高并不一定代表 CPU 使用率高,还有可能是 I/O 更繁忙了;
    当发现负载高的时候,你可以使用 mpstat、pidstat 等工具,辅助分析负载的来源。

4. 总结

一、什么是平均负载
正确定义:单位时间内,系统中处于可运行状态和不可中断状态的平均进程数。
错误定义:单位时间内的cpu使用率。
可运行状态的进程:正在使用cpu或者正在等待cpu的进程,即ps aux命令下STAT处于R状态的进程
不可中断状态的进程:处于内核态关键流程中的进程,且不可被打断,如等待硬件设备IO响应,ps命令D状态的进程
理想状态:每个cpu上都有一个活跃进程,即平均负载数等于cpu数
过载经验值:平均负载高于cpu数量70%的时候

二、相关命令
cpu核数: lscpu、 grep ‘model name’ /proc/cpuinfo | wc -l
显示平均负载:uptime、top,显示的顺序是最近1分钟、5分钟、15分钟,从此可以看出平均负载的趋势
watch -d uptime: -d会高亮显示变化的区域
strees: 压测命令,–cpu cpu压测选项,-i io压测选项,-c 进程数压测选项,–timeout 执行时间
mpstat: 多核cpu性能分析工具,-P ALL监视所有cpu
pidstat: 进程性能分析工具,-u 显示cpu利用率

三、平均负载与cpu使用率的区别
CPU使用率:单位时间内cpu繁忙情况的统计
情况1:CPU密集型进程,CPU使用率和平均负载基本一致
情况2:IO密集型进程,平均负载升高,CPU使用率不一定升高
情况3:大量等待CPU的进程调度,平均负载升高,CPU使用率也升高

四、平均负载过高时,如何调优
工具:stress、sysstat,yum即可安装

  1. CPU密集型进程case:
    mpstat -P ALL 5: -P ALL表示监控所有CPU,5表示每5秒刷新一次数据,观察是否有某个cpu的%usr会很高,但iowait应很低
    pidstat -u 5 1:每5秒输出一组数据,观察哪个进程%cpu很高,但是%wait很低,极有可能就是这个进程导致cpu飚高
  2. IO密集型进程case:
    mpstat -P ALL 5: 观察是否有某个cpu的%iowait很高,同时%usr也较高
    pidstat -u 5 1:观察哪个进程%wait较高,同时%CPU也较高
  3. 大量进程case:
    pidstat -u 5 1:观察那些%wait较高的进程是否有很多
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章