私は標準のLinux(Debianテスト)ラップトップとスワップパーティションを持っています。
私はそれで多くの実験をしています。それらのいくつかは本当にメモリを大量に消費し、Linuxがデフォルトでどのように動作するかは私にとって問題です...愚かな例を挙げましょう:
- ノートパソコンの前に座る
- ターミナルを開く
- 入力し
python
た後、a = [0]*100000000
この大きなリストを処理するための十分なRAMがない可能性が高くなっています。LinuxがRAMを埋め、次にスワップを行い、数分後にOOMキラーがトリガーされ、(ほぼ)ランダムなサービスが強制終了されます。うまくいけば、Ctrl + Cを押すpython
と、ターミナルがまだフォーカスがあったので、コンピュータは再び反応するようになります。
いくつかのメモリ制限を適用して、不要なスワッピングを回避し、(RAMに)持っているよりも多くのメモリを割り当てる権利をプロセスに拒否したいと思います。メモリ要求が特定の制限を下回っている場合、またはrootから要求された場合は、root以外のユーザーのメモリを最も消費しているプロセスを強制終了します。
ulimit -Sv [mem]
後ろで聞く!
ホーホー!「cgroups
経由で使用してくださいcgexec
!」誰かが最初の行で言う!
はい、そうです。これらは確かに非常に優れたソリューションです。だが:
- システム全体には適用されません
- 制限はプロセスごとに設定されます
- 制限は静的であり、実際の空きRAM量を無視します(AFAIK)
- こことそこに、彼らが言うこれらは本当にハード制限を強制するための良い解決策ではありません。
カーネルが言うことは、「あなたはユーザーfoo(rootではなく)に属しています。大量のメモリを使用しているので、メモリが足りなくなります。ごめんなさい...今すぐ死にます!」
または:「一体何をしているのですか?x MB が必要で、y MB しか利用できません。はい、SWAPは空ですが、SWAPを使用してダーティな作業を行うつもりはありませんか?いいえ、私はいいえと言った!記憶はない!主張すれば死ぬぞ!」
ulimits
ほとんどどこでも示したように、それはプロセスあたりの制限ですので、悪い考えです...私はあなたが知っている:)についてフォークcgroups
も私は私のラップトップについて話しているが、I:、これは間違いなく良いですが、より一般的な何かが欠けています私たちが共有する「計算」サーバーを所有しています。このようなユーザーごとの制限を適用すると、最悪の場合のシナリオによって制限されますか?
/proc/sys/vm/overcommit_memory
すると、メモリ不足時のカーネルの動作に影響します。