GNU/Linux >> Linux の 問題 >  >> Linux

Linux – Linuxは「日和見スワッピング」を実行しますか、それともそれは理論ですか?

プログラムがメモリを要求したが、十分な空きメモリが残っていないとします。 Linuxが応答する方法はいくつかあります。 1つの応答は、最近アクセスされていない他の使用済みメモリを選択し、この非アクティブなメモリをスワップに移動することです。

しかし、これを超える記事やコメントがたくさんあります。彼らは、大量の空きメモリがある場合でも、Linuxはスワップするために非アクティブなメモリを書き込むことを決定することがあると言います。事前にスワップに書き込むことは、最終的にこのメモリを使用したいときに、ディスクの書き込みを待つ必要がないことを意味します。彼らは、これはパフォーマンスを最適化するための意図的な戦略だと言っています。

彼らは正しいですか?それとも神話ですか?ソースを引用します。

次の定義を使用して、この質問を理解してください。

  • 交換
  • 無料 memory –freeコマンドによって表示される「空き」メモリ。これはMemFreeです /proc/meminfoからの値 。 /proc/meminfo カーネルによって提供される仮想テキストファイルです。 proc(5)またはRHELドキュメントを参照してください。
  • 大量の空きメモリがある場合でも –議論の目的で、10%を超える空きメモリがあると想像してください。

参照

いくつかの検索用語は次のとおりです。linux「機会的スワッピング」OR(「システムにやるべきことがないとき」または「やるべきことがないとき」または「システムがアイドル状態のとき」または「アイドル時間中」にスワッピング)

Googleで2番目に高い結果で、StackExchangeユーザーは「RAMに十分な空き容量があるのになぜスワップを使用するのですか?」と質問し、freeの結果をコピーします。 約20%の空きメモリを示すコマンド。この特定の質問への回答として、この回答は非常に投票されていると思います:

Linuxは、RAMがいっぱいになる前にスワッピングを開始します。これは、
パフォーマンスと応答性を向上させるために行われます:

  • プログラムメモリを格納するよりもディスクキャッシュにRAMを使用する方がよい場合があるため、パフォーマンスが向上します。そのため、しばらく使用されていない
    プログラムを交換し、代わりに頻繁に使用される
    ファイルをキャッシュに保持することをお勧めします。

  • 応答性は、メモリがいっぱいで一部のプログラムが実行されているときではなく、システムがアイドル状態のときにページをスワップアウトして
    、タスクを完了するためにより多くのRAMを要求することによって改善されます。

もちろん、スワッピングはシステムの速度を低下させますが、
スワッピングの代わりにスワッピングを行うのではなく、RAMを増やすか、RAMの使用量を減らします。

Googleでの最初の結果は、上記の質問の重複としてマークされています:-)。この場合、質問者は7GBのMemFreeを示す詳細をコピーしました 、16GBのうち。質問には、それ自体が受け入れられ、賛成された回答があります:

空きメモリがない場合にのみスワッピングするのは、swappinessを設定した場合のみです。 それ以外の場合、アイドル時間中にカーネルはメモリを交換します。これを行う際に、データはメモリから削除されませんが、スワップパーティションにコピーが作成されます。

これは、メモリが使い果たされた場合に、その場でディスクに書き込む必要がないことを意味します。この場合、カーネルはすでにスワップされているメモリページを上書きするだけで、データのコピーがあることがわかります。

swappiness パラメータは基本的に、これを実行する量を制御するだけです。

他の引用は、スワップされたデータがメモリにも保持されていることを明示的に主張していません。ただし、20%の空きメモリがある場合でもスワッピングを行う場合は、そのアプローチを好むようです。そうする理由は、パフォーマンスを向上させるためです。

私の知る限り、Linuxはメインメモリとスワップスペースの両方に同じデータのコピーを保持することをサポートしています。

また、「日和見スワッピング」は「アイドル時間中に」発生するという一般的な主張にも気づきました。この機能は一般的にパフォーマンスに優れていることを私に安心させるのに役立つはずだと理解しています。上記の定義にはこれを含めません。これは、明確な質問をするのに十分な詳細がすでにあると思うからです。これを必要以上に複雑にしたくありません。

元の動機

ギガバイトの空きメモリがある場合、上部に「swout」(スワッピング)が表示されます。なぜですか?

空きメモリが十分にあるときにLinuxがスワップに書き込むというこのような報告がいくつかあります。 「日和見スワッピング」はこれらのレポートを説明するかもしれません。同時に、少なくとも1つの代替原因が提案されました。考えられる原因を調べるための最初のステップとして:Linuxは上記で定義された「日和見スワッピング」を実行しますか?

私が報告した例では、質問に回答しました。原因は日和見的な交換ではありませんでした。

