38.3. 虚拟内存参数

虚拟内存参数列在 /proc/sys/vm 目录中。

以下是可用的虚拟内存参数:

vm.dirty_ratio
是一个百分比值。修改系统内存占总内存的百分比时,系统通过 pdflush 操作开始向磁盘写入修改。默认值为 20 百分比。
vm.dirty_background_ratio
一个百分比值。修改系统内存占总内存的百分比时,系统会在后台开始向磁盘写入修改。默认值为 10(百分比)。
vm.overcommit_memory

定义决定接受或拒绝大型内存请求的条件。默认值为 0

默认情况下,内核会执行检查虚拟内存分配请求是否适合于存在的内存量 (total + swap),并只拒绝大型请求。否则会授予虚拟内存分配,这就意味着它们允许内存过量使用。

设置 overcommit_memory 参数的值:

  • 当这个参数设置为 1 时,内核不会执行内存过量使用处理。这会增加内存过载的可能性,但提高了内存密集型任务的性能。
  • 当这个参数设定为 2 时,内核拒绝对内存的请求(等于或大于可用交换空间总量)以及 overcommit_ratio 中指定的物理 RAM 百分比。这可降低过量使用内存的风险,但建议只针对交换区大于其物理内存的系统。
vm.overcommit_ratio
overcommit_memory 设为 2 时,指定物理 RAM 的百分比。默认值为 50
vm.max_map_count
定义进程可以使用的最大内存映射区域数。默认值为 65530。如果您的应用程序需要更多内存映射区域,则提高这个值。
vm.min_free_kbytes

设置保留可用页面池的大小。它还负责设置管理 Linux 内核页面回收算法行为的 min_pagelow_pagehigh_page 阈值。它还指定在系统间保留的最小 KB 数。这会为每个低内存区计算一个特定值,每个值都会被分配一个保留的空闲页面的大小。

设置 vm.min_free_kbytes 参数的值:

  • 增加参数值可有效减少应用程序工作集可用内存。因此,您可能希望将其仅用于内核驱动的工作负载,其中驱动程序缓冲区需要在原子上下文中分配。
  • 减少参数值可能会导致内核无法服务系统请求,如果内存在系统中发生大量处理。

    警告

    极端的值可能会降低系统性能。将 vm.min_free_kbytes 设置为非常低的值可防止系统有效地回收内存,这可能会导致系统崩溃并失败服务中断或其他内核服务。但是,设置 vm.min_free_kbytes 太大地增加系统回收活动,从而导致分配延迟因为假的直接重新声明状态而造成分配延迟。这可能导致系统立即进入内存不足状态。

    vm.min_free_kbytes 参数还设置页面重新声明水位线,名为 min_pages。在确定两个其他内存水位线、low_pageshigh_pages 时,这个水位线被用作一个因素,它管理页面重新声明算法。

/proc/PID/oom_adj

如果系统内存不足,并且 panic_on_oom 参数设置为 0oom_killer 功能会终止进程,从具有最高 oom_score 的进程开始,直到系统恢复为止。

oom_adj 参数决定了进程的 oom_score。这个参数会根据进程标识符设置。值 -17 可禁用该进程的 oom_killer。其他有效的值范围从 -1615

注意

由调整的进程创建的进程将继承该进程的 oom_score

vm.swappiness

swappiness 值范围从 0200,控制系统从匿名内存池回收内存或页面缓存内存池的程度。

设置 swappiness 参数值:

  • 高的数值代表,优先选择文件映射驱动的工作负载,同时交换出不活跃访问的进程的 RAM 匿名映射内存。这对文件服务器或流式应用(来自存储中的文件)很有用,从而驻留在内存上,以减少服务请求的 I/O 延迟。
  • 低值优先选择匿名映射驱动的工作负载,同时回收页面缓存(文件映射内存)。这个设置对于不依赖于文件系统信息的应用程序很有用,并且主要利用动态分配和私有内存,如数学和数字缩小应用程序,以及某些硬件虚拟化超级visors (如 QEMU)。

    vm.swappiness 参数的默认值为 60

    警告

    vm.swappiness 设置为 0 会积极避免将匿名内存交换出磁盘,这会在内存不足或 I/O 密集型工作负载时,增加了进程被 oom_killer 函数终止的风险。

其他资源