常用linux系统监控命令

一、内存监控

监控内存的使用状态是非常重要的,通过监控有助于了解内存的使用状态,比如内存占用是否正常,内存是否紧缺等等,监控内存最常使用的命令有free、vmstat、top等

1.1 free

1
2
3
4
5
$ free
total used free shared buffers cached
Mem: 32872632 12393128 20479504 0 23308 7496048
-/+ buffers/cache: 4873772 27998860
Swap: 0 0 0

第一行(Mem):

  • total:内存总数 32872632 KB
  • used:已使用的内存数 12393128 KB
  • free:空闲的内存数 20479504 KB
  • shared:多个进程共享的内存,总是0
  • buffers:缓存内存数 23308 KB
  • cached:缓存内存数 7496048 KB

第二行(-/+ buffers/cache):

  • used:第一行Mem中的 used - buffers - cached = 12393128 - 23308 - 7496048 = 4873772 KB
  • free:第一行Mem中的 free + buffers + cached = 20479504 + 23308 + 7496048 = 27998860 KB
  • 可见这一行【used-buffers/cache】反映的是被程序实实在在吃掉的内存,【used+buffers/cache】反映的是可以挪用的内存总数。

第三行(Swap):表示交换分区的内存使用状态。

第一行内存状态是对于操作系统来说的,buffers/cached 都是属于被使用。

第二行内存状态是对于应用程序来说的,对于应用程序来说,buffers/cached占有的内存是可用的,因为buffers/cached是为了提高程序执行的性能,当应用程序需要用到内存的时候buffers/cached会很快地被回收,以供应用程序使用。

通常我们是从应用的角度来看的,所以只看第二行就行了。

另外,我们可以使用参数-m-g来以MBGB单位显示:

1
2
3
4
5
$ free -m
total used free shared buffers cached
Mem: 32102 12104 19998 0 22 7320
-/+ buffers/cache: 4760 27341
Swap: 0 0 0

1.2 vmstat

vmstat(Virtual Meomory Statistics,虚拟内存统计)是对系统的整体情况进行统计,包括内核进程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息。

1
$ vmstat 2 100      # 2表示刷新间隔,100表示输出次数

结果如下:

1
2
3
4
5
6
7
8
9
10
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 192532 91788 88812 0 0 2 1 20 30 0 0 100 0 0
0 0 0 192492 91788 88812 0 0 0 0 31 35 0 1 99 0 0
0 0 0 192492 91788 88812 0 0 0 0 23 30 0 0 100 0 0
0 0 0 192492 91788 88812 0 0 0 0 22 30 0 0 100 0 0
0 0 0 192492 91788 88812 0 0 0 0 22 31 0 1 100 0 0
0 0 0 192492 91788 88812 0 0 0 0 21 29 0 0 100 0 0
0 0 0 192492 91788 88812 0 0 0 0 21 30 0 0 100 0 0
0 0 0 192492 91788 88812 0 0 0 0 21 28 0 0 100 0 0

1)procs

  • r列表示运行和等待CPU时间片的进程数,这个值如果长期大于系统CPU个数,就说明CPU资源不足,可以考虑增加CPU;
  • b列表示在等待资源的进程数,比如正在等待I/O或者内存交换等。

2)memory

  • swpd列表示切换到内存交换区的内存数量(以KB为单位)。如果swpd的值不为0或者比较大,而且si、so的值长期为0,那么这种情况一般不用担心,不会影响系统性能;
  • free列表示当前空闲的物理内存数量(以KB为单位);
  • buff列表示buffers cache的内存数量,一般对块设备的读写才需要缓冲;
  • cache列表示page cached的内存数量,一般作文件系统的cached,频繁访问的文件都会被cached。如果cached值较大,就说明cached文件数较多。如果此时IO中的bi比较小,就说明文件系统效率比较好。

3)swap

  • si列表示由磁盘调入内存,也就是内存进入内存交换区的数量;
  • so列表示由内存调入磁盘,也就是内存交换区进入内存的数量
  • 一般情况下,si、so的值都为0,如果si、so的值长期不为0,则表示系统内存不足,需要考虑是否增加系统内存。

4)IO

  • bi列表示从块设备读入的数据总量(即读磁盘,单位KB/秒)
  • bo列表示写入到块设备的数据总量(即写磁盘,单位KB/秒)
    这里设置的bi+bo参考值为1000,如果超过1000,而且wa值比较大,则表示系统磁盘IO性能瓶颈。

