使用mlockall设置用完ram后会发生什么?

时间:2009-07-27 21:01:20

标签: c++ memory

我正在开发一个C ++应用程序,它需要大量内存才能进行批处理运行。 (> 20gb)

我的一些客户遇到内存限制,有时操作系统开始交换,总运行时间增加一倍或更差。

我已经读过,我可以使用mlockall来防止进程被换出。当进程内存需求以这种方式接近或超过可用物理内存时会发生什么?

我想答案可能是特定于操作系统的,所以请在答案中列出操作系统。

3 个答案:

答案 0 :(得分:2)

正是您所看到的 - 未能分配更多内存,因为您的应用程序已获得系统中的所有物理内存,并且由于这些内存无法换出,因此malloc无需执行任何操作但失败。在大多数现代操作系统中,此行为都是相同的。

如果你想使用mlockall(你真的不应该),你最好确保系统具有所需的物理内存量,否则你将陷入痛苦的世界 - malloc也会因其他进程而失败这些可能会使您的系统崩溃。

答案 1 :(得分:0)

我在Linux上试过这个。在我超过“ulimit -l”(最大锁定页面)后,malloc失败。

这是测试脚本:

#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv){
  int r = 0;
  int count = 0;
  char *buf;

  printf("Locking...\n");
  r = mlockall(MCL_FUTURE);
  if(r){
    printf("Error: %d\n", r);
    exit(1);
  }

  while(1){
    buf = malloc(1000);
    if(!buf){
      printf("Failed to allocate after %d iterations\n", count);
      exit(0);
    }
    count++;
  }

  return 0;
}

(我提到我不是C程序员吗?)

文档说这种行为是“依赖于实现的”。因此,您可能需要测试自己的实现,看看会发生什么。我通过su到root来运行我的脚本,将锁定的页面ulimit设置为10000,从该shell获取普通用户,然后运行脚本。我在malloc失败之前做了10057次分配;还有很多没有mlockall电话的人。

答案 2 :(得分:0)

在这种情况下会发生的是您的系统资源超出了您的要求。您需要重新设计系统,以便减少内存。

为什么需要20GB的RAM?这很不寻常。我有一些这么大的工作。您通常可以将它们分解为许多较小的作业,并在多台计算机上按顺序或同时运行它们。

如果你真的需要同时运行所有20GB,你可能会考虑让你的小数据集更小,以便更多的数据可以放入L2缓存。这可以为您带来实质性的改进。

什么是占用20GB RAM的过程?它是你自己的程序还是像MySQL这样的东西?用什么语言写的?我能够在python中使用4GB ram的程序,并使用简化的C ++实现将其缩小为500MB的RAM。