私はこれがまれな問題だとは思わない。プロセスは大量のメモリを割り当てます(おそらく実行不可能なほど大きな入力ファイルを処理しようとしているため、メモリリークエラーまたは他の理由による)。 RAMがいっぱいになると、ある時点でLinuxはスワップに切り替える必要があります。まあ、時にはこれは最後の手段です。高価な計算を行う場合、最終的にRAMが不足してもデータを失いたくありません。
しかし、(私の経験では)不良プロセス、欠陥のあるプロセスのためにメモリ消費が無制限になることが多くあります。つまり、私は結局緊急性の低いデータスワップに移動しましたが、オペレーティングシステムが緊急に大量のデータをスワップする必要がありました。残念ながら、これは問題のプロセスを深刻に妨げるだけでなく、システム全体をほぼ静止させる可能性があります(SSDを搭載したシステムではもはや悪くはありませんが、OTOHではギガバイト単位のセクションとセクションの作成について心配します)。ギガバイトのジャンクデータがシステムクラッシュを引き起こす可能性があります)フラッシュバッテリーが長期的に損傷する可能性があります。
問題を発見してプロセスを手動で終了するまで(一度は実際に仮想端末にログインするのに数分かかりました!)、実行中のセッションの半分がスワップにあり、システムがスムーズに実行されるまで長い時間を待たなければなりませんでした。再び。
この問題には大胆な解決策があります。つまり、ハードメモリ制限を適用することです。ただし、システム全体でこれを行うと、依然として必要なプロセスが終了することがあり、ulimit
開始する前に問題のあるプロセスを手動で終了する必要があります。
私がより満足できるソリューションの種類は次のとおりです。
- プロセスが特定のメモリ使用量を超えると、残りのシステムが応答し続けるように人工的に調整されます。
- プロセスが特定のメモリ使用量を超えると、
SIGSTOP
pedが発生し、次に何をすべきかを特定する時間が提供されます。 - プロセスがRAMの制限に達すると、警告が表示されます。今後偉大な交流が始まります。
この動作や同様の動作を得る方法はありますか?
答え1
Niceload --noswap yourprgこれはこの種の状況のために設計されています。交換活動を見てください。
- 交換した場合:プロセスを実行します。
- スワップの場合:プロセスを実行させます。
- スワップインとスワップアウトの場合:スワップが停止するまでプロセスを一時停止し、スワップが停止したらプロセスを再開します。
スワップが開始される前にプロセスを一時停止するのではなく、続行する前にスワップが1秒間実行されるようにします。
niceload --mem 1G yourprg
同様に動作します。空き容量が1GB未満の場合、PRGは一時停止します。 1GB以上が使用可能になると、プログラムが再開されます。
答え2
はい。これは、ほとんどすべての最新のシェルを使用して簡単に実行できます。
sh -c 'ulimit -S -m "$1"
shift; exec your_command "$@"
' -- some_size args
-l
ロックメモリ制限オプションが利用可能です。制限を超えると、プロセスはシグナルを受け取ります。
答え3
キャッシュをクリアするCronjob:Linuxでメモリキャッシュを消去する方法
実際に同様の問題があります。時々、利用可能なすべてのメモリを消費し、Redhatサーバーをクラッシュさせる独自のカスタムスクリプトを実行するユーザーグループがあります。 RAMを大量に消費する理由は、スクリプトがイベントを待って数日間実行できるため、実際に使用されているリソースがない場合にリソースを束ねているためです。だから私がしたことは、単にcronjobを使ってキャッシュを強制的に消去するだけで、それ以降は問題はありませんでした。
シンプルで怠惰です。