12.1.2 内存监控
Linux系统的内存分为物理内存和虚拟内存两种。物理内存是真实的,也就是物理内存条上的内存。而虚拟内存则是采用硬盘空间补充物理内存,将暂时不使用的内存页写到硬盘上以腾出更多的物理内存让有需要的进程使用。当这些已被腾出的内存页需要再次使用时才从硬盘(虚拟内存)中读回内存。这一切对于用户来说是透明的。通常对Linux系统来说,虚拟内存就是swap分区。
vmstat(Virtual Meomory Statistics,虚拟内存统计)是Linux中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU等的整体情况进行监视。vmstat以及本章后面会介绍的sar、mpstat和iostat命令在默认情况下是不会被安装的,用户可以通过Red Hat Enterprise Linux 5.2安装光盘中的“sysstat-7.0.2-1.el5.i386.rpm”软件包进行安装。vmstat命令格式如下:
vmstat [-a] [-n] [delay [ count]]
vmstat [-f] [-s] [-m]
vmstat [-S unit]
vmstat [-d]
vmstat [-p disk partition]
vmstat [-V]
例如,要以5秒为时间间隔,连续收集10次性能数据,命令如下:
# 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
0 0 0 6488 19844 242988 0 0 148 32 1143 361 4 1 91 3 0
0 0 0 6488 19844 242988 0 0 0 4 1139 340 4 0 96 0 0
0 0 0 6488 19852 242980 0 0 0 36 1144 339 4 1 96 0 0
0 0 0 6488 19852 242988 0 0 0 8 1139 321 4 0 97 0 0
0 0 0 6488 19856 242984 0 0 0 14 1141 346 4 0 96 0 0
1 0 0 6488 19856 242988 0 0 0 8 1139 332 3 2 95 0 0
0 0 0 6488 19856 242988 0 0 0 8 1139 323 4 1 95 0 0
0 0 0 6488 19864 242980 0 0 0 20 1142 343 3 2 95 0 0
2 0 0 6488 19864 242988 0 0 0 8 1139 322 4 0 96 0 0
0 0 0 6488 19872 242980 0 0 0 20 1142 362 4 1 95 0 0
输出结果中各字段的说明如表12.1所示。
表12.1 vmstat输出结果说明
字 段 | 类 别 | 说 明 |
r | procs(进程) | 在运行队列中等待的进程数 |
b | procs(进程) | 在等待io的进程数 |
swpd | memory(内存) | 已经使用的交换内存(kb) |
free | memory(内存) | 空闲的物理内存(kb) |
buff | memory(内存) | 用做缓冲区的内存数(kb) |
cache | memory(内存) | 用做高速缓存的内存数(kb) |
si | swap(交换页面) | 从磁盘交换到内存的交换页数量(kb/秒) |
so | swap(交换页面) | 从内存交换到磁盘的交换页数据(kb/秒) |
续表
字 段 | 类 别 | 说 明 |
bi | IO(块设备) | 发送到块设备的块数(块/秒) |
bo | IO(块设备) | 从块设备中接收的块数(块/秒) |
in | system(系统) | 每秒的中断数,包括时钟中断 |
cs | system(系统) | 每秒的上下文切换的次数 |
us | CPU(处理器) | 用户进程使用的cpu时间(%) |
sy | CPU(处理器) | 系统进程使用的cpu时间(%) |
id | CPU(处理器) | CPU空闲时间(%) |
wa | CPU(处理器) | 等待IO所消耗的cpu时间(%) |
st | CPU(处理器) | 从虚拟设备中获得的时间(%) |
对于内存监控,需要关心的指标包括:swpd、free、buff、cache、si和so,尤其需要重视的是free、si和so。很多人都会认为系统的空闲内存(free)少就代表系统性能有问题,其实并不是这样的,这还要结合si和so(内存和磁盘的页面交换)两个指标进行分析。正常来说,当物理内存能满足系统需要的话(也就是说物理内存能足以存放所有进程的数据),那么物理内存和磁盘(虚拟内存)是不应该存在频繁的页面交换操作的,只有当物理内存不能满足需要时系统才会把内存中的数据交换到磁盘中。而由于磁盘的性能是比内存慢很多的,所以如果存在大量的页面交换,那么系统的性能必然会受到很大影响。下面来看一个vmstat命令监控的例子。
# 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
0 2 808788 193147 78936 941420 307 0 21745 1005 1189 2590 34 6 12 48 0
0 2 808788 162212 78893 978920 95 0 12107 0 1801 2633 2 12 3 84 0
1 2 809268 88756 78717 1061424 130 28 18377 113 1142 1694 3 5 3 88 0
1 2 826284 17608 71240 1144180 100 2380 25839 16380 1528 1179 19 9 12 61 0
2 1 854780 17688 34140 1208980 1 3108 25557 30967 1764 2238 43 13 16 28 0
0 8 867528 17588 32332 1226392 31 748 16524 27808 1490 1634 41 10 7 43 0
4 2 877372 17596 32372 1227532 213 632 10912 3337 678 932 33 7 3 57 0
1 2 885980 17800 32408 1239160 204 235 12347 12681 1033 982 40 12 2 46 0
4 2 900472 17980 32440 1253884 24 1034 17521 4856 934 1730 48 12 13 26 0
3 2 900512 17620 32470 1255184 20 324 14893 3456 144 430 42 17 14 26 0
由上面的输出结果可以看到:
q 用做缓冲区(buff)和快速缓存(Cache)的物理内存不断地增加,而空闲的物理内存(free)不断地减少,证明系统中运行的进程正在不断地消耗物理内存。
q 已经使用的虚拟内存(swpd)不断增加,而且存在着大量的页面交换(si和so),证明物理内存已经不能满足系统需求,系统必须把物理内存的页面交换到磁盘 中去。
由此可以得到这样的结论:该主机上的物理内存已经不能满足系统运行的需要,内存已成为该系统性能的一个瓶颈。