내 컴퓨터에는 약 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)의 세 가지 영역이 있습니다.
2 * 11 * 3 = 66MiB.
66MiB = 66 * 1024 = 67584KiB.
4G 시스템에서도 별도의 "일반" 영역과 DMA32 영역이 있는 이유는 "4G 시스템에 구현된 작은 pci32 영역은 pci32 mmio를 위한 공간을 만들기 위해 4g에 일부 작은 메모리를 재배치하기 때문입니다."