0%

mm_sysctl

  • vm.min_free_kbytes
  • vm.overcommit_memory
  • vm.lowmem_reserve_ratio

min_free_kbytes

From kernel docs:

This is used to force the Linux VM to keep a minimum number
of kilobytes free. The VM uses this number to compute a
watermark[WMARK_MIN] value for each lowmem zone in the system.
Each lowmem zone gets a number of reserved free pages based
proportionally on its size.

Some minimal amount of memory is needed to satisfy PF_MEMALLOC
allocations; if you set this to lower than 1024KB, your system will
become subtly broken, and prone to deadlock under high loads.

Setting this too high will OOM your machine instantly.

代表系统所保留空闲内存的最低限

在系统初始化时会根据内存大小计算一个默认值,计算规则是:

min_free_kbytes = sqrt(lowmem_kbytes * 16) = 4 * sqrt(lowmem_kbytes)(注:lowmem_kbytes即可认为是系统内存大小)

另外,计算出来的值有最小最大限制,最小为128K,最大为64M。可以看出,min_free_kbytes随着内存的增大不是线性增长

min_free_kbytes的主要用途是计算影响内存回收的三个参数 watermark[min/low/high]

min_free_kbytes大小的影响

min_free_kbytes设的越大,watermark的线越高,同时三个线之间的buffer量也相应会增加。这意味着会较早的启动kswapd进行回收,且会回收上来较多的内存(直至watermark[high]才会停止),这会使得系统预留过多的空闲内存,从而在一定程度上降低了应用程序可使用的内存量。极端情况下设置min_free_kbytes接近内存大小时,留给应用程序的内存就会太少而可能会频繁地导致OOM的发生。
min_free_kbytes设的过小,则会导致系统预留内存过小。kswapd回收的过程中也会有少量的内存分配行为(会设上PF_MEMALLOC)标志,这个标志会允许kswapd使用预留内存;另外一种情况是被OOM选中杀死的进程在退出过程中,如果需要申请内存也可以使用预留部分。这两种情况下让他们使用预留内存可以避免系统进入deadlock状态。

overcommit_memory

lowmem_reserve_ratio

Ref

  1. Kernel Documents/mm sysctl
  2. vm内核参数优化设置
  3. 32位系统,设定vm.min_free_kbytes时,需注意lowmem的值
  4. 淺析linux內核內存管理之結點與管理區初始化
  5. 内存域水印的作用与计算
  6. 初探lowmem_reserve_ratio