我正在开发一个C ++应用程序,它需要大量内存才能进行批处理运行。 (> 20gb)
我的一些客户遇到内存限制,有时操作系统开始交换,总运行时间增加一倍或更差。
我已经读过,我可以使用mlockall来防止进程被换出。当进程内存需求以这种方式接近或超过可用物理内存时会发生什么?
我想答案可能是特定于操作系统的,所以请在答案中列出操作系统。
答案 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。