web-dev-qa-db-ja.com

Linuxでメモリリークフォーク爆弾に対処するにはどうすればよいですか?

1人のユーザーのプロセス数を制限することでフォーク爆弾を防ぐことができ、メモリリークによってOSがフリーズすることはありません。Linux用のOSにはOOMキラーがあります。しかし、メモリリークのあるフォーク爆弾はどうですか?

#include <vector>
#include <unistd.h>
#include <ctime>
#include <cstdlib>

using namespace std;

int main() {
    srand(time(NULL));
    vector<int> vec;
    do {
        try {
            for (int i=0; i<10000000; i++)
                vec.Push_back(Rand());
        } catch (bad_alloc e) {
        }
        fork();
    } while (1);
    return 0;
}

このコードを試した後、Linuxがフリーズしました。とにかく凍結を防ぐことができますか?
コードはArchlinux、Linux4.0.5でテストされています

次のコマンドを使用してコードをコンパイルします。g++ -o test test.cpp

詳細:コードは数回フォークするだけですべてのメモリを消費する可能性があるため、通常のフォーク爆弾とは異なり、プロセスの数を制限しても意味がありません。また、fork()は頻繁に実行されるため(メモリが少ない場合)、OOM-killerはフォークよりもはるかに低速です。その結果、これらのプロセスを停止するにはAlt-SysRq-R-E-Iを使用する必要がありますが、それは私が望んでいることではありません。

スーパーユーザーに質問するのはこれが初めてです。私の質問が不適切な場合は私を助けてください。そして、あなたの助けに感謝します。

3
swordfeng

メモリリークのあるフォーク爆弾である必要はありません。たとえば、make -j(またはj係数が高すぎる)中程度のコードサイズまたは子孫の山を生成するプロセス(アクティブユーザーの妥当な制限未満)で、それぞれがそれ自体で重要な量のメモリを噛みますただし、小さすぎてOOMキラーのターゲットにできない(またはOOMキラーに釘付けされたときに大幅な救済を提供できない)場合も、同様の効果があります。

このようなプロセスの生成パターンを監視し、必要に応じてpgidまたはuseridで(つまり、OOMのように1つずつではなく同時に)それらを強制終了できる、カスタマイズされた監視スクリプト/ツール(高い優先度でrootによって実行される)を作成することができます。キラー)システムに致命的になる前に。 合理的産卵/資源排出率で機能しますが、可能かどうかは任意率だけではわかりません。

1
Dan Cornilescu