これはそれほど珍しい問題ではないと思います。1つのプロセスが大量のメモリを割り当てます(メモリリークのバグが原因で、実行不可能なほど大きな入力ファイルを処理しようとしたためなど)。 RAMがいっぱいになり、ある時点でLinuxをスワップに切り替える必要があります。これが最後の手段である場合もあります。コストのかかる計算を行っている場合は、失いたくないです。終わりに向かってRAMが不足した場合のデータ。
ただし、(私の経験では)かなり頻繁に、メモリ消費は、不正な、おそらくバグのあるプロセスによって制限されません。つまり、最終的に緊急性の低いデータスワップに移動するだけでなく、OSは大量のデータをパニックにスワップすることを余儀なくされます。残念ながら、これは問題のあるプロセスを大幅に中断するだけでなく、システム全体をほぼ停止させる可能性があります(SSDを搭載したマシンではそれほど悪くはありませんが、OTOHではギガバイトとギガバイトのガベージデータを書き込む可能性があるかどうか心配になります長期的にはフラッシュセルに害を及ぼします)。
問題に気づき、手動でプロセスを強制終了するまで(仮想端末にログインするまでに実際には数分かかりました!)、実行中のセッションの半分がスワップになり、かなり待つ必要がありますシステムが再びスムーズに動作するまで。
この問題に対する1つの劇的な解決策があります。それは、ハードメモリ制限を適用することです。しかし、これをシステム全体で実行すると、まだ必要なプロセスが強制終了されることがあります。問題のあるプロセスを開始する前に手動でulimit
する必要がある場合は、手遅れになるまで忘れることがよくあります。
私が幸せになる可能性のある解決策の種類:
SIGSTOP
pedなので、次に何をすべきかを理解する時間があります。そのような振る舞い、または同様の振る舞いを得る方法はありますか?
niceload --noswap yourprg まさにその状況のために作られています:それはスワッピング活動を調べます:
スワッピングが開始される前にプロセスを一時停止することはありませんが、動作する前にスワッピングを1秒間実行します。
niceload --mem 1G yourprg
同様に機能します:1GB未満が無料の場合、youprgは一時停止されます。 1GB以上が解放されると、yourprgが再開されます。
はい。これは、事実上すべての最新のシェルで非常に簡単に実行できます。
sh -c 'ulimit -S -m "$1"
shift; exec your_command "$@"
' -- some_size args
ロックされたメモリ制限には-l
オプションを使用できます。制限を超えると、プロセスに通知されます。