5)system

  • in列表示在某一时间间隔中观察到的每秒设备中断数;
  • cs列表示每秒产生的上下文切换次数。
    上面这两个值越大,会看到内核消耗的CPU时间就越多。

6)CPU

  • us列显示了用户进程消耗CPU的时间百分比。us的值比较高时,说明用户进程消耗的CPU时间多,如果长期大于50%,需要考虑优化程序啥的。
  • sy列显示了内核进程消耗CPU的时间百分比。sy的值比较高时,说明内核消耗的CPU时间多;如果us+sy超过80%,就说明CPU的资源存在不足。
  • id列显示了CPU处在空闲状态的时间百分比;
  • wa列表示IO等待所占的CPU时间百分比。wa值越高,说明IO等待越严重。如果wa值超过20%,说明IO等待严重。
  • st列一般不关注,虚拟机占用的时间百分比。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ vmstat -s      # 查看内存使用的详细信息

32872632 total memory
25946240 used memory
21298968 active memory
3228124 inactive memory
6926392 free memory
79764 buffer memory
6767888 swap cache
0 total swap
0 used swap
0 free swap
5625247020 non-nice user cpu ticks
75476 nice user cpu ticks
3961269668 system cpu ticks
228172341381 idle cpu ticks
1685706618 IO-wait cpu ticks
11227 IRQ cpu ticks
537233093 softirq cpu ticks
0 stolen cpu ticks
817859502644 pages paged in
874791545051 pages paged out
0 pages swapped in
0 pages swapped out
1845948435 interrupts
2656703667 CPU context switches
1341191961 boot time
1691075642 forks

上面的信息主要来自于/proc/meminfo/proc/stat/proc/vmstat


二、CPU监控

2.1 top

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况及总体状况,类似于Windows的任务管理器。

1
2
3
4
5
6
7
8
9
10
top - 20:32:28 up 1149 days, 11:13,  2 users,  load average: 2.97, 2.42, 1.67
Tasks: 671 total, 1 running, 669 sleeping, 0 stopped, 1 zombie
Cpu(s): 0.2%us, 0.1%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 32872632k total, 12336240k used, 20536392k free, 23064k buffers
Swap: 0k total, 0k used, 0k free, 7441684k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2543 root 20 0 9204 636 396 S 0.7 0.0 614:57.76 irqbalance
4279 work 20 0 15.8g 1.4g 10m S 0.7 4.6 121:19.27 java
11761 work 20 0 153m 7192 1080 S 0.7 0.0 642:26.65 python

第一行:

  • 20:32:28: 当前时间
  • up 1149 days, 11:13:系统运行时间,系统已经运行了1149天11小时13分钟了。
  • 2 users:当前登录用户数
  • load average:系统负载,即任务队列的平均长度。三个数值分别为最近1分钟、最近5分钟、最近15分钟的平均负载 —— 超过N(CPU核数)说明系统满负荷运行。也可以通过$w$uptime命令查看load average。

第二行:

  • 显示进程总数、正在运行的进程数、休眠的进程数、停止的进程数、僵尸进程数

第三行:

  • %us:用户进程消耗的CPU百分比
  • %sy:内核进程消耗的CPU百分比
  • %ni:改变过优先级的进程占用CPU的百分比
  • %id:空闲CPU的百分比
  • %wa:IO等待消耗的CPU百分比

按”1”查看单个CPU的状况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
top - 20:32:49 up 1149 days, 11:13,  2 users,  load average: 0.00, 0.00, 0.00
Tasks: 671 total, 1 running, 669 sleeping, 0 stopped, 1 zombie
Cpu0 : 1.0%us, 0.7%sy, 0.0%ni, 98.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 : 0.7%us, 0.0%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu3 : 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu4 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu5 : 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu6 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu7 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu8 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu9 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu10 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu11 : 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu12 : 1.0%us, 0.3%sy, 0.0%ni, 98.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu13 : 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu14 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu15 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu16 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu17 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu18 : 0.7%us, 0.0%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu19 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu20 : 0.7%us, 1.0%sy, 0.0%ni, 98.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu21 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu22 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu23 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 32872632k total, 12336360k used, 20536272k free, 23080k buffers
Swap: 0k total, 0k used, 0k free, 7441976k cached

另外,下面的命令可以查看CPU的核数:

1
2
$ grep 'model name' /proc/cpuinfo | wc -l
24

2.2 mpstat

