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