Minha máquina tem cerca de 8 GB de RAM. Por que está min_free_kbytes
definido para 67584? O comentário do código do kernel diz que eu deveria esperar ver min_free_kbytes
definido para cerca de 11584. Ele também diz que o maior que ele definiria é 65536.
$ cat /proc/sys/vm/min_free_kbytes
67584
$ free -h
total used free shared buff/cache available
Mem: 7.7Gi 3.2Gi 615Mi 510Mi 3.9Gi 3.7Gi
Swap: 2.0Gi 707Mi 1.3Gi
$ grep -r min_free_kbytes /etc/sysctl* # No manual configuration
$
$ uname -r # My kernel version
5.0.17-200.fc29.x86_64
https://elixir.bootlin.com/linux/v5.0.17/source/mm/page_alloc.c#L7567
/*
* Initialise min_free_kbytes.
*
* For small machines we want it small (128k min). For large machines
* we want it large (64MB max). But it is not linear, because network
* bandwidth does not increase linearly with machine size. We use
*
* min_free_kbytes = 4 * sqrt(lowmem_kbytes), for better accuracy:
* min_free_kbytes = sqrt(lowmem_kbytes * 16)
*
* which yields
*
* 16MB: 512k
* 32MB: 724k
* 64MB: 1024k
* 128MB: 1448k
* 256MB: 2048k
* 512MB: 2896k
* 1024MB: 4096k
* 2048MB: 5792k
* 4096MB: 8192k
* 8192MB: 11584k
* 16384MB: 16384k
*/
https://www.spinics.net/lists/linux-mm/msg14044.html
linux-5.0.17/mm//mm/khugpageged.c:1862
Um "pageblock" é uma página enorme em potencial: 2MiB em x86-64. Este cálculo diz que min_free é 2MiB * 11 * nr_zones. "Com 4G de memória" você tem pelo menos três zonas: "normal", "DMA32" e "DMA" (DMA16).
2 * 11 * 3 = 66 MiB.
66 MiB = 66 * 1024 = 67584 KiB.
A razão pela qual as zonas "normais" e DMA32 separadas aparecem mesmo em sistemas 4G é: "a pequena zona pci32 que se materializa em sistemas 4g que realocam um pouco de memória sobre 4g para abrir espaço para o pci32 mmio".