
私はカーネル4.4.0-36でUbuntu 16.04.1 LTSを実行しています。しかし、多くのディストリビューション/カーネルバージョンで恐ろしいカーネルの振る舞いを見たので、それは重要ではないと思います。
次の始点を考えてみましょう。
- 私のシステムに4 GBのRAMと4 GBのスワップパーティションがあるとしましょう。
- 私はGNOME、ブラウザ、現在開いているIDEを使用してデスクトップ環境を実行しています。
- 私はプログラミングをしていますが、その過程でプログラムに無制限のメモリを割り当てさせるバグが生じました。
これまではとてもよかったです。これが私が回復しなければならないでしょう。そうですか?これは私のものです。考えるまもなくリリース予定:
- 私のオペレーティングシステムは、私が書いたプログラムが悪意のあると間違って動作することに気づきました。
- 便利なデバッグまたはログメッセージで私のプログラムが終了しました。
- 活動を再開できました
ただし、これはUbuntuのデフォルトインストールでは発生しません。何が起こるのか?
- 不良プログラムが「無期限」で実行されることを許可
- 最終的に、すべての物理メモリが使い果たされると、システムは交換を開始します。
- 問題のプログラムがますますメモリを占めるにつれて、私のデスクトッププログラムのすべてのページがスワップにプッシュされました。私のハードドライブで本当に怖い騒音が出始めました。
- 私のUIが完全に応答しなくなります。クリックは発生後数分後に記録され、通常はマウスの動きは無視されます。
- マシンへのすべてのアクセスが効果的に停止します。これには、仮想端末の変更、仮想端末によるログイン、SSH によるログインが含まれます。
- 問題のあるプログラムを何とか殺すことができれば、すべてがうまくいくわけではありません。遠く。
- これで、すべてのユーザーインターフェイスとシステムサービスが交換され、ゆっくりと物理RAMに置き換えられ始めました。私のハードドライブはこの時点でもまだ狂っています。
- システムが「落ち着く」までに約0.5 - 1時間かかります。
リセットボタンを押さずに本機を再起動するのに時間がかかります。記憶が不足しているという単純なことが、このような致命的な出来事を引き起こす可能性があると誰が考えたのでしょうか。
いくつかの質問があります。
- 誰がデスクトップシステムでスワップを使用するのが良い考えだと思いましたか?
- 単にスワップを無効にする必要がありますか?そうしないのはなぜですか?
- スワップを無効にするよりも良い方法はありますか?たとえば、悪意のあるプログラムとの交換を制限し、システムサービスとユーザーインターフェイスを物理メモリに保持する方法はありますか?
答え1
限られたスワップ、物理メモリ、またはその両方を使用できますcgroups
。より原始的なアプローチはulimitを使用することでしたが、今ではcgroupが標準になりました。 (すべてのcgroup文書をコピーして貼り付けることはありません。)cgroupを使用すると、階層内の各プログラムのCPUおよびディスクI / O使用量制限を指定して、重要な操作に対してより高い優先順位を設定することもできます。
答え2
メモリが使い果たされたときにディスクを使用しないようにするには、swappiness sysctl を調整して 1 または 0 に設定する必要があります。