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を使用する必要がありますが、それは私が望んでいることではありません。
スーパーユーザーに質問するのはこれが初めてです。私の質問が不適切な場合は私を助けてください。そして、あなたの助けに感謝します。
メモリリークのあるフォーク爆弾である必要はありません。たとえば、make -j
(またはj
係数が高すぎる)中程度のコードサイズまたは子孫の山を生成するプロセス(アクティブユーザーの妥当な制限未満)で、それぞれがそれ自体で重要な量のメモリを噛みますただし、小さすぎてOOMキラーのターゲットにできない(またはOOMキラーに釘付けされたときに大幅な救済を提供できない)場合も、同様の効果があります。
このようなプロセスの生成パターンを監視し、必要に応じてpgidまたはuseridで(つまり、OOMのように1つずつではなく同時に)それらを強制終了できる、カスタマイズされた監視スクリプト/ツール(高い優先度でrootによって実行される)を作成することができます。キラー)システムに致命的になる前に。 合理的産卵/資源排出率で機能しますが、可能かどうかは任意率だけではわかりません。