Понимание / proc / sys / vm / lowmem_reserve_ratio - PullRequest
3 голосов
/ 13 февраля 2011

Я не могу понять значение переменной "lowmem_reserve_ratio", прочитав объяснение из Documentation / sysctl / vm.txt. Я также пытался гуглить, но все найденные объяснения в точности совпадают с представленными в vm.txt.

Будет очень полезно, если sb объяснит это или упомянет какую-нибудь ссылку об этом. Вот оригинальное объяснение: -

The lowmem_reserve_ratio is an array. You can see them by reading this file.
-
% cat /proc/sys/vm/lowmem_reserve_ratio
256     256     32
-
Note: # of this elements is one fewer than number of zones. Because the highest
      zone's value is not necessary for following calculation.

But, these values are not used directly. The kernel calculates # of protection
pages for each zones from them. These are shown as array of protection pages
in /proc/zoneinfo like followings. (This is an example of x86-64 box).
Each zone has an array of protection pages like this.

-
Node 0, zone      DMA
  pages free     1355
        min      3
        low      3
        high     4
        :
        :
    numa_other   0
        protection: (0, 2004, 2004, 2004)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  pagesets
    cpu: 0 pcp: 0
        :
-
These protections are added to score to judge whether this zone should be used
for page allocation or should be reclaimed.

In this example, if normal pages (index=2) are required to this DMA zone and
watermark[WMARK_HIGH] is used for watermark, the kernel judges this zone should
not be used because pages_free(1355) is smaller than watermark + protection[2]
(4 + 2004 = 2008). If this protection value is 0, this zone would be used for
normal page requirement. If requirement is DMA zone(index=0), protection[0]
(=0) is used.
zone[i]'s protection[j] is calculated by following expression.

(i < j):
  zone[i]->protection[j]
  = (total sums of present_pages from zone[i+1] to zone[j] on the node)
    / lowmem_reserve_ratio[i];
(i = j):
   (should not be protected. = 0;
(i > j):
   (not necessary, but looks 0)

The default values of lowmem_reserve_ratio[i] are
    256 (if zone[i] means DMA or DMA32 zone)
    32  (others).
As above expression, they are reciprocal number of ratio.
256 means 1/256. # of protection pages becomes about "0.39%" of total present
pages of higher zones on the node.

If you would like to protect more pages, smaller values are effective.
The minimum value is 1 (1/1 -> 100%).

Ответы [ 2 ]

3 голосов
/ 12 мая 2011

с той же проблемой, что и у вас, я погуглил (много) и наткнулся на эту страницу , которая может (или не может) быть более понятной, чем документация по ядру.

(яне указывайте здесь, потому что это будет нечитабельно)

1 голос
/ 24 октября 2014

Я нашел формулировку в этом документе действительно слишком запутанной.Рассмотрение источника в mm/page_alloc.c помогло прояснить ситуацию, поэтому позвольте мне попробовать более простое объяснение:

Как сказано на цитируемой вами странице, эти числа «являются взаимным числом отношения»,По-разному: эти числа делители.Таким образом, при расчете резервных страниц для данной зоны в узле вы берете сумму страниц в этом узле в зонах выше этой, делите ее на предоставленный делитель, и именно столько страниц вы резервируете для этой зоны.

Пример: предположим, что узел 1 ГиБ с 768 МБ в зоне Normal и 256 МБ в зоне HighMem (предположим, нет зоны DMA).Давайте предположим, что «коэффициент» (делитель) резерва для highmem по умолчанию равен 32. И давайте предположим, что типичный размер страницы 4 КиБ.Теперь мы можем вычислить резервную область для зоны Normal:

  1. Сумма «более высоких» зон, чем у зоны Normal (только HighMem): 256 МБ = (1024 КБ / 1 МБ) * (1 стр. / 4КиБ) = 65536 страниц
  2. Область, зарезервированная в зоне Нормально для этого узла: 65536 страниц / 32 = 2048 страниц = 8 МБ.

Концепция остается неизменной при добавлении нескольких зони узлы.Просто помните, что зарезервированный размер указан в страницах - вы никогда не зарезервируете часть страницы.

...