mpstat(Multiprocessor Statistics,多处理器统计)是实时系统监控工具,它会报告与CPU相关的统计信息,这些信息存放在/proc/stat文件中。

1
$ mpstat -P ALL 2        # ALL表示显示所有CPUs,也可以指定某个CPU;2表示刷新间隔
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Linux 2.6.32-2.0.0.1 (localhost) 	20150905日 	_x86_64_	(24 CPU)

185235秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
185237秒 all 0.23 0.00 0.12 0.00 0.00 0.00 0.00 0.00 99.65
1852370 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
1852371 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
1852372 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
1852373 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
1852374 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
1852375 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
1852376 1.01 0.00 0.00 0.00 0.00 0.00 0.00 0.00 98.99
1852377 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
1852378 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
1852379 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
18523710 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
18523711 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
18523712 0.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 99.00
18523713 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
18523714 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
18523715 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
18523716 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
18523717 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
18523718 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.00
18523719 0.00 0.00 0.50 0.00 0.00 0.00 0.00 0.00 99.50
18523720 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
18523721 0.50 0.00 1.50 0.00 0.00 0.00 0.00 0.00 98.00
18523722 0.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.50
18523723 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00

至于各百分比的含义前面已经介绍过了,这里就不再赘述。


三、网络监控

3.1 ethtool

使用ethtool查看网卡带宽,需要root权限:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# ethtool eth0
Settings for eth0:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 1
Transceiver: internal
Auto-negotiation: on
MDI-X: Unknown
Supports Wake-on: pumbg
Wake-on: g
Current message level: 0x00000003 (3)
Link detected: yes

可以看出网卡eth0的带宽为1000Mbps(兆比特每秒),所以理论上的网速极限为1000÷8 = 125MB/s

3.2 sar

1
$ sar -n DEV 3 100
1
2
3
4
5
6
7
8
9
10
11
12
$ sar -n DEV 3 100
Linux 2.6.32-2.0.0.1 (localhost) 08/25/2015 _x86_64_ (24 CPU)

08:37:55 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s

08:37:58 PM lo 2.01 2.01 0.44 0.44 0.00 0.00 0.00
08:37:58 PM eth0 5.35 0.00 0.49 0.00 0.00 0.00 0.00
08:37:58 PM eth1 12.04 3.01 0.95 0.86 0.00 0.00 0.00

08:37:58 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s

08:38:01 PM lo 9.00 9.00 2.52 2.52 0.00 0.00 0.00
08:38:01 PM eth0 17.33 0.00 1.02 0.00 0.00 0.00 0.00
08:38:01 PM eth1 24.33 12.67 3.04 6.48 0.00 0.00 0.00
  • IFACE:网络设备的名称
  • rxpck/s:每秒钟接收到的包数目
  • txpck/s:每秒钟发送出去的包数目
  • rxkB/s:每秒钟接收到的字节数
  • txkB/s:每秒钟发送出去的字节数

3.3 netstat

netstat命令一般用于检验本机各端口的网络连接情况,用于显示与IP、TCP、UDP和ICMP协议相关的统计数据。

部分选项如下:

1
2
3
4
5
6
7
8
9
10
-a, --all, --listening     显示所有连接中的Socket
-n, --numeric 以数字形式显示地址和端口号。
-t, -–tcp 显示TCP传输协议的连线状况。
-u, -–udp 显示UDP传输协议的连线状况。
-p, --programs 显示正在使用socket的程序名/进程ID
-l, --listening 显示监控中的服务器的Socket
-o, --timers 显示计时器。
-s, --statistics 显示每个网络协议的统计信息(比如SNMP)
-i, --interfaces 显示网络界面信息表单(网卡列表)
-r, --route 显示路由表

常用的几种:

1
2
3
4
5
$ netstat -aup        # 输出所有UDP连接状况
$ netstat -atp # 输出所有TCP连接状况
$ netstat -s # 显示各个协议的网络统计信息
$ netstat -i # 显示网卡列表
$ netstat -r # 显示路由表信息

找出程序运行的端口:

1
$ netstat -ap | grep ssh

找出运行在指定端口的进程:

1
$ netstat -anp | grep 60010


四、磁盘监控

4.1 df

df命令的功能是用来检查linux的文件系统的磁盘空间占用情况。如果没有文件名被指定,则显示当前所有被挂载的文件系统,默认以 KB 为单位。

常用选项如下:

