次のシナリオを考えてみましょう。 Linuxをインストールした(ライブCDではなく)遅い読み取り専用メディア(書き込み保護されたサムドライブ、CD/DVDなど)がありますそれ自体ですが、通常のビルドです)、文字通り他の形式のストレージがないコンピューターで使用します。 USB 2であるため、低速です。ルートファイルシステムはoverlayfsとしてマウントされるため、ログやその他の多くの一時的な作業に対して「書き込み可能」ですが、すべての書き込みはRAM(RAM $ ===( tmpfs upperdir)。ライブディストリビューションの状況のかなり典型的なシナリオ。
他の形式のストレージがないため、スワップはzramにマウントされます。そのため、Linuxがスワップを決定すると、それらのページを圧縮してRAMに保存しますが、少なくとも圧縮されています。ほとんどのアプリケーションのRAMは簡単に圧縮できるため、これは実際には適切です(RAMは「高速」であることが意図されているため、通常、データでは非常に冗長です)。これはアプリケーションメモリではうまく機能しますが、そうではありません。 tmpfsの場合。
これが問題です:zramはfast、信じられないほどそうです。一方、サムドライブは低速です。 20 MiB/sだとしましょう。これは、比較すると非常に遅いです。ここで、問題と、カーネルが正しいことを行わない理由を確認できます。
この質問はnotTMPFS内のファイルをスワップしやすくする方法 の複製ではないことに注意してください。質問はほとんど同じですが、その質問の答えにはまったく満足していません。ごめんなさい。カーネルは、それを設計する人々がどのようにsmartであるかに関係なく、それ自体で「正しいこと」を確実に実行しますしません。人々が状況を理解しておらず、よく知っていると思うとき、私はそれが嫌いです。彼らは平均的なケースに対応します。 Linuxが非常に微調整できるのはそのためです。Linuxがどれほどスマートであっても、Linuxが何に使用されるかを予測することはできないからです。
たとえば、vm.swappiness(/ proc/sys/vm/swappiness)を100に設定できます(実際に設定しました)。これにより、アプリケーションメモリを積極的にスワップしてファイルキャッシュを保持するように指示されます。このオプションは素晴らしいですが、残念ながらそれがすべてではありません。
ファイルキャッシュを保持する他のどのRAMスワップを処理するときに使用する)よりも優先する必要があります。これは、ファイルキャッシュを削除すると、ファイルキャッシュから読み戻す必要があるためです。遅い20MiB/sドライブ、これはzramへのスワップよりもはるかにはるかに遅いアプリケーションの場合、vm.swappinessは機能しますが、tmpfsの場合は機能しません。
tmpfsはページキャッシュとしてマウントされるため、ファイルキャッシュと同じ優先度があります。 tmpfsからファイルを読み取ると、古いファイルキャッシュエントリ(最近使用されたもの)よりも優先されます。しかし、それは悪いことです。カーネルは明らかにここで正しいことをしません。ドライブからの読み取りは非常に遅いため、ファイルキャッシュよりも「最近使用された」場合でも、tmpfsをzramにスワップする方がはるかに優れていることを考慮する必要があります。
したがって、ファイルキャッシュと比較してより頻繁にtmpfsからスワップするように明示的に指示する必要があります。つまり、tmpfsよりもファイルキャッシュを保持する必要があります。/proc/sys/vmには非常に多くのオプションがありますが、これについては何も見つかりませんでした。本当にがっかり。
それができない場合、一部のデバイス/ドライブが他のデバイス/ドライブよりもはるかに低速であり、他のデバイス/ドライブよりもキャッシュを保持することを優先する必要があることをカーネルに伝える方法はありますか? tmpfsとzramは高速です。サムドライブはそうではありません。カーネルにこの情報を伝えることはできますか?
すべてのドライブを同じように扱う場合、それ自体で「正しいこと」を行うことはできません。 tmpfsが最近使用された場合でも、低速ドライブからキャッシュを削除するよりも、tmpfsをzramなどの高速ドライブにスワップする方がはるかに高速です。
空きメモリが不足すると、スワップピネスのためにアプリケーションメモリをスワップするか(良好)、古いファイルキャッシュを削除します(不良)。これらのファイルから再読み込みすることになった場合、非常に遅くなります。最近使用された場合でも、一部のtmpfsをスワップしてから再度読み取ることにした場合よりも、はるかに低速です。 zramは1桁高速だからです。
を増やす スワップピネス カーネルがtmpfsページをスワップする意欲を低下させ、スワップによってバックアップされていない他のファイルシステムからキャッシュされたページを排除する意欲を高めます。カーネルコミットを参照してください " vmscan:LRUリストをanonとファイルセットに分割します "-
LRUリストを2つに分割します。1つは実際のファイルシステムに裏打ちされたページ(「file」)用で、もう1つはメモリとスワップに裏打ちされたページ(「anon」)用です。後者にはtmpfsが含まれます。
-および linux-4.16/mm/vmscan.c:2108 -のコード
/*
* Determine how aggressively the anon and file LRU lists should be
* scanned. The relative value of each set of LRU lists is determined
* by looking at the fraction of the pages scanned we did rotate back
* onto the active list instead of evict.
*
* nr[0] = anon inactive pages to scan; nr[1] = anon active pages to scan
* nr[2] = file inactive pages to scan; nr[3] = file active pages to scan
*/
static void get_scan_count(struct lruvec *lruvec, struct mem_cgroup *memcg,
struct scan_control *sc, unsigned long *nr,
unsigned long *lru_pages)
{
int swappiness = mem_cgroup_swappiness(memcg);
.。
/*
* With swappiness at 100, anonymous and file have the same priority.
* This scanning priority is essentially the inverse of IO cost.
*/
anon_prio = swappiness;
file_prio = 200 - anon_prio;
たとえば、vm.swappiness(/ proc/sys/vm/swappiness)を100に設定できます(実際に設定しました)。
これを定量化して、希望する結果に違いがないかどうかを明示的に言うことはありません。とはいえ、極端な速度差を考えると、より高いswappiness値が本当に必要になると思います。
スワッピングの再検討、LWN.net、2016年6月7日
パッチセットの最初のステップは、swappinessノブの可能な設定の範囲を広げることです。現在のカーネルでは、ゼロ(可能な場合はスワッピングをまったく行わない)から100(匿名ページとファイルバックアップページを等しく再利用する)まで変更できます。 Johannesは最大値を200に上げます。その値では、システムはスワッピングを強く支持します。これは、これまで誰も望んでいなかった可能性ですが、高速ドライブによって便利になりました。
.。
ただし、メモリ管理の変更には潜在的な危険が伴い、これらの変更によって他のワークロードが損傷を受ける可能性は十分にあります。これが起こらないという確信を得る唯一の方法は、より広範なテストとレビューです。このパッチセットはかなり若いです。いくつかの好意的なレビューがありましたが、そのテストはまだ行われていません。したがって、このコードがメインラインカーネルの近くに配置されるまでにはしばらく時間がかかる場合があります。
zramは確かに高速ドライブの一例です。これは、このパッチの ディスカッション で明示的に言及されています。
残念ながら、このパッチのコミットも、このパッチシリーズのv2も見つかりませんでした。
Swappinessの正確な効果も 議論 より詳細です。私はこれがswappinessの古いLWN.netの説明とどのように一致するかを理解していません ここ 。