それはそれほど珍しい問題ではないと思います:1つのプロセスが大量のメモリを割り当てます(メモリリークのバグが原因であるか、実行不可能なほど大きな入力ファイルを処理しようとしたためなど)。RAMがいっぱいになり、ある時点でLinuxはスワップに切り替える必要があります。まあ、これが最後の手段になる場合もあります。高額な計算を行っている場合、最後の方でRAMが不足してもデータを失いたくありません。
ただし、(私の経験では)かなり頻繁に、メモリ消費は不正な、おそらくバグのあるプロセスによって制限されていません。つまり、スワップするために移動する緊急性の低いデータで終わるだけでなく、OSがデータのロードをパニック状態でスワップすることを余儀なくされています。そして残念なことに、これは問題のあるプロセスを大幅に中断するだけでなく、システム全体をほぼ停止状態にする可能性があります(SSDを搭載したマシンでは、それほど悪くはありませんが、OTOHでは、ギガバイトやギガバイトのごみデータを書き込むかどうか心配になります。長期的にはフラッシュセルに害を与えます)。
問題に気づき、手動でプロセスを強制終了するまで(実際に仮想端末にログインするまでに数分かかりました!)、実行中のセッションの半分がスワップ状態になり、システムがスムーズに実行されるまでしばらく待つ必要があります再び。
この問題に対するドラコニックな解決策が1つあります。それは、ハードメモリー制限を強制することです。しかし、これをシステム全体で実行すると、まだ必要ulimit
なプロセスが強制終了されることがあります。問題のプロセスを開始する前に手動で実行する必要がある場合は、まあ、手遅れになるまで忘れがちです。
私が幸せになる可能性のある種類の解決策:
- プロセスが特定のメモリ使用量を超えた場合、システムの残りの部分が応答し続けるように、人為的に調整されます。
- 特定のメモリ使用量を超えるプロセスがある場合、そのプロセスは
SIGSTOP
停止しているため、次に何をすべきかを理解する時間があります。 - プロセスがRAMの制限に近づくと、大きなスワッピングが始まる前に警告が表示されます。
そのような動作または類似のものを取得する方法はありますか?
ulimit
です。