RHEL 6のページフレーム再利用アルゴリズムの内部動作を理解するのに苦労しています。
具体的には、空きメモリがpages_low(またはpages_high)を下回らないときに、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
つまり、システムには1533508キロバイトの空きメモリがあります。
/ proc/zoneinfoから
Node 0, zone Normal
…
min 130364
low 162955
high 195546
空きメモリ(約375kページに相当)がメモリの下限と上限の両方のしきい値をはるかに上回っているときに、ゼロ以外のスワップインおよびスワップアウトアクティビティ(si> 0、つまり> 0)が見られるという事実は、次のように対立しているようです。スワッピングアクティビティがドキュメントと文献にどのように記述されているか。
例えば。 MelGormanによる「UnderstandingLinuxVirtualMemory」:
「これまで、kswapdは10秒ごとにウェイクアップしていましたが、現在は、ゾーン内の空きページのpages_low数に達したときにのみ、物理ページアロケーターによってウェイクアップされます。」
この本の後半では、私たちが見ているものに対する1つの可能な説明を提供します。
「極端なメモリプレッシャーの下では、プロセスは、try_to_free_pages_zone()を呼び出すbalance_classzone()を呼び出すことにより、kswapdの作業を同期的に実行します。」
つまり、メモリ割り当て要求が失敗したり遅い場合、プロセスはゾーンバランシングを開始できます。ただし、try_to_free_pages_zoneはさまざまなキャッシュの縮小に重点を置いているようであるため、これがスワッピングを説明できるかどうかは明確ではありません。
また、スワッピングの兆候を観察すると、kswapdが一番上に表示されることがよくあります。これも、直接的な再生理論とは相容れないようです。
ここで見逃しているものはありますか?
更新スワッピング期間中に取得されたExaWatcher ps出力を具体的に確認したところ、これらの期間中にkswapd0プロセスが「R」状態になっていることがわかりました。つまりこれにより、直接再生シナリオが除外されます。
よろしく、ニコライ
空きメモリがゾーンの透かしをはるかに上回っているときに、メインメモリからページをスワップアウトする可能性のあるシナリオを少なくとも1つ見つけることができました。シナリオは、VMデフラグのアルゴリズムの1つであるゾーンの圧縮に関係しています。
このプロセスの背後にある基本的な考え方は、ページを移動して仮想アドレスの大きな連続チャンクを作成することです。 「移動」とは、ページのPTEを物理的に移動するのではなく、更新することを指します。
圧縮アルゴリズムは、ゾーンの両端から2つのスキャナーを実行し、互いに向かって進みます。 1つのスキャナーは移動するページを検索し、もう1つのスキャナーは移動できる無料のページを検索し、最終的には途中で出会うはずです。
重要なのは、ゾーンの圧縮中に、移動できないが、再利用できるページを見つけることができるということです。これが発生した場合、アルゴリズムはそれを交換することで再利用しようとする場合があります。
ここで重要なことは、ゾーンの圧縮がウォーターマークによってトリガーされないことです。むしろ、高次の割り当てが失敗するたびに発生します。つまり、このメモリが十分にフラグメント化されている場合、空きメモリがまだ十分に残っているときに発生する可能性があります。
私はおそらくより適切な別の答えを見つけました。実は、Linuxカーネルの最新バージョンでは、直接および定期的な再利用とは別に、低速パスの割り当てがあり、連続したメモリチャンクの割り当てに失敗した後にkswapdがウェイクアップされます。
目覚めると、kswapdはゾーンの透かしをチェックします。ただし、結局のところ、透かしは静的なゾーンレベルの数値ではなく、かつてあった可能性があります。むしろ、それらは割り当て順序に固有です。
つまりゾーンをリバランスする必要があるかどうかを決定するとき、kswapdは、ゾーンをトリガーした失敗した割り当て要求の順序を考慮に入れます。したがって、メモリが十分に断片化されている場合、kswapdは実行する必要があります。
ゾーンのバランスを取り直すとき、kswapdは、ファイルキャッシュを縮小するか、ユーザープロセスから匿名ページを盗むかを選択できます(スワッピングが完全に無効になっていない場合)。したがって、残りの質問は-kswapdが後者のオプションを選択する理由です。答えはもう一度断片化だと思います。再利用アルゴリズムには、ファイルキャッシュの縮小から取得したページが物理的に隣接していない可能性があることを知る方法があると思います。
より一般的に言えば、最近のバージョンのカーネルにはメモリの最適化が追加されているだけでなく、ページフレームの再利用とメモリの圧縮の間の境界線もややぼやけています。
残念ながら、すべての古典的なLinuxカーネルの教科書は2.6以前のカーネルバージョンに基づいて書かれているため、かなり誤解を招く可能性があります。