当设置了mlockall的ram用完时会发生什么? 我正在研究一个C++应用程序,它需要大量的内存来进行批处理运行。 (>20gb)

当设置了mlockall的ram用完时会发生什么? 我正在研究一个C++应用程序,它需要大量的内存来进行批处理运行。 (>20gb),c++,memory,C++,Memory,我的一些客户遇到内存限制,有时操作系统开始交换,总运行时间翻倍甚至更糟 我已经读到,我可以使用mlockall来防止进程被调出。当进程内存需求以这种方式接近或超过可用物理内存时会发生什么 我想答案可能是特定于操作系统的,所以请在答案中列出操作系统。我在Linux上尝试过这个。超过“ulimit-l”(最大锁定页面)后,malloc失败 以下是测试脚本: #include <sys/mman.h> #include <stdio.h> #include <stdlib

我的一些客户遇到内存限制,有时操作系统开始交换,总运行时间翻倍甚至更糟

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


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

我在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;
}
#包括
#包括
#包括
int main(int argc,字符**argv){
int r=0;
整数计数=0;
char*buf;
printf(“锁定…\n”);
r=mlockall(MCL_未来);
if(r){
printf(“错误:%d\n”,r);
出口(1);
}
而(1){
buf=malloc(1000);
如果(!buf){
printf(“在%d次迭代后分配失败,\n”,计数);
出口(0);
}
计数++;
}
返回0;
}
(我说过我不是C程序员吗?)


文档称这种行为“依赖于实现”。因此,您可能需要测试您自己的实现,看看会发生什么。我运行脚本的方法是:su-ing到root,将锁定的页面ulimit设置为10000,su-ing到该shell中的普通用户,然后运行脚本。在malloc失败之前,我进行了10057次分配;如果没有mlockall调用,情况会更糟。

发生的事情正是您所看到的——分配更多内存失败,因为您的应用程序已经获取了系统中的所有物理内存,并且这些内存无法交换出去,malloc除了失败之外别无选择。这种行为在大多数现代操作系统中都是一样的


如果您想使用mlockall(实际上不应该),最好确保系统具有所需的物理内存量,否则您将陷入痛苦的境地-malloc也会在其他进程中失败,这些进程可能会使您的系统崩溃

在这种情况下,系统的资源超出了您的需求。你需要重新设计你的系统,这样它需要更少的内存

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

如果您确实需要同时运行所有20GB,您可以考虑将小型数据集缩小,以便将更多数据集放入二级缓存。这可以给你实质性的改善


占用20GB内存的过程是什么?这是你自己的程序还是类似MySQL的东西?它是用什么语言写的?我可以在Python中使用4GB的RAM,使用简化的C++实现将其缩小到500 MB的RAM。操作系统是什么。。?您使用的是64位操作系统,对吗?与其让我们列出OSs,不如说您对哪种操作系统感兴趣?UNIX,VMS,Linux,Windows,一些嵌入式的东西?我想你是想锁定未来的页面,而不是当前的页面。平台应该是64位Linux,64位AIX,64位Solaris,64位HP-UX。不应该吗?这不取决于我们的需要吗