承認された回答:

Linuxは、この質問で定義されている「日和見スワッピング」を行いません。

次の主要な参考資料では、概念についてはまったく触れていません。

  1. Linux VirtualMemoryManagerについて理解します。メル・ゴーマンによるオンライン本。 Linux2.6.0のリリース直前の2003年に作成されました。
  2. Documentation / admin-guide / sysctl/vm.rst。これは、Linux仮想メモリ管理の調整可能な設定に関する主要なドキュメントです。
関連:一時ファイルなしでSTDERRとSTDOUTを異なる変数にリダイレクトしますか?

具体的には:

10.6ページアウトデーモン(kswapd)

歴史的にkswapd 以前は10秒ごとにウェイクアップしていましたが、現在は、ゾーン内の空きページのpages_low数に達したときにのみ、物理ページアロケータによってウェイクアップされます。 […]極端なメモリプレッシャーの下で、プロセスはkswapdの作業を行います 同期的に。 […]kswapd pages_highウォーターマークに達するまでページを解放し続けます。

上記に基づいて、空きページ数が「最高水準点」よりも多い場合、スワップは発生しないと予想されます。

次に、これはkswapdの目的を示しています より多くの無料ページを作成することです。

kswapdの場合 スワップするメモリページを書き込み、すぐにメモリページを解放します。 kswapdはスワップされたページのコピーをメモリに保持しません

Linux 2.6は、「rmap」を使用してページを解放します。 Linux 2.4では、話はもっと複雑でした。ページが複数のプロセスで共有されている場合、kswapdはページをすぐに解放できませんでした。これは古代の歴史です。リンクされている投稿はすべてLinux2.6以降に関するものです。

スワップピネス

このコントロールは、カーネルが
メモリページをどれだけ積極的にスワップするかを定義するために使用されます。値を大きくすると攻撃性が高まり、値を低くするとスワップの量が減少します。
値0は、カーネルに
空きページとファイルバックページの量が増えるまでスワップを開始しないように指示します
ゾーンの最高水準点よりも低いです。

