我的机器有大约 8GB 的 RAM。为什么min_free_kbytes
设置为67584?内核代码注释说我应该期望看到min_free_kbytes
设置为 11584 左右。它还说它将设置为 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/khugepaged.c:1862
“页面块”是一个潜在的大页面:x86-64 上的 2MiB。这个计算表明 min_free 是 2MiB * 11 * nr_zones。“使用 4G 内存”您至少有三个区域:“正常”、“DMA32”和“DMA”(DMA16)。
2 * 11 * 3 = 66 MB。
66 MiB = 66 * 1024 = 67584 KiB。
甚至在 4G 系统上也出现单独的“正常”和 DMA32 区域的原因是:“在 4g 系统上实现的微小 pci32 区域重新定位了 4g 上的一些小内存以为 pci32 mmio 腾出空间。”