虚拟空间超额使用量的调整
只存在一个进程时,即使不知道该进程的最大内存使用量,也可以使用已有的进程单位的资源限制功能对内存使用量进行充分限制。实际安装的内存为10GB时,可以使用ulimiti命令将该进程的最大虚拟空间大小设置为10GB。考虑到应用程序与虚拟空间大小相比要使用多少物理内存,也可以设置比10GB更大的虚拟空间大小(在Linux中未安装进程的物理内存驻留大小限制功能,因此无法使用。)
但是,考虑到多个进程互相争夺内存的情况,就需要限制整个系统的虚拟空间量。如上所述,即使无限度地向进程分配虚拟空间,只要不实际使用也就没问题。分配给进程的虚拟空间的大小与本质上实际安装的物理量无关。但是,从系统的稳定性来看,分配的虚拟空间大小应该保证达到物理内存的量。将没有物理内存保证的虚拟空间进行大量分配,并实际访问时,如果同时分配大量的物理页面,系统就会崩溃。
在Linux中有规定“允许超过物理内存量分配多少虚拟空间”的参数,通过下列两个/proc入口来进行控制。
·/proc/sys/vm/overcommit_memory
·/proc/sys/vm/overcommit_ratio
/proc/sys/vm/overcommit_memory是控制虚拟空间分配的策略的参数,可以设置下列3种值。
·OVERCOMMIT_GUESS(0)
·OVERCOMMIT_ALWAYS(1)
·OVERCOMMIT_NEVER(2)
默认为OVERCOMMIT_GUESS。
cat/proc/sys/vm/overcommit_memory
0
设置为OVERCOMMIT_NEVER时,执行下列命令。
echo 2>/proc/sys/vm/overcommit_memory
可以在/proc/sys/vm/overcommit_ratio中指定允许过量使用的虚拟空间所占物理内存总量的百分比。默认为50%。可以分配的最大虚拟空间为总物理内存量的150%。下面介绍overcommit_memory的不同取值对应的不同虚拟空间分配。
OVERCOMMIT_GUESS
overcommit_memory的默认值为OVERCOMMIT_GUESS。指定这个参数时,预测将空闲内存、页面缓存量、空闲交换区量、可回收slab(长字节)量等回收的页面数,虚拟空间要求分配的量比这个数小时,分配成功。
(请注意,在多个进程同时要求大量的虚拟空间时是无法正确预测的。下面所述的OVERCOMMIT_NEVER中就没有这种问题。)
在OVERCOMMIT_GUESS的情况下,可分配的虚拟空间大小基本就是物理内存大小和交换区大小的合计值。物理内存为2GB,交换区为2GB,当前消耗1GB时,还可以分配约3GB的虚拟空间。
OVERCOMMIT_ALWAYS
在OVERCOMMIT_ALWAYS的情况下,虚拟空间分配总是成功。即使对于过大的虚拟空间要求,也会分配虚拟空间。可以在与实际安装的物理内存量完全无关的形态下使用虚拟空间,如前面所述的散列表等。
OVERCOMMIT_NEVER
在OVERCOMMIT_NEVER的情况下,对可分配虚拟空间量的管理更加严格。
首先,记录下整个系统内已分配的虚拟空间量。这个值严格由系统进行集中管理,在分配或释放虚拟空间时重新计算。这个值为/proc/meminfo的Committed_AS。
对于虚拟空间大小的计算也比其他参数严格。例如,在OVERCOMMIT_GUESS的情况下,对mmap系统调用设置了MAP_NORESERVE的虚拟空间量不添加到Committed_AS中。但是,在OVERCOMMIT_NEVER的情况下会添加到Committed_AS中。指定了MAP_NORESERVE的区域也作为可能分配物理内存的虚拟空间处理。
将“所有物理内存量+总交换区量”加上通过/proc/sys/vm/overcommit_ratio指定的比例得到的值,作为可分配的虚拟空间总量。这个值可以使用/proc/meminfo的CommitLimit查看。CommitLimit的值仅在利用OVERCOMMIT_NEVER时有效。在OVERCOMMIT_GUESS、OVERCOMMIT_ALWAYS的情况下,这个项目没有意义。
要求分配虚拟空间时,如果“整个系统中已经分配(Committed_AS)”的虚拟空间量超过“可分配虚拟空间量(CommitLimit)”,则分配失败。