web-dev-qa-db-ja.com

カーネルを微調整して完全にスワップアウトするにはどうすればよいですか?

次のスワップポリシーを展開したいと思います。

  • デフォルトでは、メモリ内のすべてのページもスワップスペースにある必要があります。
  • メモリ内のページが変更された場合(つまり、ダーティ)、ページはできるだけ早く書き出される必要がありますが、他のプロセスよりも優先度は低くなります。
  • 特定の構成可能な透かしに達した場合(たとえば、ページの80%がダーティである場合)、優先度は他のプロセスと同じになります。

この種のスワップポリシーはLinuxカーネルで可能ですか?もしそうなら、これを達成するためにカーネル設定をどのように設定しますか?

編集:

明らかに、これの理由は、スワップアウトする必要のあるページの数を減らすためです。ダーティページのみをディスクに書き込む必要があり、これは時間の経過とともにバックグラウンドで発生します。したがって、ページミスが発生した場合(つまり、ページがメモリ内にない場合)、メモリからディスクにページを書き込む必要はなく、ディスクからメモリにのみ書き込む必要があります。したがって、スワップインとスワップアウトの両方が同時にディスクにアクセスしようとするため、I/Oボトルネックの可能性が減少しました。

5
txwikinger

/proc/sys/vm/swappinessの値を設定して、メモリに保持されているデータのセグメントに対するスワップされたデータのセグメントの比率を制御できます。値0は、すべてのコストでスワッピングを完全に回避します。

これは、次のいずれかを使用して実行できます。

  • echo 0 > /proc/sys/vm/swappiness
  • sysctl -w vm.swappiness=0
  • その設定を/etc/sysctl.confに保存する

一般的に、ほんの少しのスワップを使用することは悪いことではありません。空きメモリは、ディスクから読み取ったデータをキャッシュするために使用でき、システムは、アプリケーションによる大量のメモリの突然の必要性を事前に計画できます。

ただし、スワップされるプログラムが多すぎると、プログラムの切り替えごとにディスク関連のアクティビティが多く発生し、すべてが実際に遅くなります。何かを使用する前に、それをメモリにロードし直す必要があります。

データの到着にかなり長い時間がかかるため、ディスクの読み取りはメモリアクセスに比べてひどく遅いです。システムは、他の読み取り/書き込み要求の間に読み取りをスケジュールする必要があり、ドライブは適切なシリンダーを見つけようとし始め、最後にゆっくりとデータの配信を開始します。

したがって、あなたの論理には欠陥があると思います。一般に、突然の成長に備えて十分なスペースを確保しながら、プログラムをメモリ内で実行し続けたいと考えています。バックアップでもパフォーマンスの向上でもないため、スワップを頻繁に使用して「ディスクに書き込む」ことはしないでください。

古いコンピュータはメモリが少なく、結果としてスワッピングの問題に悩まされていました。多くのプログラムが一度に開かれると、システムの速度が低下し、スワップファイルへのディスクの読み取りと書き込みが聞こえました。

4
vdboor

システムがスワップしているからといって、問題があるわけではありません。システムのパフォーマンスを妨げることなくスワップを最大限に活用するように微調整されたアプリケーションがあります。ほとんどのリレーショナルデータベースシステムは次のように調整されています。IE:OracleとCache、おそらく最大の2つです。

休止状態を使用する場合、RAMのストレージにスワップスペースを使用します。システムをバックアップして起動すると、スワップ内のすべてがRAMに追加されます。このようにして、スタンバイのようにバッテリーをかみ砕くことなくシステムの電源を切り、電源を切る前に中断したところに戻ることができます。その結果、バッテリーはずっと長持ちします。

スワッピングは、アクティブRAMをより多く解放し、システムのパフォーマンスを高く保つため、すばらしいことです。アクティブなRAMがいっぱいになり、スワップがいっぱいになり、さらにスペースが必要な場合にのみ、問題が発生します。その時点まで、スワップは役に立ちます。あなたを傷つけません。

3
Aaron Toponce

Vdboorの答えに加えて、私はあなたが望むものを達成するために、あなたはswappiness以上を修正する必要があると思います。スワップの使用方法を制御する、利用可能なカーネルチューナブルは他にもあります。ユーザーは、実行時に/proc/sys/vm/*ファイルを介してそれらにアクセスするか、/etc/sysctl.confに永続的に設定できます(これを有効にするには、ブートシーケンスにsysctl initスクリプトを追加する必要がある場合があります)

設定は、Linuxカーネルのドキュメントでうまく説明されています。 <your_kernel_sources_path>/Documentation/sysctl/vm.txtの下にあります。また、いくつかのオンラインドキュメントを見ることができます これなど

1
rozcietrzewiacz