
次のスワッピング ポリシーを展開したいと思います。
- デフォルトでは、メモリ内のすべてのページもスワップ領域内に配置される必要があります。
- メモリ内のページが変更された場合 (つまり、ダーティになった場合)、そのページはできるだけ早く書き出される必要がありますが、他のプロセスよりも優先度が低くなります。
- 特定の設定可能なウォーターマークに達した場合 (たとえば、ページの 80% がダーティであるとします)、優先度は他のプロセスと同じになります。
このようなスワッピング ポリシーは Linux カーネルで可能ですか? 可能であれば、これを実現するにはカーネル設定をどのように設定すればよいですか?
編集:
明らかに、この理由はスワップアウトする必要があるページ数を減らすためです。ディスクに書き込む必要があるのはダーティ ページのみで、これは時間の経過とともにバックグラウンドで実行されます。したがって、ページ ミスが発生した場合 (つまり、ページがメモリ内にない場合)、メモリからディスクにページを書き込む必要はなく、ディスクからメモリにのみ書き込む必要があります。したがって、スワップインとスワップアウトの両方が同時にディスクにアクセスしようとするため、I/O ボトルネックの可能性が減ります。
答え1
の値を設定すると、/proc/sys/vm/swappiness
スワップされるデータ セグメントとメモリ内に保持されるデータ セグメントの比率を制御できます。 値を 0 にすると、スワップは完全に回避されます。
これは次のいずれかの方法で実行できます。
echo 0 > /proc/sys/vm/swappiness
sysctl -w vm.swappiness=0
- その設定を保存する
/etc/sysctl.conf
一般的に、スワップを少しだけ使用することは悪いことではありません。空きメモリはディスクから読み取ったデータをキャッシュするために使用でき、システムはアプリケーションで大量のメモリが突然必要になった場合に事前に対応できます。
ただし、スワップされるプログラムが多すぎると、プログラムを切り替えるたびにディスク関連のアクティビティが大量に発生し、すべての処理が遅くなります。何かを使用する前に、メモリに再度ロードする必要があります。
ディスクの読み取りは、データが到着するまでにかなり時間がかかるため、メモリ アクセスに比べて非常に低速です。システムは他の読み取り/書き込み要求の間に読み取りをスケジュールする必要があり、ドライブは適切なシリンダーを見つけようと試み、最終的にゆっくりとデータを配信し始めます。
したがって、あなたの論理には欠陥があると思います。一般的に、突然の増加に備えて十分な余裕を保ちながら、プログラムをメモリ内で実行し続ける必要があります。バックアップでもパフォーマンスの向上でもないため、「ディスクに書き込む」ためにスワップを頻繁に使用しないでください。
古いコンピュータにはメモリが少なく、その結果スワッピングの問題が発生していました。一度に多くのプログラムが開かれると、システムの速度が低下し、ディスクがスワップ ファイルを読み書きする音が聞こえました。
答え2
システムがスワップしているからといって、問題があるわけではありません。システムのパフォーマンスを妨げずにスワップを最大限に活用できるように細かく調整されたアプリケーションがあります。ほとんどのリレーショナル データベース システムは、このように調整されています。たとえば、Oracle と Cache がおそらく最大の 2 つです。
休止状態を使用すると、RAM の保存にスワップ領域が使用されます。システムを再起動したときに、スワップ内のすべてが RAM に追加されます。この方法では、スタンバイのようにバッテリーを消費することなくシステムの電源をオフにし、電源をオフにする前の状態に戻ることができます。その結果、バッテリーの寿命が大幅に延びます。
スワップは、アクティブな RAM をさらに解放して、システムのパフォーマンスを高く維持できるので、非常に便利です。アクティブな RAM がいっぱいで、スワップもいっぱいになっても、さらにスペースが必要な場合、問題が発生します。その時点までは、スワップはあなたを助けるものであり、害を与えるものではありません。
答え3
vdboor さんの回答に加えて、あなたが望むことを達成するには、 以上のものを変更する必要があると思いますswappiness
。スワップの使用方法を制御するカーネル調整可能なパラメータは他にもあります。ユーザーは実行時に/proc/sys/vm/*
ファイル経由でそれらにアクセスしたり、永続的に設定したりできます (効果を得るには、ブート シーケンスに init スクリプト/etc/sysctl.conf
を追加する必要があるかもしれません)sysctl
設定についてはLinuxカーネルのドキュメントで詳しく説明されています。以下を参照してください<your_kernel_sources_path>/Documentation/sysctl/vm.txt
。オンラインドキュメントもご覧ください。このような。