私の最低および最高の透かしがDocumentation/sysctl/vm.txtの予測より高いようです。

私の最低および最高の透かしがDocumentation/sysctl/vm.txtの予測より高いようです。

やる気

私はここに答えを書きました:私のシステムの「透かし」メモリ予約はどのくらいですか? 「通常」領域の「最小」透かしは31449ページで表示されます。それは125796 KiBです。合計サイズ(67584)より大きいmin_free_kbytes

リセットは、この領域の透かしを予想レベル(9582ページなど)にmin_free_kbytes設定します。minしかし、しばらくすると、より高いレベルに戻った。

私はこれが確実です。ブースト_透かし()。 「最小」、「低」、および「高」の透かしを改善します。同じ数量透かしブースト係数15000なので、最大改善は元の「高」透かしの150%でなければなりません。

質問

最初から私の「高い」透かしはなぜそんなに高いのですか? (「低い」透かしもあります):

私以来透かし倍率10から「最小」、「低」、および「高」の間の距離は、面積サイズの0.1%にすぎません。ただし、リセット直後に見ると、min_free_kbytes「最小」と「低」の違いは領域サイズの2%です。なぜ?

(「低」と「高」の違いは面積サイズの0.2%です。したがって、これは私たちが期待するものとは異なります!)。

透かしを設定するコードは次のとおりです。__setup_per_zone_wmarks()

カーネルバージョン: 5.0.17-200.fc29.x86_64

から/proc/zoneinfo

Node 0, zone   Normal
  pages free     74597
        min      9582
        low      34505
        high     36900
        spanned  1173504
        present  1173504
        managed  1140349

DMA32領域では、それほど大きな違いは見られません。 「最小」透かしはDMA32領域でも昇格しないようです。おそらく、カーネルが「一般」領域で割り当てることを好むからです。

Node 0, zone      DMA
...
  pages free     3961
        min      33
        low      41
        high     49
        spanned  4095
        present  3996
        managed  3961
...
Node 0, zone    DMA32
  pages free     334671
        min      7280
        low      9100
        high     10920
        spanned  1044480
        present  888973
        managed  866356

答え1

透かし間の距離が0.1%の数値と一致しない理由を見つけました。

「小型システム」では、透かし間の距離は(強化されていない)「最小」透かしの1/4です。つまり、記録された距離が(特定の地域に対して)managed * watermark_scale_factor / 10000より小さい場合、その距離は使用されません。min / 4

    } else {
        /*
         * If it's a lowmem zone, reserve a number of pages
         * proportionate to the zone's size.
         */
        zone->_watermark[WMARK_MIN] = tmp;
    }

    /*
     * Set the kswapd watermarks distance according to the
     * scale factor in proportion to available memory, but
     * ensure a minimum size on small systems.
     */
    tmp = max_t(u64, tmp >> 2,
            mult_frac(zone_managed_pages(zone),
                  watermark_scale_factor, 10000));

    zone->_watermark[WMARK_LOW]  = min_wmark_pages(zone) + tmp;
    zone->_watermark[WMARK_HIGH] = min_wmark_pages(zone) + tmp * 2;
    zone->watermark_boost = 0;

tmp >> 2tmp / 4.

ソースコードリンク:linux-5.0.17/mm/page_alloc.c:7531

私もここで最近バグを見つけました。 「ハイ・ロー」と「ロー・ミン」の間に違いはありません!これは設定の有無min_wmark_pages(zone)によって異なるために発生する可能性がありますが、zone->watermark_boost発生する前に呼び出されます。私は持っていますレポートエラーを管理者に渡します。

関連情報