为什么这个过程会以4GB的速度被杀?

时间:2012-01-01 18:08:46

标签: linux process 64-bit

我编写了一个可以处理大量数据的程序。我的CPU和操作系统(Ubuntu)都是64位,我有4GB的RAM。使用“top”(%Mem字段),我看到进程的内存消耗上升到大约87%,即3.4+ GB然后就被杀了。

然后,我使用“uname -m”检查进程可以访问多少内存,这是“无限制”。

现在,由于操作系统和CPU都是64位且存在交换分区,因此操作系统应该使用虚拟内存,即[交换空间中的大约3.4GB + yGB]并且仅在需要的过程中使用更多的记忆,应该被杀死。

所以,我有以下问题:

  1. 理论上,64位m / c上的进程可以访问多少物理内存。我的回答是2 ^ 48字节。
  2. 如果存在少于2 ^ 48个字节的物理内存,那么OS应该使用虚拟内存,对吗?
  3. 如果上述问题的答案是肯定的,那么操作系统也应该使用SWAP空间,为什么即使使用它也不会杀死进程。我不认为我们必须使用一些特定的系统调用来编写我们的程序来实现这一点。
  4. 请建议。

3 个答案:

答案 0 :(得分:2)

不仅数据大小可能是原因。例如,执行ulimit -a并检查最大堆栈大小。你有杀人的理由吗?设置'ulimit -c 20000'以获取核心文件,它会显示您使用gdb检查它的原因。

答案 1 :(得分:1)

请与fileldd核实您的可执行文件确实是64位。

还检查资源限制。在流程内部,您可以使用getrlimit系统调用(并在可能的情况下使用setrlimit进行更改)。从bash shell中,尝试ulimit -a。从zsh shell尝试limit

还要检查您的进程确实会占用您认为它消耗的内存。如果它的pid是1234,你可以尝试pmap 1234。在流程内部,您可以阅读/proc/self/maps/proc/1234/maps(您可以从终端中读取)。您/proc/self/smaps内还有/proc/1234/smaps/proc/self/status以及/proc/1234/status/proc/self/以及其他文件......

检查free您是否获得了您认为的内存(和交换空间)。您可以使用swapon /tmp/someswapfile添加一些临时交换空间(并使用mkswap对其进行初始化)。

我几个月(几年前)经常能够在一台机器上运行一个7Gb进程(一个巨大的cc1编译),在Gnu / Linux / Debian / Sid / AMD64下运行使用8Gb RAM。

你可以试试一个很小的测试程序,例如用malloc分配几个内存块,例如每个32Mb。不要忘记在里面写一些字节(至少每兆字节)。

传闻标准C ++容器如std::mapstd::vector消耗的内存比我们通常认为的要多。

如果需要,购买更多内存。这些天很便宜。

答案 2 :(得分:0)

在字面意义上可以解决的问题包括你的图形适配器,操作系统内核,BIOS等,并且SWAP也无法扩展可以解决的数量。

另外值得注意的是,进程本身也需要64位。并且某些操作系统可能会变得不稳定,因此如果您使用过多的RAM,则会终止该过程。