vmstat可以监测给定时间间隔的服务器的状态值,包括CPU的使用率,内存的使用,虚拟内存的交换情况,IO读写情况。
主要从/proc/meminfo,/proc/stat和/proc/*/stat中获取数据
常用手段vmstat [采样的时间间隔秒数] [采样的次数],举例如下:
[root@dtbase-master-2 /root]
#vmstat 5 10
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 4126684 314132 58308212 0 0 0 637 0 0 2 1 97 0 0
1 0 0 4256016 314132 58308420 0 0 0 42898 19349 35174 3 2 95 0 0
4 0 0 4010396 314132 58474112 0 0 0 68072 19846 37088 4 2 93 0 0
1 0 0 4180556 314132 58308800 0 0 0 67730 19228 34979 4 2 94 0 0
1 0 0 4158408 314140 58313740 0 0 1 36034 19217 39319 4 2 94 0 0
2 0 0 4185816 314144 58313892 0 0 0 43252 19071 33302 3 2 95 0 0
2 0 0 4237076 314144 58314180 0 0 0 43059 18850 36224 3 2 95 0 0
1 0 0 4174432 314144 58314432 0 0 0 29495 18353 35612 3 2 95 0 0
2 0 0 4168024 314144 58318984 0 0 0 49652 19954 38394 3 2 94 0 0
0 0 0 4241088 314144 58319304 0 0 0 36272 17563 32637 2 1 97 0 0
上述命令表示每5秒采样一次,采样10次,因此输出10条记录,如果不指定采样次数的话,就一直采集直到用户手动停止采集。
上述显示中每一列的含义介绍如下:
*procs部分
* r 表示运行队列,表示Runnable状态的进程数,表示等待CPU的进程数量,越高意味着CPU越忙。
* b 表示阻塞的进程,表示uninterruptible sleep状态的进程数,通常可以认为表示等待IO的进程数量。
* memory部分
* swpd 表示已使用的交换空间大小,如果大于0,表示内存不足了。
* free 表示空闲的物理内存大小,单位是KB,上面表示还剩4G物理内存空闲
* buff 表示要输出到块设备但还缓存在内存中的数据
* cache 表示从块设备读入到内存中,缓存在内存中的数据,不包括tmpfs消耗的内存大小
* swap部分
* si 表示每秒有多少块从磁盘换入内存,如果这个值大于0,表示物理内存耗尽了
* so 表示每秒有多少块从内存换入磁盘,如果这个值大于0,表示物理内存耗尽了
* io部分
* bi 表示从块设备每秒收到的块数量,单位为blocks/s
* bo 表示每秒发到块设备的块数量,单位为blocks/s
* system部分
* in 表示每秒CPU的中断次数,包括时间中断
* cs 表示每秒上下文切换次数,越小越好
* cpu部分
* us 表示用户cpu时间,就是非内核态运行的CPU时间,单位是百分比
* sy 表示系统cpu时间,就是内核代码运行时间,单位是百分比
* id 表示空闲CPU时间,单位是百分比
* wa 表示等待IO的CPU时间,单位是百分比
* st 虚机占用的时间,单位是百分比
上述内存、交换区、IO统计的单位是块数,通常在Linux中一个块是1K字节。
free命令用于查看系统整体的内存使用情况,它的参数如下:
* -b/-k/-m/-g,调整显示单位,分别表示以字节/千字节/兆字节/吉字节为单位显示,默认是-k
* -t,增加一行显示内存总量,包括总内存量、总已用内存量和总空闲内存量
* -o,不显示buffer/cache调整行,就是-/+ buffers/cache行
* -l,增加两行显示低端和高端内存统计
* -s/-c,表示采样时间和采样次数
free命令的信息从/proc/meminfo中获取,meminfo函数可以解析meminfo的信息
free命令输出举例如下:
#free -l -t
total used free shared buffers cached
Mem: 99174024 95247820 3926204 0 314920 58382632
Low: 99174024 95247820 3926204
High: 0 0 0
-/+ buffers/cache: 36550268 62623756
Swap: 2097144 0 2097144
Total: 101271168 95247820 6023348
上述各行含义分别是:
* Mem:这行是表示从OS角度看系统内存的使用情况。
* total表示物理内存总量
* used表示
* free
* shared表示几个进程共享的内存,目前已经废弃,总是0。
* buffers,表示被OS buffer的内存,也就是缓冲要输出到块设备的数据
* cahced,表示被OS cache的内存,是OS从磁盘读出缓存到内存中的数据
* Low:表示从OS角度看的低端内存使用情况
* High:表示从OS角度看的高端内存使用情况,上面因为是64位系统,因此高端内存部分为0。
* -/+ buffers/cache:
* used,表示从一个应用程序的角度看,系统有多少内存被用掉了。
* free,表示从一个应用程序的角度看,系统还要多少剩余内存可用。
* Swap:表示交换区信息。
* Total:表示总量。
一般为了提高性能,操作系统总是会将磁盘的数据预先读到内存,而要写入磁盘的数据则先缓存在内存中,因此会看到free列比较小,而buffers/cache列比较大。
top命令用来实时监控系统的CPU、内存等负载状态,可以按照进程实时输出各进程占用的资源状态。
启动参数如下:
* -p 指定进程号,仅监控某个进程
* -c 显示整个命令行,而不仅仅是命令名
交互命令如下:
* h,输出帮助
* k,杀死进程,需要根据提示输入PID
* i,忽略闲置和僵尸进程,就是忽略掉不占用CPU的进程
* f,选择显示的列,是交互设置的,新版本还可以设置按照哪一列排序,老版本支持的字段较少。
* q,退出程序
top - 16:44:59 up 3 days, 30 min, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.3 st
KiB Mem: 1883984 total, 1797296 used, 86688 free, 169388 buffers
KiB Swap: 2097148 total, 0 used, 2097148 free. 230428 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
15597 root 20 0 2809456 721308 9592 S 0.0 38.3 28:37.43 java
用于显示进程信息,有两种参数格式,一种是标准格式ps -opt,一种是BSD格式ps opts
STANDARD FORMAT SPECIFIERS
部分 iostat命令的参数介绍如下
* -c,显示CPU利用率,默认启用,单独指定后默认不输出设备利用率
* -d,显示设备利用率,默认启用,单独指定后默认不输出cpu利用率
* -h,配合-n选项使用,使NFS系统的报告更human readable
* -k/-m,调整输出单位,千字节每秒或者兆字节每秒,默认单位是块每秒
* -N,显示磁盘阵列信息
* -n,显示NFS网络文件系统的IO报告
* -p,可指定分区查看,格式为-p [{device [,…]} | ALL]
* -t,输出时打印时间
* -x,输出扩展信息,就是输出更详细的信息,一般都使用该参数。
* -z,忽略没有活动的设备的输出
用法如下
iostat [参数] [采样时间秒数] [采样次数]
iostat -c 2 每隔2秒显示1次CPU统计信息
iostat -d 2 每隔2秒显示1次设备统计信息
iostat -d -x 2 10每隔2秒显示1次设备扩展统计信息,共显示10次。
iostat -d sda sdb -x 2 10 每隔2秒显示1次设备sda和sdb的扩展统计信息,共显示10次。
#iostat -x 1 6
Linux 2.6.32-220.23.2.ali878.el6.x86_64 (dtbase-master-2) 07/08/2016 _x86_64_ (32 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
2.03 0.00 1.14 0.01 0.00 96.82
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.01 3964.69 0.17 591.78 7.41 41068.15 69.39 0.14 0.24 0.03 1.75
#iostat -d 5 1
Linux 2.6.32-220.23.2.ali878.el6.x86_64 (dtbase-master-2) 07/08/2016 _x86_64_ (32 CPU)
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 593.11 7.39 41159.65 5836572 32509188906
上述输出中各部分信息描述如下:
* avg-cpu部分,对应-c输出的内容
* %user,表示用户CPU时间百分比
* %nice,表示用户态CPU的nice操作消耗的CPU时间百分比
* %system,表示内核CPU时间百分比
* %iowait,表示CPU花在io等待上的时间百分比
* %steal,表示虚机占用的CPU时间百分比
* %idle,表示CPU空闲时间百分比
* device部分,对应-d输出的内容
* rrqm/s,表示每秒这个设备有多少读取请求被Merge了,当系统调用读取数据时,VFS将请求发给各个FS,各个FS会根据请求是否是读取相同的block来合并读请求。
* wrqm/s,表示每秒这个设备有多少写请求被Merge了。
* r/s,表示每秒发送到设备的读取请求数
* w/s,表示每秒发送到设备的写入请求数
* rsec/s,表示每秒读取的扇区数量
* wsec/s,表示每秒写入的扇区数量
* avgrq-sz,表示发送到设备的请求的平均大小,单位是扇区
* avgqu-sz,表示发送到设备的请求的平均队列长度
* await,表示IO请求的平均执行时间,包括发送请求和执行的时间,但是为毫秒
* svctm,表示发送到设备的IO请求的平均执行时间,单位是毫秒,这里仅包含执行时间,不包含发送请求的时间
* %util,表示设备带宽利用率,实际是IO请求发送到设备期间占用的CPU时间的百分比。
* tps,表示该设备每秒的传输次数,一次传输是一次IO,多个逻辑IO可能被合并为一次物理IO,一次IO的大小未知。
* blk_read/s,表示每秒读入块的数量
* blk_wrtn/s,表示每秒写入块的数量
* blk_read,表示系统启动以来读入块的总数
* blk_wrtn,表示系统启动以来写入块的总数
vmstat -d [采样时间] [采样次数],列出所有块设备的读写情况,每个块设备一行。
[root@iZ2371imwx3Z ~]# vmstat -d 5 2
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
xvda 2143955 51246 98066178 79024080 787667 454849 30875448 26476350 0 2937
xvda 2143955 51246 98066178 79024080 787668 454849 30875456 26476352 0 2937
上述命令中各个字段的含义是:
* reads部分
* total,表示系统启动到现在完成读的总次数
* merged,表示系统启动到现在group读的次数,group read是反映为一次IO
* sectors,表示系统启动到现在读了多少个扇区
* ms,表示系统启动到现在读消耗的毫秒数
* writes部分
* total,表示系统启动到现在完成写的总次数
* merged,表示系统启动到现在group写的次数,group write反映为一次IO
* sectors,表示系统启动到现在写了多少个扇区
* ms,表示系统启动到现在写消耗的毫秒数
* IO部分
* cur:正在处理的IO数
* sec,表示系统启动到现在IO消耗的时间
vmstat -p 设备分区 [采样时间] [采样次数],列出指定分区的读写情况
[root@iZ2371imwx3Z ~]# vmstat -p /dev/xvda1 5 2
xvda1 reads read sectors writes requested writes
2143776 98064746 788481 30893256
2143776 98064746 788482 30893288
上述命令中各个字段的含义如下:
* reads,表示系统启动到现在此分区上总的读次数
* read sectors,表示系统启动到现在此分区上读的扇区总数
* writes,表示系统启动到现在此分区上总的写次数
* requested writes,表示系统启动到现在对此分区的写请求总数
netstat命令用来显示网络连接状态信息,这个命令官方已经废弃,可以用ss代替
典型用法:
netstat -anp
[root@iZ2371imwx3Z ~]# netstat --protocol=inet -a -W -e -o -v -p
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name Timer
tcp 0 0 0.0.0.0:https 0.0.0.0:* LISTEN root 315002 15597/java off (0.00/0/0)
tcp 0 0 localhost:mxi 0.0.0.0:* LISTEN root 315068 15597/java off (0.00/0/0)
tcp 0 0 0.0.0.0:8009 0.0.0.0:* LISTEN root 314999 15597/java off (0.00/0/0)
tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN root 314998 15597/java off (0.00/0/0)
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN root 13009 780/sshd off (0.00/0/0)
tcp 1 0 iZ2371imwx3Z:http iZ2371imwx3Z:55825 CLOSE_WAIT root 906801 15597/java off (0.00/0/0)
tcp 0 0 iZ2371imwx3Z:45708 69.172.201.153:http ESTABLISHED root 734431 15597/java off (0.00/0/0)
tcp 0 0 iZ2371imwx3Z:45613 69.172.201.153:http ESTABLISHED root 882000 15597/java off (0.00/0/0)
tcp 1 0 iZ2371imwx3Z:http iZ2371imwx3Z:42164 CLOSE_WAIT root 890885 15597/java off (0.00/0/0)
#netstat -x -e -o -p
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ] DGRAM 23365 9251/java @alimonitor9251
unix 2 [ ] DGRAM 15468 2820/java @alimonitor2820
unix 2 [ ] DGRAM 26408 9670/java @alimonitor9670
unix 2 [ ] DGRAM 9514 1108/udevd @/org/kernel/udev/udevd
unix 3 [ ] STREAM CONNECTED 62870049 19964/syslog-ng /dev/log
unix 3 [ ] STREAM CONNECTED 62870048 17807/pickup
ss用于替代netstat命令,用于输出socket的统计信息,输出类似netstat,可以显示更详细的TCP状态信息。
大部分参数和netstat一样,下面描述几个特有的参数
* -i,输出TCP内部的一些信息,包括各个连接的水位、选项的值。
* -m,输出socket的一些内存使用信息
* -s,按协议输出统计信息
* -D filename,dump socket原始信息到文件,这里是二进制信息。
* -t/-u/-4/-6/-x/-w/-0,指定协议的快捷选项,分别表示tcp、udp、ip、ipv6、unix、raw、packet
显示接口信息,目前ip命令可以实现其所有功能,这个命令正逐步被废弃。
ifconfig [接口名] 选项
ifconfig eth0 add 192.168.1.1/24
[root@iZ2371imwx3Z ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.252.100.80 netmask 255.255.248.0 broadcast 10.252.103.255
ether 00:16:3e:00:85:43 txqueuelen 1000 (Ethernet)
RX packets 27674 bytes 5689074 (5.4 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 33051 bytes 4136017 (3.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ip是显示和管理网络设备、路由、邻接表、策略路由、隧道的命令,功能强大。
ip link
ip addr
ip route
ip neigh
ip ntable
ip rule
ip tcp_metrics
ip tunnel