我正在处理一个C++应用程序,需要大量的内存进行批处理运行。 (> 20GB)当你用mlockall设置的内存不足时会发生什么?
我的一些客户正在运行内存限制,有时操作系统开始交换,总运行时间翻倍或更糟。
我读过,我可以使用mlockall保持过程不被换出。当进程内存需求以这种方式接近或超过可用物理内存时会发生什么?
我想答案可能与操作系统有关,所以请在您的答案中列出操作系统。
我正在处理一个C++应用程序,需要大量的内存进行批处理运行。 (> 20GB)当你用mlockall设置的内存不足时会发生什么?
我的一些客户正在运行内存限制,有时操作系统开始交换,总运行时间翻倍或更糟。
我读过,我可以使用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;
}
(我说过我不是一个C程序员?)
的文档说这种行为是“依赖于实现”。所以你可能不得不测试你自己的实现来看看会发生什么。我通过启动root来运行我的脚本,将锁定的页面ulimit设置为10000,从该shell启动一个普通用户,然后运行脚本。在malloc失败之前,我做了10057次分配;还有更多比没有mlockall电话。
会发生什么情况正是你所看到的 - 未能分配更多内存,因为你的应用程序已经获得了系统中的所有物理内存,并且由于这些内存不能被交换出去,所以malloc没有办法做,但失败了。这种行为在大多数现代操作系统中都是相同的。
如果你想使用mlockall(你真的不应该),你最好确保系统具有所需的物理内存量,否则你将处于一个痛苦的世界 - malloc将失败的其他进程作为以及这些可能会导致您的系统崩溃。
在这种情况下会发生什么情况是您的系统资源超出了您的要求。您需要重新设计您的系统,以便它需要更少的内存。
为什么你需要20GB的RAM?这非常不寻常。我有一些这么大的工作。您通常可以将它们分解为多个较小的作业,并在多台机器上按顺序或同时运行它们。
如果你确实需要同时运行所有的20GB,你可能会考虑让你的小数据集更小,以便更多的数据集可以放入L2缓存。这可以给你实质性的改善。
什么是采取20GB的RAM的过程?它是你自己的程序还是类似MySQL的东西?它是用什么语言写的?我可以在python中使用4GB的ram程序,并使用简化的C++实现将其压缩到500MB的RAM中。
呃,> 20GB听起来很多。什么是操作系统..?你使用的是64位操作系统,对吧? – Sean 2009-07-27 21:05:03
而不是我们列出操作系统,你为什么不说你感兴趣的是哪一个? UNIX,VMS,Linux,Windows,一些嵌入式的东西? – 2009-07-27 21:06:54