vmtune命令调整VM页面替换
讨论在实时内存管理,内存管理算法,试图保持空间列表的大小和指定范围内的持久段页面所占用的实际内存的百分比。这些边界可以被只能被超级用户运行的vmtune命令改变,这个工具所做的更改仍然有效,直到下次重新启动系统。确定是否vmtune命令安装和可用,运行以下命令:
# lslpp –lI bos.adt.samples
注: vmtune命令的样本目录,是因为它是非常依赖VMM的实施。
每一个版本的操作系统vmtune代码,是专门针对该版本的VMM。在不同版本上运行vmtune命令,可能会导致操作系统错误。不同版本之间的vmtune命令的功能可能不同。不要传播SHELL脚本或/etc/inittab条目,以确保该脚本仍会有预期的效果。在AIX 4.3.3执行没有选项的vmtune命令,输出结果如下:
# /usr/samples/kernel/vmtune vmtune: current values: -p -P -r -R -f -F -N -W minperm maxperm minpgahead maxpgahead minfree maxfree pd_npages maxrandwrt 52190 208760 2 8 120 128 524288 0 -M -w -k -c -b -B -u -l -d maxpin npswarn npskill numclust numfsbufs hd_pbuf_cnt lvm_bufcnt lrubucket defps 209581 4096 1024 1 93 96 9 131072 1 -s -n -S -h sync_release_ilock nokillroot v_pinshm strict_maxperm 0 0 0 0 number of valid memory pages = 261976 maxperm=79.7% of real memory maximum pinable=80.0% of real memory minperm=19.9% of real memory number of file memory pages = 19772 numperm=7.5% of real memory
输出显示当前所有参数的设置。
选择minfree和maxfree的设置
实时终止进程释放内存页面帧的空闲列表的目的是为了保持跟踪,并立即向请求者提供页帧,而不强迫他们等待页面抢断和所附的I / O完成。
调整这些限制的目的是要确保:
关键响应时间目标的任何活动,总是可以得到的页面帧,它需要从空闲列表。Minfree和maxfree默认值依赖于机器的内存。Maxfree的默认值通过以下公式确定:
maxfree = minimum (# of memory pages/128, 128)
默认情况下,minfree的值是maxfree的价值 - 8。然而,minfree和maxfree之间的差异,应该始终等于或大于maxpgahead更大。或者换句话说,maxfree的价值应该总是大于或等于minfree加maxpgahead的大小。如果有不止一个内存池,那么minfree/maxfree的值将会不同。在AIX 4.3.3中引入了大量的RAM MP系统内存池。每个内存池都将有其自己的minfree/ maxfree的,这是由以前的公式确定,但一下minfree/ maxfree的显示值由vmtune命令将所有的内存池的minfree/ maxfree的总和。
请记住,minfree的网页,在某种意义上说是一种浪费,因为它们是可用的,但没在使用。如果你要使一个短小的程序运行的更快,你可以使用svmon命令查询你的内存(看看有多少内存正被使用),并设置minfree的最大值。这种技术肯能过于保守,因为并不是所有的页面… …同时,你可能会丢失来自程序而不是你的列表的动态需求,可能会降低您的关键程序运行时的空闲列表的平均大小。
一个不太精确但更全面的调查minfree的适当规模的工具是vmstat命令。以下是在一个空闲的系统上运行一个C编译的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 0 0 3085 118 0 0 0 0 0 0 115 2 19 0 0 99 0 0 0 3086 117 0 0 0 0 0 0 119 134 24 1 3 96 0 2 0 3141 55 2 0 6 24 98 0 175 223 60 3 9 54 34 0 1 3254 57 0 0 6 176 814 0 205 219 110 22 14 0 64 0 1 3342 59 0 0 42 104 249 0 163 314 57 43 16 0 42 1 0 3411 78 0 0 49 104 169 0 176 306 51 30 15 0 55 1 0 3528 160 1 0 10 216 487 0 143 387 54 50 22 0 27 1 0 3627 94 0 0 0 72 160 0 148 292 79 57 9 0 34 1 0 3444 327 0 0 0 64 102 0 132 150 41 82 8 0 11 1 0 3505 251 0 0 0 0 0 0 128 189 50 79 11 0 11 1 0 3550 206 0 0 0 0 0 0 124 150 22 94 6 0 0 1 0 3576 180 0 0 0 0 0 0 121 145 30 96 4 0 0 0 1 3654 100 0 0 0 0 0 0 124 145 28 91 8 0 1 1 0 3586 208 0 0 0 40 68 0 123 139 24 91 9 0 0
因为编译器目前还没有运行,所以编译器本身的代码必须被读入。总之,编译器在6秒内编译2M,在这个32M的系统中,maxfree是64M,minfree是56M。编译器几乎马上驱动低于minfree空闲列表的大小,几秒后就会发生页面盗取活动。一些盗页要求脏工作段页写到空闲页面。如果盗页引起脏永久段的写操作,I/O没有出现在vmstat的报告中。
这个例子说明一个fork()和exec()环境(不是一个进程长期生存的环境,就像在数据库中),也不打算建议你设置minfree为500以适应大量的编译。本例说明如何使用VMSTAT命令鉴别当程序等待空闲空间时,空闲列表必须被补充的情况。在这种情况下,编译器的执行时间大约为两秒,因为没有足够可用的页框。如果你在正常处理期间或者初始化期间观察你的程序的页框的使用,你很快就会了解在空闲列表中需要多少页框以满足继续等待内存的程序。
如果我们从上面的例子中得出这样的结论:minfree需要被设置成128,我们设置maxpgahead=16以提高连续的性能,我们应该使用如下的VMSTAT命令:
# /usr/samples/kernel/vmtune -f 128 -F 144
调整内存池
在比AIX 4.3.3更新的版本的操作系统中,命令vmtune -mnumber_of_memory_pools 允许你
在系统启动时改变内存池号。-m标志不能动态变化。如果是MP内核,此改变将会被写入内核文件。内存池的默认号恢复至0.
默认情况下,命令vmtune –m写入到文件/usr/lib/boot/unix_mp中,但是这种情况可以被命令vmtune -U path_to_unix_file 改变,在改变内核文件之前,命令vmtune以name_of_original_file.sav.形式保存源文件。
调整lrubucket以减少内存扫描开销
在大内存系统中,调整lrubucket可以减少内存扫描开销。在AIX 4.3.3版本中,增加了一个新的参数:lrubucke。页面替换算法扫描内存框以寻找空页框。这个扫描过程中,页面的参考位复位,如果一直没有找到一个空闲页面,则进行第二次扫描。在第二次扫描,如果仍然是关闭的参考位,帧将被用于一个新的页面。
在一个拥有大内存的系统中,有太多的帧需要被扫描,所以现在内存被划分成帧桶,页面替换算法将桶中的帧扫描,然后在移动到下一个帧桶之前开始第二次扫描。在这个桶中的默认号码是131072或者是512M RAM。帧的数量是可调的,你可以使用vmtune –l命令。帧数在4K以内。
选择minperm和maxperm设置
操作系统通过将被读或写过的文件叶留在内存中的方式充分利用对于实际内存不同的要求。
如果该文件的页面再次请求重新分配页帧之前,这项技术节省了一次I / O操作。这些文件页面可能来自本地的或者远程的文件系统。用于这些文件与用于计算(工作或程序文本)段的页面帧的比例是被minperm和maxperm的值松散的控制着。
如果被占用的文件页的内存比例上升到maxperm的值,页面替换只替换文件页。
如果内存中文件页所占有的比例在参数minperm和maxperm之间,页面置换仅仅置换文件页,除非文件repages(file repages)的数量高于计算repages的数量。在一个特定的工作负载,它可能是值得文件I/O的避免。在另一个工作负载,计算段的页面保存在内存,可能更重要。了解有多大比例处于未调整状态,可以使用不带参数的vmtune命令。
# /usr/samples/kernel/vmtune vmtune: current values: -p -P -r -R -f -F -N -W minperm maxperm minpgahead maxpgahead minfree maxfree pd_npages maxrandwrt 52190 208760 2 8 120 128 524288 0 -M -w -k -c -b -B -u -l -d maxpin npswarn npskill numclust numfsbufs hd_pbuf_cnt lvm_bufcnt lrubucket defps 209581 4096 1024 1 93 96 9 131072 1 -s -n -S -h sync_release_ilock nokillroot v_pinshm strict_maxperm 0 0 0 0 number of valid memory pages = 261976 maxperm=79.7% of real memory maximum pinable=80.0% of real memory minperm=19.9% of real memory number of file memory pages = 19772 numperm=7.5% of real memory
默认值是由以下算法计算得来的:
minperm (in pages) = ((number of memory frames) - 1024) * .2 maxperm (in pages) = ((number of memory frames) - 1024) * .8
Numperm的值显示了内存中文件页的数量,19772,是真实内存的7.5%。
如果我们知道我们的工作量,使得最近读取或写入的文件很少使用,我们可能要限制用于此目的的内存量。
# /usr/samples/kernel/vmtune -p 15 -P 50
设置minperm的值为真实内存的15%,maxperm的值为真实内存的50%。这样将确保当文件页的比例超过总内存的50%时,VMM仅从文件页中盗取页框。这将在对永久存储不产生不利影响的情况下,减少分页页面空间。Maxperm的值不是一个严格的限制,它仅在VMM需要执行页面替换时才考虑。因此,在大多数系统上减少maxperm的值是安全的。另一方面,如果我们的应用程序频繁的参考一小部分的现有文件(尤其是如果这些文件存在于NFS-mounted文件系统),我们可能希望通过使用如下的命令允许为文件页的本地缓存预留更多的空间:
# /usr/samples/kernel/vmtune -p 30 -P 90
拥有大内存,主要用于读取工作的NFS服务器,可以从增大maxperm的值中获益。这样,允许更多的页面驻留在内存中,以至于NFS客户端可以在不强制NFS服务器再次从磁盘检索页面的情况下访问它们。
另一个例子是一个程序,此程序将一个1.5G的顺序文件数据读入到一个拥有2G真是内存的工作存储中。你可能希望将maxperm的值设置成50%或者更少,因为你不需要将文件数据保存在内存中。
使用strict_maxperm在永久文件缓存中配置一个硬性的限制
从AIX 4.3.3开始,增加了一个新的名为stric_maxperm的vmtune选项。这个选项,当将它设置为1时,通过设置maxperm的值为文件缓存的上限,来设置一个关于多少内存用于持久文件缓存。当达到上限时,LRU算法将在持久页面上执行。