本博客主要讲解了日常运维过程中,查看系统状态的一些指令mpstat,vmstat,iostat,sar,top
0、准备知识
1> 衡量CPU性能的指标:
<1> 用户使用CPU
- CPU运行实时进程
- CPU运行niced process
- CPU运行常规用户进程
<2> 系统使用CPU
- 用于I/O管理:中断和驱动
- 用于内存管理:页面交换
- 用于进程管理:进程开始和上下文切换
<3> WIO:用于进程等待磁盘I/O而使CPU处于空闲状态的比率。
<4> CPU的空闲率,除了上面的WIO以外的空闲时间
<5> CPU用于上下文交换的比率
<6> nice
<7> real-time
<8> 运行进程队列的长度
<9> 平均负载
2> Linux常用监控CPU整体性能的工具
<1> mpstat: mpstat 不但能查看所有CPU的平均信息,还能查看指定CPU的信息。
<2> vmstat:只能查看所有CPU的平均信息;查看cpu队列信息;
<3> iostat: 只能查看所有CPU的平均信息。
<4> sar: 与mpstat 一样,不但能查看CPU的平均信息,还能查看指定CPU的信息。
<5> top:显示的信息同ps接近,但是top可以了解到CPU消耗,可以根据用户指定的时间来更新显示。
1、mpstat指令
mpstat命令:主要用于多CPU 环境下,它显示各个可用CPU的状态。这些信息存放在/proc/stat文件中。在多CPUs系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。
- 命令格式:
mpstat [ 选项 ] [ <时间间隔> [ <次数> ] ] - 选项说明:
[ -A ] 展示所有cpu的状态
[ -I { SUM | CPU | ALL } ] 分三种情况展示 cpu的状态
[ -u ]
[ -P { [,…] | ON | ALL } ] 指定某个cpu,进行展示
[ -V ] 版本信息 - 参数说明:
- 实例分析:
[root@kvm ~]# mpstat -u
Linux 2.6.32-431.el6.x86_64 (kvm) 2016年08月02日 x86_64 (2 CPU)
13时28分09秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
13时28分09秒 all 0.03 0.00 0.02 0.03 0.00 0.00 0.00 0.00 99.92
[root@kvm ~]# mpstat -P 0
Linux 2.6.32-431.el6.x86_64 (kvm) 2016年08月02日 x86_64 (2 CPU)
13时28分47秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
13时28分47秒 0 0.03 0.00 0.02 0.00 0.00 0.00 0.00 0.00 99.95
[root@kvm ~]#
[root@kvm ~]# mpstat -P 1
Linux 2.6.32-431.el6.x86_64 (kvm) 2016年08月02日 x86_64 (2 CPU)
13时28分50秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
13时28分50秒 1 0.03 0.00 0.02 0.05 0.00 0.00 0.00 0.00 99.90
[root@kvm ~]# mpstat -A
Linux 2.6.32-431.el6.x86_64 (kvm) 2016年08月02日 x86_64 (2 CPU)
13时29分11秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
13时29分11秒 all 0.03 0.00 0.02 0.03 0.00 0.00 0.00 0.00 99.92
13时29分11秒 0 0.03 0.00 0.02 0.00 0.00 0.00 0.00 0.00 99.95
13时29分11秒 1 0.03 0.00 0.02 0.05 0.00 0.00 0.00 0.00 99.90
13时29分11秒 CPU intr/s
13时29分11秒 all 15.60
13时29分11秒 0 1.06
13时29分11秒 1 0.18 - 字段说明:
2、vmstat指令
- 命令格式:
vmstat [-V] [-n] (选项) [delay [count]](参数)
- 选项说明:
-a:显示活动内页;
-f:显示启动后创建的进程总数;
-m:显示slab信息;
-n:头信息仅显示一次;
-s:以表格方式显示事件计数器和内存状态;
-d:报告磁盘状态;
-p:显示指定的硬盘分区状态;
-S:输出信息的单位。
- 参数说明:
**事件间隔delay**:状态信息刷新的时间间隔;
**次数count**:显示报告的次数。
- 实例分析:
[root@kvm ~]# vmstat -n 3 3 (三秒一次,共三次)
props ———–memory———- —swap– —–io—- –system– —–cpu—-
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 1100728 188996 495396 0 0 0 1 8 7 0 0 100 0 0
0 0 0 1100720 188996 495396 0 0 0 0 16 14 0 0 100 0 0
0 0 0 1100720 188996 495396 0 0 0 0 12 11 0 0 100 0 0
[root@kvm ~]# vmstat -S M 3 2 (以M为单位显示,默认为k)
procs ———–memory———- —swap– —–io—- –system– —–cpu—–
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 1074 184 483 0 0 0 1 8 7 0 0 100 0 0
0 0 0 1074 184 483 0 0 0 0 17 13 0 0 100 0 0
[root@kvm ~]# vmstat -f
94103 forks - 字段说明:
Procs(进程)
r: 运行队列中进程数量,这个值也可以判断是否需要增加CPU。(长期大于1)
b: 等待IO的进程数量。
Memory(内存)
swpd: 使用虚拟内存大小,如果swpd的值不为0,但是SI,SO的值长期为0,这种情况不会影响系统性能。
free: 空闲物理内存大小。
buff: 用作缓冲的内存大小。
cache: 用作缓存的内存大小,如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。
Swap
si: 每秒从交换区写到内存的大小,由磁盘调入内存。
so: 每秒写入交换区的内存大小,由内存调入磁盘。
注意:内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。有些朋友看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。
IO(现在的Linux版本块的大小为1kb)
bi: 每秒读取的块数
bo: 每秒写入的块数
注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大。
system(系统)
in: 每秒中断数,包括时钟中断。
cs: 每秒上下文切换数。
注意:上面2个值越大,会看到由内核消耗的CPU时间会越大。
CPU(以百分比表示)
us: 用户进程执行时间百分比(user time) us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。
sy: 内核系统进程执行时间百分比(system time) sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。
wa: IO等待时间百分比 wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。
id: 空闲时间百分比
3、iostat指令
iostat命令被用于监视系统输入输出设备和CPU的使用情况。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。
- 命令格式:
iostat [ 选项 ] [ <时间间隔> [ <次数> ] ] - 选项说明:
-c:仅显示CPU使用情况;
-d:仅显示设备利用率;
-k:显示状态以千字节每秒为单位,而不使用块每秒;
-m:显示状态以兆字节每秒为单位;
-p:仅显示块设备和所有被使用的其他分区的状态;
-t:显示每个报告产生时的时间;
-x:显示扩展状态。 - 参数说明:
间隔时间:每次报告的间隔时间(秒);
次数:显示报告的次数。 - 实例分析:
命令:iostat -c 1 1
Linux 2.6.32-431.el6.x86_64 (kvm) 2016/08/02 x86_64 (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.03 0.00 0.02 0.03 0.00 99.92
命令:iostat -x /dev/sda1
Linux 2.6.32-431.el6.x86_64 (kvm) 08/02/2016 x86_64 (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.90 0.00 0.87 0.02 0.00 98.21
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda10.33 4.67 0.15 1.39 5.65 48.44 35.23 0.00 1.70 0.38 0.06
命令:iostat -d -m 2 2
Linux 2.6.32-431.el6.x86_64 (kvm) 08/02/2016 x86_64 (4 CPU)
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda 28.75 0.04 2.17 1738866 96878990
Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtn
sda 3.00 0.00 0.03 0 0
- 字段说明:
4、sar指令
sar命令是Linux下系统运行状态统计工具,它将指定的操作系统状态计数器显示到标准输出设备。sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统取样,获得大量的取样数据。取样数据和分析的结果都可以存入文件,使用它时消耗的系统资源很小。
- 命令格式:
sar [ 选项 ] [ <时间间隔> [ <次数> ] ] - 选项说明:
[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ] [ -R ]
[ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]
[ -I { [,…] | SUM | ALL | XALL } ] [ -P { [,…] | ALL } ]
[ -j { ID | LABEL | PATH | UUID | … } ] [ -n { [,…] | ALL } ]
[ -o [ ] | -f [ ] ] [ –legacy ]
[ -i ] [ -s [ ] ] [ -e [ ] ]
-A:显示所有的报告信息;
-b:显示I/O速率;
-B:显示换页状态;
-c:显示进程创建活动;
-d:显示每个块设备的状态;
-e:设置显示报告的结束时间;
-f:从指定文件提取报告;
-i:设状态信息刷新的间隔时间;
-P:报告每个CPU的状态;
-R:显示内存状态;
-u:显示CPU利用率;
-v:显示索引节点,文件和其他内核表的状态;
-w:显示交换分区状态;
-x:显示给定进程的状态。
主选项和报告:
-b I/O 和传输速率信息状况
-B 分页状况
-d 块设备状况
-I { <中断> | SUM | ALL | XALL }
中断信息状况
-m 电源管理信息状况
-n { <关键词> [,…] | ALL }
网络统计信息
关键词可以是:
DEV 网卡
EDEV 网卡 (错误)
NFS NFS 客户端
NFSD NFS 服务器
SOCK Sockets (套接字) (v4)
IP IP 流 (v4)
EIP IP 流 (v4) (错误)
ICMP ICMP 流 (v4)
EICMP ICMP 流 (v4) (错误)
TCP TCP 流 (v4)
ETCP TCP 流 (v4) (错误)
UDP UDP 流 (v4)
SOCK6 Sockets (套接字) (v6)
IP6 IP 流 (v6)
EIP6 IP 流 (v6) (错误)
ICMP6 ICMP 流 (v6)
EICMP6 ICMP 流 (v6) (错误)
UDP6 UDP 流 (v6)
-q 队列长度和平均负载
-r 内存利用率
-R 内存状况
-S 交换空间利用率
-u [ ALL ]
CPU 利用率
-v Kernel table 状况
-w 任务创建与系统转换统计信息
-W 交换信息
-y TTY 设备状况
- 参数说明:
间隔时间:每次报告的间隔时间(秒);
次数:显示报告的次数。 - 实例分析:
命令:sar -o temp 60 10 //观察系统部件10分钟,并对数据进行排序:
察看内存和交换空间的使用率:
命令:sar -r
09时20分01秒 kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit
09时30分01秒 1098232 919236 45.56 191632 495492 356908 17.69
09时40分01秒 1097992 919476 45.58 191744 495484 356908 17.69
命令:sar -u
Linux 2.6.32-431.el6.x86_64 (kvm) 2016/08/02日 x86_64 (2 CPU)
00时00分01秒 CPU %user %nice %system %iowait %steal %idle
00时10分01秒 all 0.03 0.00 0.02 0.04 0.00 99.91
00时20分01秒 all 0.03 0.00 0.02 0.03 0.00 99.92 - 字段说明:
kbmemfree与kbmemused字段分别显示内存的未使用与已使用空间,后面跟着的是已使用空间的百分比(%memused字段)。kbbuffers与kbcached字段分别显示缓冲区与系统全域的数据存取量,单位为KB。
5、top指令
top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。通过top命令所提供的互动式界面,用热键可以管理。
- 命令格式:
top (选项) - 选项说明:
-b:以批处理模式操作;
-c:显示完整的治命令;
-d:屏幕刷新间隔时间;
-I:忽略失效过程;
-s:保密模式;
-S:累积模式;
-i<时间>:设置间隔时间;
-u<用户名>:指定用户名;
-p<进程号>:指定进程;
-n<次数>:循环显示的次数。 - 参数说明:
- 实例分析:
top - 09:44:56 up 16 days, 21:23, 1 user, load average: 9.59, 4.75, 1.92 Tasks: 145 total, 2 running, 143 sleeping, 0 stopped, 0 zombie Cpu(s): 99.8%us, 0.1%sy, 0.0%ni, 0.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 4147888k total, 2493092k used, 1654796k free, 158188k buffers Swap: 5144568k total, 56k used, 5144512k free, 2013180k cached - 字段说明:
top - 09:44:56 [当前系统时间],
16 days [系统已经运行了16天],
1 user [个用户当前登录],
load average: 9.59, 4.75, 1.92 [系统负载,即任务队列的平均长度]
Tasks: 145 total[总进程数],
2 running[正在运行的进程数],
143 sleeping[睡眠的进程数],
0 stopped[停止的进程数],
0 zombie[冻结进程数],
Cpu(s): 99.8%us[用户空间占用CPU百分比],
0.0%ni[用户进程空间内改变过优先级的进程占用CPU百分比], 0.2%id[空闲CPU百分比],
0.0%wa[等待输入输出的CPU时间百分比],
0.0%hi[],
Mem: 4147888k total[物理内存总量],
2493092k used[使用的物理内存总量],
1654796k free[空闲内存总量],
158188k buffers[用作内核缓存的内存量]
Swap: 5144568k total[交换区总量],
56k used[使用的交换区总量],
5144512k free[空闲交换区总量],
2013180k cached[缓冲的交换区总量],
6、uptime指令
命令:uptime
20:55:40 up 24 days, 3:06, 1 user, load average: 8.13, 5.90, 4.94
命令输出的最后内容表示在过去的1、5、15分钟内运行队列中的平均进程数量。
一般来说只要每个CPU的当前活动进程数不大于3那么系统的性能就是良好的,如果每个CPU的任务数大于5,那么就表示这台机器的性能有严重问题。对 于上面的例子来说,假设系统有两个CPU,那么其每个CPU的当前任务数为:8.13/2=4.065。这表示该系统的性能是可以接受的。
参考文献
[1]
[2]http://man.linuxde.net/vmstat
[3] http://man.linuxde.net/iostat
[4] http://man.linuxde.net/mpstat
[5]http://man.linuxde.net/sar
[6]http://man.linuxde.net/top
[7]