linux
分类: LINUX
2012-03-13 10:16:03
PFRA 就是OS 内核用来回收并释放内存空间的算法.PFRA 选择哪个内存页被释放是基于内存页类型的.页类型有以下几种:
Unreclaimable –锁定的,内核保留的页面
Swappable –匿名的内存页
Syncable –通过硬盘文件备份的内存页
Discardable –静态页和被丢弃的页
除了第一种(Unreclaimable)之外其余的都可以被PFRA进行回收.
与PFRA 相关的,还包括kswapd 内核线程以及Low On Memory Reclaiming(LMR算法) 这2种进程和实现.
kswapd 进程负责确保内存空间总是在被释放中.它监控内核中的pages_high和pages_low阀值.如果空闲内存的数值低于 pages_low,则每次 kswapd 进程启动扫描并尝试释放32个free pages.并一直重复这个过程,直到空闲内存的数值高于 pages_high.
kswapd 进程完成以下几个操作:
如果该页处于未修改状态,则将该页放置回空闲列表中。
如果该页处于已修改状态并可备份回文件系统,则将页内容写入到磁盘。
如果该页处于已修改状态但没有任何磁盘备份,则将页内容写入到swap device。
pdflush 进程负责将内存中的内容和文件系统进行同步操作.也就是说,当一个文件在内存中进行修改后, pdflush 将负责写回到磁盘上.
# ps -ef | grep pdflush root 28 3 0 23:01 ? 00:00:00 [pdflush] root 29 3 0 23:01 ? 00:00:00 [pdflush]
当内存中存在10% 的脏页,pdflush 将被启动同步脏页回文件系统里.这个参数值可以通过 vm.dirty_background_ratio 来进行调整.
注意 | |
---|---|
Q:什么是脏页? A:由于内存中页缓存的缓存作用,写操作实际上都是延迟的.当页缓存中的数据比磁盘存储的数据还要更新时,那么该数据就被称做脏页.) |
# sysctl -n vm.dirty_background_ratio 10
在多数环境下,Pdflush与PFRA是独立运行的,当内核调用LMR时,LMR 就触发pdflush将脏页写入到磁盘里.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 在2.4 内核下,一个高负荷的内存环境中,系统将遇到交换过程中不断的崩溃.这是因为PFRA 从一个运行进程中,偷取其中一个内存页并尝试使用.导致结果就是,这个进程如果要回收那个页时,要是没有就会尝试再去偷取这个页,这样一来,就越来越糟糕了.在2.6 内核下,使用”Swap token”修复了这个BUG,用来防止PFRA 不断从一个进程获取同一个页.
vmstat 工具报告里除了CPU 使用情况,还包括了虚拟内存.以下就是vmstat 输出中关于虚拟内存的部分:
Field | Description |
---|---|
Swapd | The amount of virtual memory in KB currently in use. As free memory reaches low thresholds, more data is paged to the swap device. 当前虚拟内存使用的总额(单位:KB).空闲内存达到最低的阀值时,更多的数据被转换成页到交换设备中. |
Free | The amount of physical RAM in kilobytes currently available to running applications. 当前内存中可用空间字节数. |
Buff | The amount of physical memory in kilobytes in the buffer cache as a result of read() and write() operations. 当前内存中用于read()和write()操作的缓冲区中缓存字节数 |
Cache | The amount of physical memory in kilobytes mapped into process address space. 当前内存中映射到进程地址空间字节数 |
So | The amount of data in kilobytes written to the swap disk. 写入交换空间的字节数总额 |
Si | The amount of data in kilobytes written from the swap disk back into RAM. 从交换空间写回内存的字节数总额 |
Bo | The amount of disk blocks paged out from the RAM to the filesystem or swap device. 磁盘块页面从内存到文件或交换设备的总额 |
Bi | The amount of disk blocks paged into RAM from the filesystem or swap device. 磁盘块页面从文件或交换设备到内存的总额 |
以下 vmstat 的输出结果,就是演示一个在I/O 应用中,虚拟内存在高负荷情况下的环境
# vmstat 3 procs memory swap io system cpu r b swpd free buff cache si so bi bo in cs us sy id wa 3 2 809192 261556 79760 886880 416 0 8244 751 426 863 17 3 6 75 0 3 809188 194916 79820 952900 307 0 21745 1005 1189 2590 34 6 12 48 0 3 809188 162212 79840 988920 95 0 12107 0 1801 2633 2 2 3 94 1 3 809268 88756 79924 1061424 260 28 18377 113 1142 1694 3 5 3 88 1 2 826284 17608 71240 1144180 100 6140 25839 16380 1528 1179 19 9 12 61 2 1 854780 17688 34140 1208980 1 9535 25557 30967 1764 2238 43 13 16 28 0 8 867528 17588 32332 1226392 31 4384 16524 27808 1490 1634 41 10 7 43 4 2 877372 17596 32372 1227532 213 3281 10912 3337 678 932 33 7 3 57 1 2 885980 17800 32408 1239160 204 2892 12347 12681 1033 982 40 12 2 46 5 2 900472 17980 32440 1253884 24 4851 17521 4856 934 1730 48 12 13 26 1 1 904404 17620 32492 1258928 15 1316 7647 15804 919 978 49 9 17 25 4 1 911192 17944 32540 1266724 37 2263 12907 3547 834 1421 47 14 20 20 1 1 919292 17876 31824 1275832 1 2745 16327 2747 617 1421 52 11 23 14 5 0 925216 17812 25008 1289320 12 1975 12760 3181 772 1254 50 10 21 19 0 5 932860 17736 21760 1300280 8 2556 15469 3873 825 1258 49 13 24 15
根据观察值,我们可以得到以下结论:
大量的disk pages(bi)被写入内存,很明显在进程地址空间里,数据缓存(cache)也在不断的增长.
在这个时间点上,空闲内存(free) 始终保持在17MB,即使数据从硬盘读入而在消耗RAM.
为了维护空闲列表, kswapd 从读/写缓存区(buff)中获取内存并分配到空闲列表里.很明显可以看到buffer cache(buff) 在逐渐的减少中.
同时kswapd 进程不断的写脏页到swap device(so)时,很明显虚拟内存的利用率是在逐渐的增加中(swpd).