2009-07-27 27 views
3

我正在处理一个C++应用程序,需要大量的内存进行批处理运行。 (> 20GB)当你用mlockall设置的内存不足时会发生什么?

我的一些客户正在运行内存限制,有时操作系统开始交换,总运行时间翻倍或更糟。

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

我想答案可能与操作系统有关,所以请在您的答案中列出操作系统。

+0

呃,> 20GB听起来很多。什么是操作系统..?你使用的是64位操作系统,对吧? – Sean 2009-07-27 21:05:03

+0

而不是我们列出操作系统,你为什么不说你感兴趣的是哪一个? UNIX,VMS,Linux,Windows,一些嵌入式的东西? – 2009-07-27 21:06:54

回答

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程序员?)

的文档说这种行为是“依赖于实现”。所以你可能不得不测试你自己的实现来看看会发生什么。我通过启动root来运行我的脚本,将锁定的页面ulimit设置为10000,从该shell启动一个普通用户,然后运行脚本。在malloc失败之前,我做了10057次分配;还有更多比没有mlockall电话。

2

会发生什么情况正是你所看到的 - 未能分配更多内存,因为你的应用程序已经获得了系统中的所有物理内存,并且由于这些内存不能被交换出去,所以malloc没有办法做,但失败了。这种行为在大多数现代操作系统中都是相同的。

如果你想使用mlockall(你真的不应该),你最好确保系统具有所需的物理内存量,否则你将处于一个痛苦的世界 - malloc将失败的其他进程作为以及这些可能会导致您的系统崩溃。

0

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

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

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

什么是采取20GB的RAM的过程?它是你自己的程序还是类似MySQL的东西?它是用什么语言写的?我可以在python中使用4GB的ram程序,并使用简化的C++实现将其压缩到500MB的RAM中。

相关问题