/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
...