やる気
私はここに答えを書きました:私のシステムの「透かし」メモリ予約はどのくらいですか? 「通常」領域の「最小」透かしは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 >> 2
tmp / 4
.
ソースコードリンク:linux-5.0.17/mm/page_alloc.c:7531
私もここで最近バグを見つけました。 「ハイ・ロー」と「ロー・ミン」の間に違いはありません!これは設定の有無min_wmark_pages(zone)
によって異なるために発生する可能性がありますが、zone->watermark_boost
発生する前に呼び出されます。私は持っていますレポートエラーを管理者に渡します。