本随笔介绍CPU负载的排查手段。
查看系统负载的工具:uptime,w,都能查看系统负载,系统平均负载是处于运行或不可打扰状态的进程的平均数,
- 可运行:运行态,占用CPU,或就绪态,等待CPU调度。
- 不可打扰:阻塞,正在等待I/O
例1. 使用uptime查看系统负载
# uptime
19:26:17 up 49 days, 7:34, 1 user, load average: 0.67, 0.51, 0.41
这里我们关注的是最后三列,即系统1分钟、5分钟、15分钟内的平均负载,判断一个系统负载是否偏高需要计算单核CPU的平均负载,等于这里uptime命令显示的系统平均负载 / CPU核数,一般以0.7为比较合适的值。偏高说明有比较多的进程在等待使用CPU资源。
例2. 使用w查看系统负载
1 # w
2 19:29:47 up 49 days, 7:38, 1 user, load average: 0.42, 0.46, 0.41
3 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
4 openstac pts/1 10.14.16.25 19:21 1.00s 0.19s 0.03s sshd: openstack [priv]
使用 w 命令也可以查看类似的信息,w 命令还提供了当前登录用户,以及正在执行的操作等信息。
系统负载可以是CPU密集型的,也可以是RAM密集型和I/O密集型的,CPU密集型的系统比I/O密集型的系统响应度更好,因为I/O密集型的系统的磁盘I/O可能完全饱和,导致登录就很费事。
2. top命令
top命令不仅可以查看当前系统的平均负载,还可以查看不同进程对于CPU、内存等资源的使用情况,在内存排障部分我们也将介绍top命令。
例3. 使用top命令查看CPU使用率
top - 19:36:00 up 49 days, 7:44, 1 user, load average: 0.34, 0.38, 0.40
Tasks: 216 total, 3 running, 213 sleeping, 0 stopped, 0 zombie
%Cpu(s): 4.0 us, 6.1 sy, 0.0 ni, 88.0 id, 1.5 wa, 0.0 hi, 0.4 si, 0.0 st
KiB Mem: 12260128 total, 6160704 used, 6099424 free, 331448 buffers
KiB Swap: 0 total, 0 used, 0 free. 1393220 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3460 ntp 20 0 33508 2180 1536 S 47.2 0.0 5765:44 ntpd
12781 ceilome+ 20 0 137464 60096 4740 S 5.0 0.5 833:30.17 ceilometer-agen
2816 rabbitmq 20 0 2482652 274620 2612 S 1.7 2.2 1222:49 beam.smp
1501 mysql 20 0 655848 310788 9928 S 1.0 2.5 368:28.78 mysqld
2781 nova 20 0 355508 104096 3944 S 1.0 0.8 284:42.22 nova-conductor
410 root 39 19 0 0 0 S 0.7 0.0 409:22.74 kipmi0
2782 nova 20 0 356304 105000 3936 S 0.7 0.9 249:34.72 nova-conductor
19305 glance 20 0 182964 88608 4800 S 0.7 0.7 461:00.03 glance-api
例3给出了一个top命令的截图示意,默认情况下,top命令是以CPU使用率由高到低排序显示进程信息的,在 top 信息界面按 K 键,并输入想要终止的PID,就可以直接杀死指定进程。
top的 -b 选项开启批处理模式,将每次刷新全部打印到stdout
top的 -n 选项指定退出top命令前刷新多少次信息。
top命令的输出:
第1行:与uptime相同;
第3行:当前的CPU运行情况:
us:非nice用户进程占用CPU的比率
sy:内核、内核进程占用CPU的比率;
ni:如果一些用户进程修改过优先级,这里显示这些进程占用CPU时间的比率;
id:CPU空闲比率,如果系统缓慢而这个值很高,说明系统慢的原因不是CPU负载高;
wa:CPU等待执行I/O操作的时间比率,该指标可以用来排查磁盘I/O的问题,通常结合wa和id判断
hi:CPU处理硬件终端所占时间的比率;
si:CPU处理软件终端所占时间的比率;
st:流逝的时间,虚拟机中的其他任务所占CPU时间的比率;
用户进程占比高,wa低,说明系统缓慢的原因在于进程占用大量CPU,通常还会伴有教低的id,说明CPU空转时间很少;
wa低,id高,可以排除CPU资源瓶颈的可能。
wa高,说明I/O占用了大量的CPU时间,需要检查交换空间的使用,交换空间位于磁盘上,性能远低于内存,当内存耗尽开始使用交换空间时,将会给性能带来严重影响,所以对于性能要求较高的服务器,一般建议关闭交换空间。另一方面,如果内存充足,但wa很高,说明需要检查哪个进程占用了大量的I/O资源。
3. iostat命令
iostat命令可以查看系统分区的IO使用情况
例4. iostat命令查看系统IO占用
1 # iostat
2 Linux 3.13.0-55-generic (ISeR-Server1) 08/12/2015 _x86_64_ (4 CPU)
3
4 avg-cpu: %user %nice %system %iowait %steal %idle
5 4.62 0.02 2.20 0.55 0.00 92.60
6
7 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
8 sda 5.91 4.16 130.04 17735179 554343984
在第2行系统发行版本下面的第4、5行,可以看到与top命令中CPU使用情况类似的信息,
第7行,可以看到一些IO指标:
tps: 每秒I/O传输请求量;
kB_read/s:每秒读取多少KB;
kB_wrtn/s:每秒写多少KB;
kB_read:一共读了多少KB;
kB_wrtn:一共写了多少KB。
iostat命令属于sysstat工具包,由于我们的机器只挂载了一块硬盘,因此不能体现不同设备的I/O区别。
4. iotop命令
iotop命令类似于top命令,但是显示的是各个进程的I/O情况,对于定位I/O操作较重的进程有比较大的作用。
例5. iotop命令与进程的IO状况
1 Total DISK READ : 0.00 B/s | Total DISK WRITE : 972.38 K/s
2 Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 995.35 K/s
3 TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
4 1651 be/4 mysql 0.00 B/s 953.24 K/s 0.00 % 6.71 % mysqld
5 189 be/3 root 0.00 B/s 0.00 B/s 0.00 % 1.50 % [jbd2/sda2-8]
6 3492 be/4 mysql 0.00 B/s 7.66 K/s 0.00 % 0.80 % mysqld
7 3475 be/4 mysql 0.00 B/s 3.83 K/s 0.00 % 0.52 % mysqld
8 1539 be/4 mysql 0.00 B/s 0.00 B/s 0.00 % 0.30 % mysqld
9 2419 be/4 mysql 0.00 B/s 3.83 K/s 0.00 % 0.24 % mysqld
10 3085 be/4 mysql 0.00 B/s 3.83 K/s 0.00 % 0.22 % mysqld
这里可以看到不同任务的读写强度。
二、 sysstat工具与负载历史回放
很多系统负载过高的时候我们是无法立即获知或者立即解决的,当检测到或者知道历史的高负载状况时,可能需要回放历史监控数据,这时 sar 命令就派上用场了,sar命令同样来自sysstat工具包,可以记录系统的CPU负载、I/O状况和内存使用记录,便于历史数据的回放。
Ubuntu系统上,sysstat的配置文件在/etc/default/sysstat,sysstat默认关闭,通过将该文件中的ENABLED改为"true"启用;历史日志的存放位置为/var/log/sysstat
Red Hat系统上,sysstat的配置文件在/etc/sysconfig/sysstat文件,历史日志的存放位置为/var/log/sa
两种系统上,统计信息都是每10分钟记录一次,每天的23:59会分割统计文件,这些操作的频率都在/etc/cron.d/sysstat文件配置。
1. sar命令查看CPU、内存和磁盘记录
默认情况下,sar命令显示当天的统计信息,不带参数显示CPU统计信息,参数-r显示收集的内存记录,-b显示磁盘I/O
例6. 使用sar命令查看当天CPU使用
1 # sar
2 Linux 3.13.0-55-generic (ISeR-Server1) 08/12/2015 _x86_64_ (4 CPU)
3
4 12:00:01 AM CPU %user %nice %system %iowait %steal %idle
5 12:05:01 AM all 3.83 0.02 4.24 0.61 0.00 91.30
6 12:15:01 AM all 3.57 0.02 4.28 0.58 0.00 91.54
7 12:25:01 AM all 3.83 0.02 5.16 0.60 0.00 90.39
8 12:35:01 AM all 3.98 0.02 5.66 0.58 0.00 89.76
9 12:45:01 AM all 3.86 0.02 5.26 0.59 0.00 90.28
10 12:55:01 AM all 3.77 0.02 5.19 0.60 0.00 90.42
例7. 使用sar命令查看当天内存使用
1 # sar -r
2 Linux 3.13.0-55-generic (ISeR-Server1) 08/12/2015 _x86_64_ (4 CPU)
3
4 12:00:01 AM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
5 12:05:01 AM 6420736 5839392 47.63 242640 1366912 6811944 55.56 4324000 1202152 24
6 12:15:01 AM 6423128 5837000 47.61 242640 1367348 6830944 55.72 4320608 1202400 48
7 12:25:01 AM 6430984 5829144 47.55 242640 1367548 6814980 55.59 4314376 1202468 48
8 12:35:01 AM 6422924 5837204 47.61 242640 1367848 6817224 55.60 4321604 1202576 48
9 12:45:01 AM 6427300 5832828 47.58 242640 1368056 6822240 55.65 4318412 1202572 28
例8. 使用sar命令查看当天IO统计记录
1 # sar -b
2 Linux 3.13.0-55-generic (ISeR-Server1) 08/12/2015 _x86_64_ (4 CPU)
3
4 12:00:01 AM tps rtps wtps bread/s bwrtn/s
5 12:05:01 AM 7.44 0.00 7.44 0.00 279.22
6 12:15:01 AM 6.45 0.00 6.45 0.00 255.84
7 12:25:01 AM 6.59 0.00 6.59 0.00 260.20
8 12:35:01 AM 6.51 0.00 6.51 0.00 261.42
9 12:45:01 AM 6.42 0.00 6.42 0.00 255.79
2. 使用sar查看指定时间、指定日期的历史记录
例9. 使用参数-s和-e限定查看的时间
1 # sar -s 20:00:00
2 Linux 3.13.0-55-generic (ISeR-Server1) 08/12/2015 _x86_64_ (4 CPU)
3
4 08:05:01 PM CPU %user %nice %system %iowait %steal %idle
5 08:15:01 PM all 3.98 0.02 6.07 0.58 0.00 89.34
6 08:25:01 PM all 4.32 0.02 5.74 0.58 0.00 89.34
7 Average: all 4.15 0.02 5.91 0.58 0.00 89.34
例9 只查看当天20:00:00后的CPU统计记录
例10. 使用参数-f查看本月内之前某一天的历史统计信息
1 # sar -f /var/log/sysstat/sa08
2 Linux 3.13.0-55-generic (ISeR-Server1) 08/08/2015 _x86_64_ (4 CPU)
3
4 12:00:01 AM CPU %user %nice %system %iowait %steal %idle
5 12:05:01 AM all 3.65 0.02 2.79 0.60 0.00 92.94
6 12:15:01 AM all 3.45 0.02 3.03 0.56 0.00 92.94
7 12:25:01 AM all 3.43 0.02 3.25 0.56 0.00 92.74
8 12:35:01 AM all 3.44 0.01 3.09 0.56 0.00 92.89
9 12:45:01 AM all 3.25 0.02 1.35 0.55 0.00 94.83
10 12:55:01 AM all 3.36 0.02 1.77 0.56 0.00 94.29
sysstat工具只存储1个月内的系统使用记录,每天的记录以saN为文件名保存在相应的日志目录中,这里我们查看本月8号的CPU使用记录。