この引用は、特別な場合を説明しています。swappinessを構成する場合 となる値 。この場合、キャッシュページの数が最高水準に達するまで、スワッピングを追加で期待するべきではありません。つまり、カーネルはスワッピングを開始する前に、ほとんどすべてのファイルキャッシュを破棄しようとします。 (これにより、大幅な速度低下が発生する可能性があります。ファイルキャッシュが必要です!ファイルキャッシュは、実行中のすべてのプログラムのコードを保持するために使用されます🙂

透かしとは何ですか?

上記の引用は疑問を投げかけます:私のシステムの「透かし」メモリ予約はどれくらいですか?回答:「小規模な」システムでは、デフォルトのゾーン透かしはメモリの3%にもなる可能性があります。これは、「最小」ウォーターマークの計算によるものです。大規模なシステムでは、透かしの割合は小さくなり、メモリの0.3%に近づきます。

したがって、10%を超える空きメモリを備えたシステムに関する質問の場合、この透かしロジックの正確な詳細は重要ではありません。

個々の「ゾーン」の透かしは、/proc/zoneinfoに表示されます。 、proc(5)に記載されているとおり。私のzoneinfoからの抜粋:

Node 0, zone    DMA32
  pages free     304988
        min      7250
        low      9062
        high     10874
        spanned  1044480
        present  888973
        managed  872457
        protection: (0, 0, 4424, 4424, 4424)
...
Node 0, zone   Normal
  pages free     11977
        min      9611
        low      12013
        high     14415
        spanned  1173504
        present  1173504
        managed  1134236
        protection: (0, 0, 0, 0, 0)

現在の「透かし」はminです 、low 、およびhigh 。プログラムがfreeを減らすのに十分なメモリを要求した場合 minの下 、プログラムは「直接再生」に入ります。カーネルがメモリを解放する間、プログラムは待機します。

可能であれば、直接の回収は避けたいと考えています。したがって、free lowを下回る 透かし、カーネルはkswapdをウェイクアップします 。 kswapd freeになるまで、キャッシュを交換またはドロップすることでメモリを解放します highより上 もう一度。

追加の資格:kswapd また、カーネルのlowmemとDMAの使用のために、lowmem_reserveの全量を保護するために実行されます。デフォルトのlowmem_reserveは、RAMの最初の4GiB(DMA32ゾーン)の約1/256であるため、通常は約16MiBです。

Linuxコードのコミット

mm:メモリに比例してkswapd透かしをスケーリングします

[…]

ウォーターマークスケールファクター:

この要因は、kswapdの攻撃性を制御します。これは、
kswapdがウェイクアップされる前にノード/システムに残っているメモリの量と、
kswapdがスリープ状態に戻る前に解放する必要があるメモリの量を定義します。

単位は10,000の端数です。デフォルト値の10は、透かし間の距離が
ノード/システムで使用可能なメモリの0.1%であることを意味します。最大値は1000、つまりメモリの10%です。

直接再利用(allocstall)またはkswapdに入るスレッドの割合が高い(allocstall)
時期尚早にスリープする(kswapd_low_wmark_hit_quickly)ことは、
待ち時間の理由でkswapdが維持する空きページの数が
少なすぎることを示している可能性があります。システムで発生する割り当てバースト。このノブ
を使用して、それに応じてkswapdの攻撃性を調整できます。

proc:meminfo:利用可能なメモリをより保守的に見積もる

MemAvailable /proc/meminfoのアイテム これは、スワッピングを発生させずに
どのくらいのメモリを割り当てることができるかについてのヒントをユーザーに提供することです。そのため、ユーザースペースで使用できないゾーンの低透かしを
除外します。

ただし、ユーザースペースの割り当てについては、kswapd 空きページが最高水準点と
ページアロケータのlowmem保護の組み合わせに達するまで、実際に
再利用されます。これにより、一定量のDMA
とDMA32メモリもユーザースペースから保護されます。

>

MemAvailableを計算するときに、
空きページ数から、ユーザースペースで利用できないことがわかっている全額を差し引きます。

Linuxコード

swappinessを変更すると主張されることがあります へ 「日和見スワッピング」を効果的に無効にします。これは、興味深い調査手段を提供します。 「日和見スワッピング」と呼ばれるものがあり、swappinessで調整できる場合は、vm_swappinessを読み取るすべてのコールチェーンを見つけることで追跡できます。 。 CONFIG_MEMCGを想定することで、検索スペースを減らすことができることに注意してください。 が設定されていません(つまり、「memorycgroups」が無効になっています)。コールチェーンは次のようになります:

  • vm_swappiness
  • mem_cgroup_swappiness
  • get_scan_count
  • shrink_node_memcg
  • shrink_node
関連: `sudo`は``の検索にどのPATHを使用しますか?

shrink_node_memcg 「これは基本的なノードごとのページフリーです。 kswapdと直接再生の両方で使用されます。」つまりこの関数は、無料の数を増やします ページ。スワップするためにページを複製しようとはしていないので、後で解放することができます。しかし、それを割り引いても:

上記のチェーンは、以下に示す3つの異なる関数から呼び出されます。予想どおり、コールサイトを直接再生v.sに分割できます。 kswapd。直接回収で「日和見スワッピング」を実行することは意味がありません。

  1. /*
     * This is the direct reclaim path, for page-allocating processes.  We only
     * try to reclaim pages from zones which will satisfy the caller's allocation
     * request.
     *
     * If a zone is deemed to be full of pinned pages then just give it a light
     * scan then give up on it.
     */
    static void shrink_zones
    
  2.  * kswapd shrinks a node of pages that are at or below the highest usable
     * zone that is currently unbalanced.
     *
     * Returns true if kswapd scanned at least the requested number of pages to
     * reclaim or if the lack of progress was due to pages under writeback.
     * This is used to determine if the scanning priority needs to be raised.
     */
    static bool kswapd_shrink_node
    
  3.  * For kswapd, balance_pgdat() will reclaim pages across a node from zones
     * that are eligible for use by the caller until at least one zone is
     * balanced.
     *
     * Returns the order kswapd finished reclaiming at.
     *
     * kswapd scans the zones in the highmem->normal->dma direction.  It skips
     * zones which have free_pages > high_wmark_pages(zone), but once a zone is
     * found to have free_pages <= high_wmark_pages(zone), any page in that zone
     * or lower is eligible for reclaim until at least one usable zone is
     * balanced.
     */
    static int balance_pgdat
    

したがって、おそらく、すべてのメモリ割り当てが空きメモリからすぐに満たされている場合でも、kswapdが何らかの形でウェイクアップされているという主張です。 wake_up_interruptible(&pgdat->kswapd_wait)の使用法を調べました 、そして私はこのような目覚めを見ていません。


Linux
  1. Linuxのメモリ使用量

  2. Linuxでメモリバッファとキャッシュを削除する方法

  3. Linux – Linuxのメモリ使用量を正しく判断しますか?

  1. Linuxでメモリ消費をログに記録する方法は?

  2. Linux free はメモリ使用量が高いことを示していますが、top はそうではありません

  3. Linux は日和見スワッピングを実行しますか、それとも神話ですか?

  1. Linux でスタック割り当てはどのように機能しますか?

  2. Linux 非アクティブ メモリ

  3. Linuxにはどのようなプロセスキラーがありますか?