![使用 Ubuntu PAE 内核和 32GB RAM 时 LowMem 耗尽](https://linux22.com/image/534346/%E4%BD%BF%E7%94%A8%20Ubuntu%20PAE%20%E5%86%85%E6%A0%B8%E5%92%8C%2032GB%20RAM%20%E6%97%B6%20LowMem%20%E8%80%97%E5%B0%BD.png)
我在一台 32 位 Ubuntu 10 PAE 内核机器上运行 Java 数据导入进程。运行该进程一段时间后,oom-killer 会终止我的 Java 进程。在谷歌搜索和查阅文档后,似乎系统的 LowMem 即将耗尽。我第三次启动该进程,看到free -lm
可用Low: 464 386 77
值(77MB)正在缓慢减少。
为什么我的低内存耗尽了?如何增加它?
一些细节:
$ cat /proc/sys/vm/lowmem_reserve_ratio 256256 32 $ 免费-lm 已使用的、可用的、缓存的共享缓冲区总数 内存:32086 24611 7475 0 0 24012 低:464 407 57 最高:31621 24204 7417 -/+ 缓冲区/缓存:598 31487 交换:2047 0 2047
答案1
问题在于,很多内核数据结构(例如页面描述符,系统中每个 4KB 页面对应一个结构)需要位于低内存中。因此,随着机器的总内存增加,需要的低内存也越来越多,最终低内存将成为非常稀缺的资源。
据我所知,通常的经验法则是,16 GB 总计大约是 32 位内核的合理上限。对此你无能为力。
您可以尝试使用较少的内存启动(mem=内核的命令行参数)。但真正的解决方案是切换到 64 位内核。
答案2
禁用 oom killer 并查看最终结果。还应发布进程内存使用情况的信息(如适用)。查看 pmap 输出也有助于解读。我在 RHEL5 64 位下运行过非常大的 Java 堆,但从未见过此问题。
答案3
嗯,我不确定我是否正确,低内存的大小是内核的一个参数。我认为由于 PAE,一个进程不能超过低内存的大小,但检查一下http://www.makelinux.net/ldd3/chp-15-sect-1.shtml
答案4
Linux 在这方面的内存管理相当糟糕。它会占用前 4G 内存,然后将其 3/1 分割。1GB 为 LowMem。系统内存为 32GB 时,它已经需要这 1GB 的很大一部分用于寻址目的。在 2.4 期间,曾讨论过要花一些精力来使此限制可配置,或集成 4G/4G 补丁,但这些都没有发生,因为 Linus 认为这没有任何必要,而且情况已经很糟糕了,更不用说 4G/4G 也不太好。2.6 仍然有一个 4g 补丁,但它最初是为 2.6.6 编写的,现在已经过时了。到 2.6.7 时,很明显它永远不会被合并,它的性能开销本来就很大,所以决定 VM 系统已经足够好了。因此,在 32 位上可能无法解决这个问题,因为内存系统根本无法扩展到如此大的内存量。
另一方面,在 64 位上,寻址已经发生了很大变化,因此你不会发现这个问题。