RHEL 6のページフレームリサイクルアルゴリズムの内部動作を理解しようとしています。
より具体的には、使用可能なメモリがページ_ロー(またはページ_ハイ)を下回らないときにvmstatがsi / soにゼロ以外の値が表示される理由とは異なる置換の兆候が表示されるかどうかを知りたいです。
vmstatから:
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
13 4 2476036 1533508 486264 10396996 18 22 9674 2790 59364 114558 7 8 81 4 0
つまり、システムで使用できるメモリは1,533,508KBです。
/proc/zoneinfoから
Node 0, zone Normal
…
min 130364
low 162955
high 195546
ゼロ以外のスワップインおよびスワップアウトアクティビティ(si> 0、したがって> 0)が表示されますが、使用可能なメモリ(約375,000ページに相当)は低および高メモリのしきい値よりはるかに高いという事実は文書と一致しているようです。文献に交流活動がどのように記述されているか。
たとえば、Mel Gormanの「Linux仮想メモリの理解」は次のとおりです。
「過去にはkswapdが10秒ごとに目覚めましたが、現在はその領域の利用可能なページ数がpage_lowに達した場合にのみ物理ページアロケータによって起動されます。」
その後、本は私たちが見ているものの1つの可能な説明を提供します。
「極端なメモリ不足の状況では、プロセスはBalance_classzone()を呼び出してkswapdの操作を同期的に完了し、それは次にtry_to_free_pages_zone()を呼び出します。」
言い換えれば、メモリ割り当て要求が失敗したり、遅くなったりすると、プロセスはそれ自体で領域バランスを開始することができる。しかし、try_to_free_pages_zoneがさまざまなキャッシュを縮小することに焦点を当てているように見えるため、これがスワッピングを説明できるかどうかは不明です。
また、交換表示を見ると上部に kswapd が頻繁に表示されますが、これは直接リサイクル理論とも矛盾するようです。
ここで何か抜けましたか?
修正する特に、交換中にExaWatcher psの出力を確認した結果、kswapd0プロセスがこの間に「R」状態にあることがわかります。つまり、直接リサイクルする場合は除外されます。
ありがとう、ニコラ
答え1
利用可能なメモリが領域透かしよりはるかに高い場合、ページがメインメモリからスワップアウトする可能性がある状況が1つ以上見つかりました。このシナリオは、仮想マシンを最適化するためのアルゴリズムの1つであるゾーン圧縮に関連しています。
このプロセスの基本的なアイデアは、ページを移動して大規模な連続仮想アドレスブロックを作成することです。 「移動」とは、ページを物理的に移動するのではなく、ページのPTEを更新することを意味する。
圧縮アルゴリズムは、互いに近い領域の反対側の端で2つのスキャナを実行する。あるスキャナーは移動するページを検索し、もう一方のスキャナーは移動可能な無料ページを検索し、最終的には中間点で会う必要があります。
問題は、ゾーン圧縮中に移動することはできませんが、リサイクル可能なページが見つかる可能性があることです。これが発生すると、アルゴリズムは交換を介してそれらをリサイクルしようとする可能性があります。
ここで重要なのは、領域圧縮が透かしによって実行されないことです。代わりに、これは高次割り当てが失敗するたびに、つまりメモリが断片化され、まだ利用可能なメモリが多い場合に発生します。
答え2
より適切である可能性がある他の答えが見つかりました。最新バージョンのLinuxカーネルには、直接および定期的なリサイクルに加えて、遅いパス割り当てがあることがわかりました。つまり、kswapd が連続メモリブロックの割り当てに失敗した後に目覚めます。
目が覚めると、kswapdは領域透かしをチェックします。しかし、透かしは以前の静的地域レベルの数値ではないことがわかりました。代わりに、割り当て順序によって異なります。
つまり、kswapdは、地域が再調整されたかどうかを判断するときにトリガーされた失敗した割り当て要求の順序を考慮します。したがって、メモリが十分に断片化された場合、kswapdが実行することがあります。
ゾーンのバランスを変更するとき、kswapdはファイルキャッシュを縮小するか、ユーザープロセスから匿名ページを盗むことから選択します(スワップが完全に無効になっていない場合)。したがって、残りの質問は、kswapdが後者のオプションを選択した理由です。私の考えには再び断片化が答えのようです。回収アルゴリズムには、ファイルキャッシュを縮小して得られたページが物理的に連続的でない可能性があることを知る方法があると思います。
より一般的には、最新バージョンのカーネルにはメモリの最適化が追加されているだけでなく、ページフレームの回収と圧縮されたメモリの境界もやや曖昧になりました。
残念ながら、すべてのクラシックLinuxカーネルの教科書は2.6以前のカーネルバージョンに基づいて書かれていたので、非常に誤解を招く可能性があります。