虚拟内存管理是 Linux 内核里面最复杂的部分,要弄懂这部分内容可能需要一整本书的讲解。VPSee 在这里只介绍和性能监测有关的两个内核进程:kswapd 和pdflush。

1、kswapd daemon      用来检查 pages_high 和 pages_low,如果可用内存少于 pages_low,kswapd 就开始扫描并试图释放 32个页面,并且重复扫描释放的过程直到可用内存大于 pages_high 为止。扫描的时候检查3件事:1)如果页面没有修改,把页放到可用内存列表里;2)如果页面被文件系统修改,把页面内容写到磁盘上;3)如果页面被修改 了,但不是被文件系统修改的,把页面写到交换空间。

2、pdflush daemon 用来同步文件相关的内存页面,把内存页面及时同步到硬盘上。比如打开一个文件,文件被导入到内存里,对文件做了修改后并保存后,内核并不马上保存文件到硬      盘,由 pdflush 决定什么时候把相应页面写入硬盘,这由一个内核参数 vm.dirty_background_ratio 来控制,比如下面的参数显示脏页面(dirty pages)达到所有内存页面10%的时候开始写入硬盘。
# /sbin/sysctl -n vm.dirty_background_ratio

10

vmstat

继续 vmstat 一些参数的介绍,上一篇 Linux 性能监测:CPU 介绍了 vmstat 的部分参数,这里介绍另外一部分。以下数据来自 VPSee 的一个 256MB RAM,512MB SWAP 的 Xen VPS:

# vmstat 1

procs ———–memory———- —swap– —–io—- –system– —–cpu——

r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

0  3 252696   2432    268   7148 3604 2368  3608  2372  288  288  0  0 21 78  1

0  2 253484   2216    228   7104 5368 2976  5372  3036  930  519  0  0  0 100  0

0  1 259252   2616    128   6148 19784 18712 19784 18712 3821 1853  0  1  3 95  1

1  2 260008   2188    144   6824 11824 2584 12664  2584 1347 1174 14  0  0 86  0

2  1 262140   2964    128   5852 24912 17304 24952 17304 4737 2341 86 10  0  0  4

swpd,已使用的 SWAP 空间大小,KB 为单位;
free,可用的物理内存大小,KB 为单位;
buff,物理内存用来缓存读写操作的 buffer 大小,KB 为单位;
cache,物理内存用来缓存进程地址空间的 cache 大小,KB      为单位;
si,数据从 SWAP 读取到 RAM(swap in)的大小,KB 为单位;
so,数据从 RAM 写到 SWAP(swap out)的大小,KB 为单位;
bi,磁盘块从文件系统或 SWAP 读取到 RAM(blocks in)的大小,block 为单位;
bo,磁盘块从 RAM 写到文件系统或 SWAP(blocks out)的大小,block 为单位;
上面是一个频繁读写交换区的例子,可以观察到以下几点:

1、物理可用内存 free      基本没什么显著变化,swapd 逐步增加,说明最小可用的内存始终保持在 256MB X 10% =2.56MB 左右,当脏页达到10%的时候(vm.dirty_background_ratio = 10)就开始大量使用 swap;
2、buff 稳步减少说明系统知道内存不够了,kwapd 正在从      buff 那里借用部分内存;
3、kswapd 持续把脏页面写到 swap 交换区(so),并且从 swapd 逐渐增加看出确实如此。根据上面讲的 。kswapd 扫描时检查的三件事,如果页面被修改了,但不是被文件系统修改的,把页面写到 swap,所以这里 swapd 持续增加。

原文地址:user.qzone.qq.com/812120608/blog/1293595397