叉()与内存不足错误失败

问题描述 投票:8回答:2

父进程失败时它会尝试fork一个孩子错误号= 12(在对存储器)。父进程在Linux内核3.0运行 - SLES 11在分叉孩子的角度来看,父进程已经使用了70%左右的RAM(180GB / 256GB)的。是否有此问题的任何解决方法吗?

该应用程序是用C ++编写,使用g ++ 4.6.3编译。

linux fork virtual-memory memory-overcommitment
2个回答
12
投票

也许虚拟内存在提交时,防止您的系统。

如果它被阻止,那么虚拟存储器不能超过的sizeof物理RAM +交换更大。如果它被允许,则虚拟存储器可以比RAM +交换更大。

当你的进程叉,你的流程(父母和孩子)将有2 * 180GB的虚拟内存(这是太多,如果你没有交换)。

因此,允许在通过这种方式提交:

 echo 1 > /proc/sys/vm/overcommit_memory

它应该帮助,如果子进程立即execves,或父写太多自己的内存释放之前分配的内存。所以,要小心,出内存杀手,如果两个进程继续使用所有的内存可能采取行动。

PROC的手册页(5)表示:

的/ proc / sys目录/ VM / overcommit_memory

该文件包含内核虚拟内存会计模式。值是0:启发式过量使用(这是默认值)1:总是过量使用,从来不检查2:经常检查,从不过量使用

在模式0,MMAP(2)MAP_NORESERVE的呼叫不被选中,默认检查非常薄弱,导致得到一个过程“OOM杀死”的风险。在Linux下2.4任何非零值意味着模式1在模式2(购自Linux的2.6),在系统上的总的虚拟地址空间是有限的,以(SS + RAM *(R / 100)),其中SS是的大小交换空间,和RAM是物理内存的大小,r是文件/ proc / SYS / VM / overcommit_ratio的内容。

点击此处了解详情:Overcommit Memory in SLES


1
投票

fork-ING需要的资源,因为它是过程的copy-on-writing可写的页面。再次阅读fork(2)手册页。

你至少可以提供一个巨大的临时交换文件。您可以创建(上有足够的空间某些文件系统),一个巨大的文件$SWAPFILE

  dd if=/dev/zero of=$SWAPFILE bs=1M count=256000
  mkswap $SWAPFILE
  swapon $SWAPFILE

否则,你可能例如设计程序有所不同,例如mmap-ING一些大文件(只叉前munmap-ING它,后再次mmap-ING它),或只是开始更多的在你的程序的开头popen-ED壳,或p2open-ED的一个或制作明确了pipe-S,并从它(可能是一个叫复点菜poll也将是有益的),后来又对其发出命令。

也许我们可以帮助更多的,如果我们有一个什么样的计划是做一个想法,为什么它消耗这么多的内存,为什么又是什么呢分叉...

阅读Advanced Linux Programming更多。

PS.

如果你只是fork运行gdb显示回溯,可以考虑像recent GCC's libbacktraceWolf's libbacktrace更简单的方法...

© www.soinside.com 2019 - 2024. All rights reserved.