minfree 和 maxfree 参数的值

使用空闲列表的目的是保持跟踪进程终止释放的实内存的页帧,向请求者立即提供页帧,而不是等待窃取和与之相连的 I/O 的结束。

minfree 限制了空闲列表的容量,低于该数值时必须开始窃取页充入空闲列表。 当超过 maxfree 参数值大小时,就会结束窃取,minfree 值用来启动页面窃取。 当永久页面数小于或等于 maxfree 参数值与 minfree 参数值之间的差值时,或者当客户机页面数小于或等于 maxclient 参数值与 minfree 参数值之间的差值时,就会开始页面窃取。

调整这些限制的目的是为了确保:

  • 任何有紧急响应时间的目标总是能从空闲列表中得到它所需要的页帧。
  • 系统不要经历不必要的高等级的输入输出,因为早就发生的页窃取扩大的空闲列表。

minfreemaxfree 参数的缺省值取决于机器的内存大小。 如果您正在使用 JFS,那么 maxfreeminfree 参数之间的差值应该总是等于或大于 maxpgahead 参数的值。 对于增强型 JFS,maxfreeminfree 参数之间的差值应该总是等于或大于 j2_maxPageReadAhead 参数的值。 如果您正在使用 JFS 和增强型 JFS,那么应该将 minfree 参数的值设置成一个大于或等于两个文件系统中较大 pageahead 值的数字。

如果存在多个内存池,那么 minfreemaxfree 参数值会有所不同。 引入内存池的概念是为了有大量 RAM 的 MP 系统。 每个内存池都有其自己的 minfreemaxfree 值。 在较早的 AIX 版本中, vmo 命令显示的 minfreemaxfree 值是所有内存池的 minfreemaxfree 值的总和。 vmo 命令显示的值基于每个内存池。

一个不够精确但更为全面的检测适当的 minfree 大小的工具是 vmstat 命令。 以下是正在其中达到 minfree 值的系统上 vmstat 命令输出的一部分:

# vmstat 1
kthr     memory             page              faults        cpu
----- ----------- ------------------------ ------------ -----------
 r  b   avm   fre  re  pi  po  fr   sr  cy  in   sy  cs   us sy id wa
 2  0 70668   414   0   0   0   0    0   0 178 7364  257  35 14  0 51
 1  0 70669   755   0   0   0   0    0   0 196 19119 272  40 20  0 41
 1  0 70704   707   0   0   0   0    0   0 190 8506  272  37  8  0 55
 1  0 70670   725   0   0   0   0    0   0 205 8821  313  41 10  0 49
 6  4 73362   123   0   5  36 313 1646   0 361 16256 863  47 53  0  0
 5  3 73547   126   0   6  26 152  614   0 324 18243 1248 39 61  0  0
 4  4 73591   124   0   3  11  90  372   0 307 19741 1287 39 61  0  0
 6  4 73540   127   0   4  30 122  358   0 340 20097 970  44 56  0  0
 8  3 73825   116   0  18  22 220  781   0 324 16012 934  51 49  0  0
 8  4 74309    26   0  45  62 291 1079   0 352 14674 972  44 56  0  0
 2  9 75322     0   0  41  87 283  943   0 403 16950 1071 44 56  0  0
 5  7 75020    74   0  23 119 410 1611   0 353 15908 854  49 51  0  0

在上述示例输出中可以看到经常都会达到 120 的 minfree 值。 因此,页面替换就会发生,并且在这种特殊情况下,空闲列表在某个时刻甚至将达到 0。 一旦发生这种情况,需要空闲帧的线程就会阻塞而无法运行,直到页面替换释放一些页面为止。 要阻止这种情况发生,可以考虑增加 minfreemaxfree 的值。

如果断定每个内存池应该始终至少有 1000 页是空闲的,请运行以下命令:
# vmo -o minfree=1000 -o maxfree=1008
要使其成为永久更改,须包括 -p 标志:
# vmo -o minfree=1000 -o maxfree=1008 -p
minfree 参数的缺省值增加到每个内存池 960 页,maxfree 参数的缺省值增加到每个内存池 1088 页。