1
2
3
4
5
6
7
-a  全部文件系统列表
-h 以方便阅读的方式显示
-i 显示inode信息
-T 显示文件系统类型
-l 只显示本地文件系统
-k 以KB为单位
-m 以MB为单位

最常用的就是$ df -h

4.2 iostat

上面在介绍CPU监控时,就可以看到%wa%iowait这一项,它表示I/O等待所占用CPU的百分比。为了得到关于磁盘IO更详细的状态信息,可以使用 iostat(I/O statistics,输入输出统计)命令:

1
2
3
4
5
-c 显示CPU使用情况
-d 显示磁盘使用情况
-k 以 KB 为单位显示
-m 以 M 为单位显示
-x 显示详细信息

1
2
3
4
5
6
7
8
9
10
11
12
13
$ iostat -x -k 2 100        # 2表示刷新间隔,100表示刷新次数

Linux 2.6.32-2.0.0.1 (localhost) 2015年09月05日 _x86_64_ (24 CPU)

avg-cpu: %user %nice %system %iowait %steal %idle
2.34 0.00 1.87 0.70 0.00 95.08

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sdj 0.06 0.13 6.18 2.20 708.94 740.47 345.95 0.00 5.32 2.63 2.20
sdd 0.06 0.13 6.34 2.15 716.75 722.91 339.00 0.02 2.07 2.73 2.32
sdb 0.05 0.12 3.01 1.68 365.89 581.01 404.05 0.02 3.26 2.19 1.03
sdf 0.06 0.14 6.25 2.21 712.99 741.76 343.92 0.00 5.20 2.62 2.22
sda 0.30 1.86 9.34 5.54 705.95 766.81 197.98 0.03 1.88 2.72 4.05

iostat主要是用来监控磁盘I/O,首先输出了CPUs的平均数据(avg-cpu),我们可以看%iowait这一项,除此之外iostat还提供了一些更详细的I/O状态数据,比如

  • r/s: 每秒完成的读 I/O 设备次数。
  • w/s: 每秒完成的写 I/O 设备次数。
  • rkB/s: 每秒读K字节数.是 rsect/s 的一半,因为每扇区大小为512字节。
  • wkB/s: 每秒写K字节数.是 wsect/s 的一半。
  • avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区)。
  • avgqu-sz: 平均I/O队列长度。
  • await: 平均每次设备I/O操作的等待时间 (毫秒)。
  • svctm: 平均每次设备I/O操作的服务时间 (毫秒)。
  • %util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。


五、进程监控

5.1 top

前面介绍过的top命令中可以对进程进行监控,其中一行就输出了进程的总体情况:

1
Tasks: 661 total,   1 running, 659 sleeping,   0 stopped,   1 zombie

默认情况下,top按照CPU使用率对各个进程进行排序。

1
2
3
4
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
2543 root 20 0 9204 636 396 S 0.7 0.0 614:57.76 irqbalance
4279 work 20 0 15.8g 1.4g 10m S 0.7 4.6 121:19.27 java
11761 work 20 0 153m 7192 1080 S 0.7 0.0 642:26.65 python

  • RES:进程使用的物理内存大小
  • SHR:进程共享内存大小
  • S:进程状态(R表示运行 ,S表示睡眠,Z表示僵死,D表示不可中断的睡眠)

在top运行状态下,输入M按内存使用率排序、输入P按CPU占用率排序、输入T按累计时间排序、输入c显示进程的启动命令,输入u显示指定用户的进程。

1
$ top -p <pid>

动态显示进程号为pid的进程的状态。

5.2 ps

ps(Process Status,进程状态)命令是最基本同时也是非常强大的进程查看命令,最常用的命令就是ps aux——显示当前所有进程

1
2
3
4
$ ps aux | grep root       # 输出root用户的所有进程
$ ps -p <pid> -L # 显示进程<pid>的所有线程
$ ps -e -o pid,uname,pcpu,pmem,comm # 定制显示的列
$ ps -o lstart <pid> # 显示进程的启动时间

ps命令的输出可以按任意某一列进行排序,通过使用内部排序键(列的别名),例如:

1
2
3
4
$ ps aux --sort=+rss         # 按内存升序排列
$ ps aux --sort=-rss # 按内存降序排列
$ ps aux --sort=+%cpu # 按cpu升序排列
$ ps aux --sort=-%cpu # 按cpu降序排列

ps命令的用法太多了,掌握一些常用的用法就好。如需了解更多的可选项,可以查看man手册。