0

我将 /proc/sys/vm/overcommit_memory 设置为 1,我认为这将允许任意数量的内存过度使用,最高可达 64 位指针允许的范围。但是,当我的内存请求变得足够大(大约 86Tb)时,mmap 调用开始失败。这是我达到的实际上限吗?如果是,那是什么?还是我在分配内存时犯了一些错误?

下面的代码在我的笔记本电脑上重现了该问题,可能需要在其他计算机上调整内存阈值。

#include<iostream>

#include <sys/mman.h>

static constexpr const size_t span = 86ULL * 1024ULL * 1024ULL * 1024ULL * 1024ULL;

int main() {
    fprintf(stderr, "ALLOCATING %ld bytes\n", span);
    if (mmap(0, span, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0) == MAP_FAILED) {
        perror("...");
        exit(-4);
    }
}

控制台输出

[user@hp]$
[user@hp]$ cat /proc/sys/vm/overcommit_memory
1
[user@hp]$ g++ -std=c++2a -o test test.cpp
[user@hp]$ ./test
ALLOCATING 94557999988736 bytes
...: Cannot allocate memory

这是 prlimit 的输出:

[user@hp]$ prlimit
RESOURCE   DESCRIPTION                             SOFT      HARD UNITS
AS         address space limit                unlimited unlimited bytes
CORE       max core file size                 unlimited unlimited bytes
CPU        CPU time                           unlimited unlimited seconds
...
4

0 回答 0