it-swarm-ja.com

シングルプロセススワップをオフにしてオーバーコミットする

2つの質問:

  1. 特定のプロセスのスワッピングをオフにする方法はありますか?つまり、システムの使用可能なすべてのプライマリメモリを使用している場合、特定のプロセスを強制終了することは可能ですか?

  2. Linuxシステムでメモリのオーバーコミットを無効にするにはどうすればよいですか?

コンテキスト

分散アプリケーションを実行していますが、システムのプライマリメモリが不足したら、プロセスを強制終了したいと思います。このプロセスはハードディスク通信では非常に重いので、次のようにプログラムでメモリ使用量をチェックするのが妥当だと思います

std::ifstream statm("/proc/self/statm");
size_t mem_virt, mem_rss, mem_shared;
statm >> mem_virt >> mem_rss >> mem_shared;
if (mem_virt == MAX_SYSTEM_PRIMARY_MEMORY) {
    // kills current process
}

ただし、特定のプロセスのスワップをオフにできるコマンドラインのセットがあれば、それは間違いなく優れています。

それでも、オーバーコミットをオフにする方法はまだわかりません。何か案は?

2
Rubens

mlockall(MCL_CURRENT|MCL_FUTURE)を呼び出すことにより、アプリケーションでのスワッピングを禁止できます。マニュアルページを参照してください。

オーバーコミットを無効にすることができます:

$ sysctl vm.overcommit_memory=2    # policy number 2
$ sysctl vm.overcommit_ratio=0     # ratio = 0%

スワップなしで実行することは、一般的にひどい考えです。これで、すべての匿名mmapは、使用されていない場合でも、RAMによって強制的にバックアップされます。実際に何もスワップされていない場合でも、Unixにはスワップが必要です。

2
vbraun