私のコンピュータには約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
*/
答え1
巨大なページを使用するシステムでは、min_free_kbytesを高く設定します
hugeadm --set-recommended-min_free_kbytes
。透明な hugepage サポートの導入により、この推奨値も適用されます。[...]4Gメモリを使用するX86-64では、min_free_kbytesが67584になります。
https://www.spinics.net/lists/linux-mm/msg14044.html
/* Ensure 2 pageblocks are free to assist fragmentation avoidance */
recommended_min = pageblock_nr_pages * nr_zones * 2;
/*
* Make sure that on average at least two pageblocks are almost free
* of another type, one for a migratetype to fall back to and a
* second to avoid subsequent fallbacks of other types There are 3
* MIGRATE_TYPES we care about.
*/
recommended_min += pageblock_nr_pages * nr_zones *
MIGRATE_PCPTYPES * MIGRATE_PCPTYPES;
linux-5.0.17/mm//mm/khugpaged.c:1862
「ページブロック」は、潜在的に巨大なページ(x86-64から2MiB)です。この計算によると、min_freeは2MiB * 11 * nr_zonesです。 「4Gメモリ使用」には、「Normal」、「DMA32」、「DMA」(DMA16)の3つの領域があります。
2 * 11 * 3 = 66MiB。
66MiB = 66 * 1024 = 67584KiB.
4Gシステムでも別々の「一般」領域とDMA32領域がある理由は、「4Gシステムに実装された小さなpci32領域は、pci32 mmioのためのスペースを作るために4gにいくつかの小さなメモリを再配置するからです」。