我正在32位Ubuntu 10 PAE内核机器上运行Java数据导入过程。 在运行了一段时间之后,这个杀手锏就是我的Java进程。 经过一些谷歌search和挖掘文档,看起来系统正在耗尽LowMem。 我第三次开始了这个过程,并且正在看我free -lm向我展示Low: 464 386 77 ,自由价值(77MB)缓慢下降。
为什么我耗尽了lowmem,我该如何增加呢?
一些细节:
$ cat / proc / sys / vm / lowmem_reserve_ratio
256 256 32
$ free -lm
caching总共使用的空闲共享缓冲区
Mem:32086 24611 7475 0 0 24012
低:464 407 57
高:31621 24204 7417
- / + buffers / cache:598 31487
交换:2047 0 2047
问题在于很多内核数据结构,如页面描述符(系统中每4KB页面一个结构)需要在低内存中。 所以随着机器内存的增加,内存也越来越less,最终内存变得非常稀less。
IIRC通常的经验法则是,16 GB的总数大约是32位内核的上限。 你可以做的事情不多。
您可以尝试使用较less的内存启动(mem =内核的命令行参数)。 但真正的解决scheme是切换到64位内核。
禁用杀手,看看最终的结果是什么。 同时发布进程内存使用情况的信息(如适用)。 看看pmap的输出,以帮助解密。 我在RHEL5 64位下运行了非常大的Java堆,从来没有见过这个问题。
那么,我不确定我是否正确,低内存的大小是内核的参数之一。 我认为,由于PAE,一个进程不能超过低内存的大小,但请检查http://www.makelinux.net/ldd3/chp-15-sect-1.shtml
在这方面内存的pipe理在Linux上是相当糟糕的。 它将采取第一个4G的内存和3/1分割他们。 1GB是LowMem。 在系统上拥有32GB内存的情况下,这个1GB的实质部分已经需要用于寻址目的。 在2.4天的讨论中,为了使这个限制可以configuration,或者整合4G / 4G补丁,尽pipe没有发生这种事情,因为Linus没有看到任何这方面的需求。已经很丑陋了,更不用说4G / 4G也不怎么样了。 2.6的时候还有4g的补丁,但是原来是2.6.6的,现在已经过时了。 2.6.7很明显,它永远不会被合并,无论如何,它的性能开销是巨大的,所以做出了决定,虚拟机系统已经足够好了。 所以在32位上可能没有办法解决这个问题,因为内存系统根本不是为了扩展到这样大的内存。
另一方面,在64位上寻址已经发生了很大的变化,所以你不会在这里find这个问题。