
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
}
しかし、特定のプロセスのスワップをオフにできるコマンドラインのセットがあれば、間違いなく改善されるでしょう。
しかし、オーバーコミットをオフにする方法がまだわかりません。何かアイデアはありますか?
答え1
を呼び出すことによって、アプリケーション内でのスワッピングを禁止できます。mlockall(MCL_CURRENT|MCL_FUTURE)
マニュアル ページを参照してください。
オーバーコミットを無効にすることができます:
$ sysctl vm.overcommit_memory=2 # policy number 2
$ sysctl vm.overcommit_ratio=0 # ratio = 0%
スワップなしで実行するのは、一般的には最悪な考えです。これで、すべての匿名 mmap は、使用されていない場合でも、RAM によってバックアップされるようになります。実際には何もスワップされていない場合でも、Unix はスワップを必要とします。