さまざまなマシンで RSS を超えようとするプログラムを実行すると、まったく異なる動作が見られます。コードは次のようなものです。
...
char** s = (char**)malloc(10000*sizeof(char*));
for (i = 0; i < 10000; i++){
s[i] = (char*)malloc(1000*1000*sizeof(char));
if (s[i] == NULL) {
printf("cannot allocate memory for s[%d]",i);
exit(1);
}
}
int j = 0;
while(1){
for (i = 0; i < 10000; i++){
for (j = 0; j < 1000*1000; j++) {
s[i][j] = 1;
}
if ((i % 100) == 0) printf("i = %d\n", i);
}
}
for (i = 0; i < 10000; i++)
free(s[i]);
free(s);
...
上記のコードは、malloc を使用して約 10GB のメモリを割り当てようとします。このコードを試した最初の 2 台のマシンは Linux カーネル 2.6 で実行され、最後のマシンは Linux カーネル 2.4 で実行されました。これらのマシンで見られる動作は次のとおりです。
マシン 1: メモリはメモリ オーバーコミットを使用して割り当てられますが、while ループでメモリ位置に値を割り当てる場合、RSS が許可する範囲でしか割り当てられません。したがって、OOM Killer は、i=3800 が出力されるとプロセスを強制終了します。これは、このマシンが持つ約 4GB のメモリです。
マシン 2: メモリ オーバーコミットを使用してメモリが割り当てられ、while ループが無限に続き、仮想メモリからページが割り当てられます。i = 3800 が出力された後、プロセスは少し遅くなりますが、これは正常です。
machine3: このマシンには 2GB のメモリしかありません。メモリを割り当てることさえできません。オーバーコミットが設定されていないか、カーネル 2.4 が malloc! を使用した仮想マシン ページの割り当てをサポートしていないようです。したがって、最初の for ループでは、i = 2138 にメモリを割り当てながら終了します。
私の望むアクションは、machine2 で起こっているアクションです。OSがmallocを使用して仮想メモリページを割り当て、必要なメモリがRSSを超えている間にページングを開始できるようにするには、どの(カーネル?)オプションを設定する必要があるか知っていますか?
ありがとう