/proc/sys/vm/ 的文档¶
内核版本 2.6.29
版权所有 (c) 1998, 1999, Rik van Riel <riel@nl.linux.org>
版权所有 (c) 2008 Peter W. Morreale <pmorreale@novell.com>
有关一般信息和法律声明,请参阅/proc/sys 的文档。
此文件包含 /proc/sys/vm 中 sysctl 文件的文档,适用于 Linux 内核版本 2.6.29。
此目录中的文件可用于调整 Linux 内核虚拟内存 (VM) 子系统的操作以及脏数据写入磁盘的方式。
大多数这些文件的默认值和初始化例程可在 mm/swap.c 中找到。
目前,这些文件位于 /proc/sys/vm 中
admin_reserve_kbytes
compact_memory
compaction_proactiveness
compact_unevictable_allowed
defrag_mode
dirty_background_bytes
dirty_background_ratio
dirty_bytes
dirty_expire_centisecs
dirty_ratio
dirtytime_expire_seconds
dirty_writeback_centisecs
drop_caches
enable_soft_offline
extfrag_threshold
highmem_is_dirtyable
hugetlb_shm_group
laptop_mode
legacy_va_layout
lowmem_reserve_ratio
max_map_count
mem_profiling (仅当 CONFIG_MEM_ALLOC_PROFILING=y 时)
memory_failure_early_kill
memory_failure_recovery
min_free_kbytes
min_slab_ratio
min_unmapped_ratio
mmap_min_addr
mmap_rnd_bits
mmap_rnd_compat_bits
nr_hugepages
nr_hugepages_mempolicy
nr_overcommit_hugepages
nr_trim_pages (仅当 CONFIG_MMU=n 时)
numa_zonelist_order
oom_dump_tasks
oom_kill_allocating_task
overcommit_kbytes
overcommit_memory
overcommit_ratio
page-cluster
page_lock_unfairness
panic_on_oom
percpu_pagelist_high_fraction
stat_interval
stat_refresh
numa_stat
swappiness
unprivileged_userfaultfd
user_reserve_kbytes
vfs_cache_pressure
vfs_cache_pressure_denom
watermark_boost_factor
watermark_scale_factor
zone_reclaim_mode
admin_reserve_kbytes¶
系统中应为具有 cap_sys_admin 能力的用户保留的空闲内存量。
admin_reserve_kbytes 默认为 min(3% 的空闲页, 8MB)。
在默认的内存过量分配“猜测”模式下,这应该能为管理员提供足够的内存来登录并终止进程(如果需要)。
在内存过量分配“从不”模式下运行的系统应增加此值,以考虑用于恢复的程序的完整虚拟内存大小。否则,root 用户可能无法登录以恢复系统。
如何计算最小有用储备?
sshd 或 login + bash(或其他 shell)+ top(或 ps、kill 等)
对于过量分配“猜测”模式,我们可以汇总常驻集大小 (RSS)。在 x86_64 上约为 8MB。
对于过量分配“从不”模式,我们可以取它们虚拟大小 (VSZ) 的最大值,然后加上它们的 RSS 总和。在 x86_64 上约为 128MB。
更改此设置会在应用程序请求内存时立即生效。
compact_memory¶
仅当设置了 CONFIG_COMPACTION 时可用。当向文件写入 1 时,所有区域都会被整理,以便尽可能以连续块的形式提供空闲内存。这对于例如巨页的分配很重要,尽管进程也会根据需要直接整理内存。
compaction_proactiveness¶
此可调参数的取值范围为 [0, 100],默认值为 20。此可调参数决定了后台整理的积极程度。向此可调参数写入非零值将立即触发主动整理。将其设置为 0 则禁用主动整理。
请注意,整理会对整个系统产生非平凡的影响,因为属于不同进程的页会被移动,这还可能导致不经意的应用程序出现延迟峰值。内核采用各种启发式方法,如果检测到主动整理无效,则会避免浪费 CPU 周期。
将该值设置在 80 以上,除了会降低可接受的碎片级别外,还会使整理代码对碎片增加更敏感,即整理会更频繁地触发,但每次减少的碎片量会更小。这使得碎片级别随着时间的推移更稳定。
请谨慎将其设置为极端值,如 100,因为这可能会导致过度的后台整理活动。
compact_unevictable_allowed¶
仅当 CONFIG_COMPACTION 设置时可用。设置为 1 时,允许内存整理检查不可收回的 LRU(mlocked 页面)以查找要整理的页面。这应在以下系统上使用:轻微页错误导致的停顿是可接受的,以换取大量连续的空闲内存。设置为 0 可防止内存整理移动不可收回的页面。默认值为 1。在 CONFIG_PREEMPT_RT 系统上,默认值为 0,以避免因内存整理而导致页错误,这会阻止任务在错误解决之前变为活动状态。
defrag_mode¶
设置为 1 时,页分配器会更努力地避免碎片化并保持生成巨页/高阶页的能力。
建议在启动后立即启用此功能,因为碎片一旦发生,可能会长期存在甚至永久存在。
dirty_background_bytes¶
包含后台内核刷新线程将开始回写时的脏内存量。
- 注意
dirty_background_bytes 是 dirty_background_ratio 的对应项。一次只能指定其中一个。当写入一个 sysctl 时,它会立即用于评估脏内存限制,而另一个在读取时显示为 0。
dirty_background_ratio¶
包含后台内核刷新线程将开始写出脏数据的脏页数,表示为包含空闲页和可回收页的总可用内存的百分比。
总可用内存不等于总系统内存。
dirty_bytes¶
包含生成磁盘写入的进程本身将开始回写时的脏内存量。
注意:dirty_bytes 是 dirty_ratio 的对应项。一次只能指定其中一个。当写入一个 sysctl 时,它会立即用于评估脏内存限制,而另一个在读取时显示为 0。
注意:dirty_bytes 允许的最小值为两个页面(以字节为单位);任何低于此限制的值都将被忽略,并保留旧配置。
dirty_expire_centisecs¶
此可调参数用于定义脏数据在内存中保留多长时间后,可以由内核刷新线程进行回写。它以百分之一秒为单位表示。在内存中脏数据超过此间隔后,在下一次刷新线程唤醒时将被写入。
dirty_ratio¶
包含生成磁盘写入的进程本身将开始写出脏数据的脏页数,表示为包含空闲页和可回收页的总可用内存的百分比。
总可用内存不等于总系统内存。
dirtytime_expire_seconds¶
当一个 lazytime inode 的页面持续被弄脏时,带有更新时间戳的 inode 将永远没有机会被写入。而且,如果文件系统上唯一发生的事情是由 atime 更新引起的 dirtytime inode,则会调度一个工作线程以确保该 inode 最终被推送到磁盘。此可调参数用于定义脏 inode 达到多长时间后可以由内核刷新线程进行回写。并且,它还用作唤醒 dirtytime_writeback 线程的间隔。
dirty_writeback_centisecs¶
内核刷新线程将定期唤醒并将旧数据写入磁盘。此可调参数以百分之一秒为单位表示这些唤醒之间的间隔。
将其设置为零将完全禁用定期回写。
drop_caches¶
写入此文件将导致内核丢弃干净的缓存,以及可回收的 slab 对象,如目录项 (dentries) 和 inode。一旦丢弃,它们的内存就变为可用。
释放页缓存
echo 1 > /proc/sys/vm/drop_caches
释放可回收的 slab 对象(包括目录项和 inode)
echo 2 > /proc/sys/vm/drop_caches
释放 slab 对象和页缓存
echo 3 > /proc/sys/vm/drop_caches
这是一个非破坏性操作,不会释放任何脏对象。要增加此操作释放的对象数量,用户可以在写入 /proc/sys/vm/drop_caches 之前运行 sync。这将最大程度地减少系统上的脏对象数量,并创建更多可丢弃的对象。
此文件并非用于控制各种内核缓存(inode、目录项、页缓存等)的增长。当系统其他地方需要内存时,这些对象会自动被内核回收。
使用此文件可能会导致性能问题。因为它丢弃了缓存对象,所以重新创建被丢弃的对象可能会花费大量的 I/O 和 CPU,特别是如果它们被大量使用。因此,不建议在测试或调试环境之外使用。
使用此文件时,您可能会在内核日志中看到信息性消息
cat (1234): drop_caches: 3
这些仅供参考。它们不表示您的系统有任何问题。要禁用它们,请向 drop_caches 写入 4(位 2)。
enable_soft_offline¶
可纠正的内存错误在服务器上非常常见。软离线是内核针对具有(过多)已纠正内存错误的内存页面的解决方案。
对于不同类型的页面,软离线具有不同的行为/成本。
对于一个原始错误页面,软离线会将使用中的页面内容迁移到一个新的原始页面。
对于透明巨页的一部分页面,软离线会将透明巨页拆分为原始页面,然后仅迁移原始错误页面。因此,用户透明地由少了 1 个巨页支持,影响内存访问性能。
对于 HugeTLB 巨页的一部分页面,软离线首先迁移整个 HugeTLB 巨页,在此期间会消耗一个空闲巨页作为迁移目标。然后,原始巨页被分解为原始页面,没有补偿,从而使 HugeTLB 池的容量减少 1。
在透明和 HugeTLB 情况下,由用户决定是在可靠性(远离脆弱的物理内存)与性能/容量影响之间进行选择。
对于所有架构,enable_soft_offline 控制是否对内存页进行软离线。当设置为 1 时,内核会在认为需要时尝试软离线页面。当设置为 0 时,内核对软离线页面的请求返回 EOPNOTSUPP。其默认值为 1。
值得一提的是,将 enable_soft_offline 设置为 0 后,以下软离线页面的请求将不会执行
来自 RAS 可纠正错误收集器的软离线页请求。
在 ARM 上,来自 GHES 驱动程序的软离线页请求。
在 PARISC 上,来自页面解除分配表的软离线页请求。
extfrag_threshold¶
此参数影响内核是压缩内存还是直接回收以满足高阶分配。debugfs 中的 extfrag/extfrag_index 文件显示了系统中每个区域每个阶的碎片化指数。接近 0 的值表示分配将因内存不足而失败,接近 1000 的值表示失败是由于碎片化,而 -1 表示只要满足水印,分配就会成功。
如果碎片化指数 <= extfrag_threshold,内核将不会在区域中压缩内存。默认值为 500。
highmem_is_dirtyable¶
仅适用于启用 CONFIG_HIGHMEM 的系统(32 位系统)。
此参数控制是否考虑高内存进行脏写者限制。默认情况下不考虑,这意味着只有内核直接可见/可用的内存才能被弄脏。结果,在内存量大且低内存基本耗尽的系统上,写入者可能会过早被限制,并且流式写入会变得非常缓慢。
将值更改为非零将允许更多内存被弄脏,从而允许写入者写入更多数据,这些数据可以更有效地刷新到存储。请注意,这也会带来过早 OOM killer 的风险,因为某些写入者(例如直接块设备写入)只能使用低内存,并且它们可以用脏数据填满低内存而没有任何限制。
hugetlb_shm_group¶
hugetlb_shm_group 包含允许使用 hugetlb 页创建 SysV 共享内存段的组 ID。
laptop_mode¶
laptop_mode 是一个控制“笔记本模式”的旋钮。由这个旋钮控制的所有内容都在如何使用笔记本模式省电中讨论。
legacy_va_layout¶
如果非零,此 sysctl 将禁用新的 32 位 mmap 布局 - 内核将为所有进程使用旧版 (2.4) 布局。
lowmem_reserve_ratio¶
对于高内存机器上的某些特殊工作负载,内核允许从“低内存”区域分配进程内存是危险的。这是因为该内存可能通过 mlock() 系统调用或由于交换空间不可用而被锁定。
在大容量高内存机器上,这种可回收低内存的不足可能是致命的。
因此,Linux 页分配器有一种机制,可以防止可能使用高内存的分配使用过多的低内存。这意味着一定量的低内存被保护,避免被捕获到锁定的用户内存中。
(同样的论点适用于旧的 16MB ISA DMA 区域。此机制还将保护该区域免受可能使用高内存或低内存的分配)。
可调参数lowmem_reserve_ratio决定了内核保护这些低区域的积极程度。
如果您的机器使用高内存或 ISA DMA,并且您的应用程序使用 mlock(),或者您在没有交换空间的情况下运行,那么您可能应该更改 lowmem_reserve_ratio 设置。
lowmem_reserve_ratio 是一个数组。您可以通过读取此文件来查看它们
% cat /proc/sys/vm/lowmem_reserve_ratio
256 256 32
但是,这些值不直接使用。内核根据它们计算每个区域的保护页数。这些在 /proc/zoneinfo 中显示为保护页数组,如下所示。(这是一个 x86-64 机器的示例)。每个区域都有一个这样的保护页数组
Node 0, zone DMA
pages free 1355
min 3
low 3
high 4
:
:
numa_other 0
protection: (0, 2004, 2004, 2004)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
pagesets
cpu: 0 pcp: 0
:
这些保护被添加到分数中,以判断该区域是否应该用于页面分配或是否应该被回收。
在此示例中,如果此 DMA 区域需要普通页面(索引=2),并且水印 [WMARK_HIGH] 用于水印,则内核判断不应使用此区域,因为 pages_free(1355) 小于水印 + protection[2] (4 + 2004 = 2008)。如果此保护值为 0,则此区域将用于普通页面需求。如果需求是 DMA 区域(索引=0),则使用 protection[0] (=0)。
zone[i] 的 protection[j] 由以下表达式计算
(i < j):
zone[i]->protection[j]
= (total sums of managed_pages from zone[i+1] to zone[j] on the node)
/ lowmem_reserve_ratio[i];
(i = j):
(should not be protected. = 0;
(i > j):
(not necessary, but looks 0)
lowmem_reserve_ratio[i] 的默认值为
256
(如果 zone[i] 表示 DMA 或 DMA32 区域)
32
(其他)
如上表达式所示,它们是比率的倒数。256 表示 1/256。保护页数约为节点上总管理页的“0.39%”。
如果您想保护更多页面,较小的值是有效的。最小值为 1 (1/1 -> 100%)。小于 1 的值将完全禁用页面保护。
max_map_count:¶
此文件包含进程可能拥有的最大内存映射区域数。内存映射区域是调用 malloc 的副作用、直接通过 mmap、mprotect 和 madvise,以及加载共享库时使用的。
虽然大多数应用程序需要少于一千个映射,但某些程序,特别是 malloc 调试器,可能会消耗大量映射,例如,每次分配多达一到两个映射。
默认值为 65530。
mem_profiling¶
启用内存分析(当 CONFIG_MEM_ALLOC_PROFILING=y 时)
1:启用内存分析。
0:禁用内存分析。
启用内存分析会对所有内存分配引入少量性能开销。
默认值取决于 CONFIG_MEM_ALLOC_PROFILING_ENABLED_BY_DEFAULT。
memory_failure_early_kill:¶
控制当硬件在后台检测到内核无法处理的未纠正内存错误(通常是内存模块中的 2 位错误)时如何终止进程。在某些情况下(例如页面在磁盘上仍有有效副本),内核将透明地处理故障,而不会影响任何应用程序。但如果没有其他最新数据副本,它将终止以防止任何数据损坏蔓延。
1:一旦检测到损坏,立即终止所有已映射损坏且无法重新加载页面的进程。请注意,这不支持少数类型的页面,例如内核内部分配的数据或交换缓存,但适用于大多数用户页面。
0:仅从所有进程中取消映射损坏的页面,并仅终止尝试访问该页面的进程。
终止操作使用 BUS_MCEERR_AO 的可捕获 SIGBUS 完成,因此进程如果需要可以处理此信号。
这仅在具有高级机器检查处理功能的架构/平台上激活,并取决于硬件能力。
应用程序可以使用 PR_MCE_KILL prctl 单独覆盖此设置
memory_failure_recovery¶
启用内存故障恢复(如果平台支持)
1: 尝试恢复。
0: 内存故障时始终恐慌。
min_free_kbytes¶
这用于强制 Linux VM 保持最小数量的空闲千字节。VM 使用此数字为系统中的每个低内存区域计算一个水印 [WMARK_MIN] 值。每个低内存区域根据其大小按比例获得一定数量的保留空闲页。
需要一些最小量的内存来满足 PF_MEMALLOC 分配;如果您将其设置低于 1024KB,您的系统将变得微妙地损坏,并在高负载下容易出现死锁。
将其设置过高将立即导致您的机器 OOM。
min_slab_ratio¶
此功能仅在 NUMA 内核上可用。
每个区域中总页面数的百分比。在区域回收(从本地区域回退发生)时,如果区域中超过此百分比的页面是可回收的 slab 页面,则将回收 slab。这确保了 slab 的增长保持在控制之下,即使在很少执行全局回收的 NUMA 系统中也是如此。
默认值为 5%。
请注意,slab 回收是以每区/节点的方式触发的。回收 slab 内存的过程目前不是节点特定的,并且可能不快。
min_unmapped_ratio¶
此功能仅在 NUMA 内核上可用。
这是每个区域中总页数的百分比。区域回收仅在超过此百分比的页处于 zone_reclaim_mode 允许回收的状态时才会发生。
如果 zone_reclaim_mode 的值通过 OR 运算包含 4,则该百分比将与所有文件支持的未映射页面(包括交换缓存页面和 tmpfs 文件)进行比较。否则,仅考虑由普通文件而非 tmpfs 文件和类似文件支持的未映射页面。
默认值为 1%。
mmap_min_addr¶
此文件指示用户进程将被限制 mmap 的地址空间量。由于内核空指针解引用错误可能会意外地根据内存前几页中的信息进行操作,因此不应允许用户空间进程写入这些页面。默认情况下,此值设置为 0,并且安全模块将不强制执行任何保护。将此值设置为例如 64k 将允许绝大多数应用程序正常工作,并为未来潜在的内核错误提供深度防御。
mmap_rnd_bits¶
此值可用于选择用于确定由 mmap 分配产生的 vma 区域基地址随机偏移的位数,适用于支持调整地址空间随机化的架构。此值将受架构支持的最小和最大值的限制。
此值可以在启动后使用 /proc/sys/vm/mmap_rnd_bits 可调参数进行更改
mmap_rnd_compat_bits¶
此值可用于选择用于确定由 mmap 分配产生的 vma 区域基地址随机偏移的位数,用于在兼容模式下运行的应用程序,适用于支持调整地址空间随机化的架构。此值将受架构支持的最小和最大值的限制。
此值可以在启动后使用 /proc/sys/vm/mmap_rnd_compat_bits 可调参数进行更改
nr_hugepages¶
更改巨页池的最小大小。
hugetlb_optimize_vmemmap¶
当“struct page”(include/linux/mm_types.h 中定义的结构)的大小不是 2 的幂(一种不寻常的系统配置可能导致此情况)时,此旋钮不可用。
启用(设置为 1)或禁用(设置为 0)HugeTLB Vmemmap 优化 (HVO)。
一旦启用,后续从 buddy allocator 分配的 HugeTLB 页面的 vmemmap 页面将得到优化(每 2MB HugeTLB 页面 7 页,每 1GB HugeTLB 页面 4095 页),而已分配的 HugeTLB 页面将不会被优化。当这些优化的 HugeTLB 页面从 HugeTLB 池释放到 buddy allocator 时,表示该范围的 vmemmap 页面需要重新映射,并且之前丢弃的 vmemmap 页面需要重新分配。如果您的用例是 HugeTLB 页面是“即时”分配的(例如,从不明确使用“nr_hugepages”分配 HugeTLB 页面,而只是设置“nr_overcommit_hugepages”,这些超额提交的 HugeTLB 页面是“即时”分配的),而不是从 HugeTLB 池中提取的,您应该权衡内存节省的好处与 HugeTLB 池和 buddy allocator 之间分配或释放 HugeTLB 页面的额外开销(比以前慢约 2 倍)。另一个需要注意的行为是,如果系统处于严重的内存压力下,它可能会阻止用户将 HugeTLB 页面从 HugeTLB 池释放到 buddy allocator,因为 vmemmap 页面的分配可能会失败,如果您的系统遇到这种情况,您必须稍后重试。
一旦禁用,后续从 buddy allocator 分配的 HugeTLB 页面的 vmemmap 页面将不会被优化,这意味着从 buddy allocator 分配时的额外开销消失,而已优化的 HugeTLB 页面将不受影响。如果您想确保没有优化的 HugeTLB 页面,您可以先将“nr_hugepages”设置为 0,然后禁用此功能。请注意,将 nr_hugepages 写入 0 将使任何“正在使用”的 HugeTLB 页面成为多余页面。因此,这些多余页面仍然被优化,直到它们不再被使用。您需要等待这些多余页面被释放,然后系统中才没有优化的页面。
nr_hugepages_mempolicy¶
在特定 NUMA 节点集上运行时更改巨页池的大小。
nr_overcommit_hugepages¶
更改巨页池的最大大小。最大值为 nr_hugepages + nr_overcommit_hugepages。
nr_trim_pages¶
此功能仅在 NOMMU 内核上可用。
此值调整了 2 的幂对齐 NOMMU mmap 分配的过量页面修剪行为。
值为 0 完全禁用分配修剪,而值为 1 则积极修剪过量页面。任何大于或等于 1 的值都用作水印,在此水印处启动分配修剪。
默认值为 1。
有关更多信息,请参阅无 MMU 内存映射支持。
numa_zonelist_order¶
此 sysctl 仅用于 NUMA,并且已弃用。除了节点顺序之外的任何值都将失败!
“内存从何处分配”由 zonelists 控制。
(此文档为简单解释,忽略 ZONE_HIGHMEM/ZONE_DMA32。您可以将 ZONE_DMA 理解为 ZONE_DMA32...)
在非 NUMA 情况下,GFP_KERNEL 的 zonelist 排序如下:ZONE_NORMAL -> ZONE_DMA。这意味着只有当 ZONE_NORMAL 不可用时,GFP_KERNEL 的内存分配请求才会从 ZONE_DMA 获取内存。
在 NUMA 情况下,您可以考虑以下两种排序类型。假设 2 节点 NUMA,以下是 Node(0) 的 GFP_KERNEL 的 zonelist
(A) Node(0) ZONE_NORMAL -> Node(0) ZONE_DMA -> Node(1) ZONE_NORMAL
(B) Node(0) ZONE_NORMAL -> Node(1) ZONE_NORMAL -> Node(0) ZONE_DMA.
类型(A)为 Node(0) 上的进程提供最佳局部性,但 ZONE_DMA 将在 ZONE_NORMAL 耗尽之前使用。这增加了 ZONE_DMA 内存不足 (OOM) 的可能性,因为 ZONE_DMA 往往较小。
类型(B)无法提供最佳局部性,但对 DMA 区域的 OOM 更具鲁棒性。
类型 (A) 称为“节点”顺序。类型 (B) 称为“区域”顺序。
“节点顺序”按节点排序 zonelist,然后按每个节点内的区域排序。指定“[Nn]ode”用于节点顺序。
“区域顺序”按区域类型排序 zonelist,然后按每个区域内的节点排序。指定“[Zz]one”用于区域顺序。
指定“[Dd]efault”请求自动配置。
在 32 位系统上,普通区域需要为内核可访问的分配保留,因此将选择“区域”顺序。
在 64 位系统上,需要 DMA32/DMA 的设备相对较少,因此将选择“节点”顺序。
除非对您的系统/应用程序造成问题,否则建议使用默认顺序。
oom_dump_tasks¶
当内核执行 OOM-killing 时,启用系统范围的任务转储(不包括内核线程),并包含 pid、uid、tgid、vm 大小、rss、pgtables_bytes、swapents、oom_score_adj 分数和名称等信息。这有助于确定为什么调用了 OOM killer,识别导致它的恶意任务,并确定 OOM killer 为什么选择杀死它所选择的任务。
如果此值设置为零,则此信息将被抑制。在具有数千个任务的超大型系统上,为每个任务转储内存状态信息可能不可行。此类系统在 OOM 条件下不应被迫承受性能损失,因为可能不需要这些信息。
如果此值设置为非零,则只要 OOM killer 实际杀死了一个占用大量内存的任务,就会显示此信息。
默认值为 1(启用)。
oom_kill_allocating_task¶
此选项用于启用或禁用在内存不足情况下终止触发 OOM 的任务。
如果此值设置为零,则 OOM killer 将遍历整个任务列表,并根据启发式算法选择一个任务进行终止。这通常会选择一个恶意占用内存的任务,该任务在被终止时会释放大量内存。
如果此值设置为非零,则 OOM killer 只会终止触发内存不足状况的任务。这避免了昂贵的任务列表扫描。
如果选择了 panic_on_oom,则它优先于 oom_kill_allocating_task 中使用的任何值。
默认值为 0。
overcommit_kbytes¶
当 overcommit_memory 设置为 2 时,已提交的地址空间不允许超过交换空间加上此物理 RAM 量。见下文。
注意:overcommit_kbytes 是 overcommit_ratio 的对应项。一次只能指定其中一个。设置其中一个会禁用另一个(读取时显示为 0)。
overcommit_memory¶
此值包含一个标志,用于启用内存过量承诺。
当此标志为 0 时,内核会将用户空间内存请求大小与总内存加上交换空间进行比较,并拒绝明显的过量承诺。
当此标志为 1 时,内核假装内存总是充足,直到实际耗尽。
当此标志为 2 时,内核使用“永不过量承诺”策略,尝试防止任何内存过量承诺。请注意 user_reserve_kbytes 影响此策略。
此功能非常有用,因为有许多程序会“以防万一”malloc() 大量内存,但实际使用量却很少。
默认值为 0。
有关更多信息,请参阅过量承诺记账和 mm/util.c::__vm_enough_memory()。
overcommit_ratio¶
当 overcommit_memory 设置为 2 时,已提交的地址空间不允许超过交换空间加上此物理 RAM 百分比。见上文。
page-cluster¶
page-cluster 控制一次性从交换空间读入的连续页面的数量。这是页面缓存预读的交换对应物。所提及的连续性并非指虚拟/物理地址上的连续,而是在交换空间上的连续——这意味着它们是一起被交换出去的。
它是一个对数值——设置为零意味着“1 页”,设置为 1 意味着“2 页”,设置为 2 意味着“4 页”等等。零完全禁用交换预读。
默认值为三(一次八页)。如果您的工作负载是交换密集型的,调整此值可能会带来一些小好处。
较低的值意味着初始故障的延迟较低,但同时如果它们本可以成为连续页面预读的一部分,则后续故障的额外故障和 I/O 延迟会增加。
page_lock_unfairness¶
此值决定了页面锁可以从等待者手中被“偷走”的次数。在锁被偷走此文件中指定的次数(默认值为 5)之后,“公平锁交接”语义将生效,并且只有当锁可以被获取时,等待者才会被唤醒。
panic_on_oom¶
此选项用于启用或禁用内存不足时恐慌功能。
如果此设置为 0,内核将杀死一些流氓进程,称为 oom_killer。通常,oom_killer 可以杀死流氓进程,系统将得以幸存。
如果此设置为 1,当内存不足发生时,内核会恐慌。但是,如果一个进程通过 mempolicy/cpusets 限制了其节点使用,并且这些节点达到内存耗尽状态,一个进程可能会被 oom-killer 杀死。在这种情况下不会发生恐慌。因为其他节点的内存可能仍然空闲。这意味着系统整体状态可能还没有到致命的地步。
如果此设置为 2,即使在上述情况下,内核也会强制恐慌。即使在内存 cgroup 下发生 OOM,整个系统也会恐慌。
默认值为 0。
1 和 2 用于集群的故障转移。请根据您的故障转移策略进行选择。
panic_on_oom=2 + kdump 为您提供了非常有力的工具来调查 OOM 发生的原因。您可以获取快照。
percpu_pagelist_high_fraction¶
这是每个区域中可以存储到 per-cpu 页列表中的页的比例。它是一个上限,根据在线 CPU 数量进行划分。最小值为 8,这意味着我们不允许每个区域中超过 1/8 的页存储在 per-cpu 页列表中。此条目仅更改热 per-cpu 页列表的值。用户可以指定一个数字,例如 100,以在 per-cpu 列表之间分配每个区域的 1/100。
每个 per-cpu 页列表的批处理值保持不变,无论高比例的值如何,因此分配延迟不受影响。
初始值为零。内核使用此值根据区域的低水位线和本地在线 CPU 的数量设置高 pcp->high 标记。如果用户向此 sysctl 写入“0”,它将恢复到此默认行为。
stat_interval¶
虚拟机统计信息更新的时间间隔。默认值为 1 秒。
stat_refresh¶
任何读取或写入(仅限 root 用户)都会将所有每 CPU 的 vm 统计信息刷新到其全局总量中,以便在测试时提供更准确的报告,例如 cat /proc/sys/vm/stat_refresh /proc/meminfo
附带影响是,它还会检查负数总量(在其他地方报告为 0),如果发现任何负数,则会以 EINVAL 状态“失败”,并在 dmesg 中发出警告。(截至撰写本文时,已知某些统计信息有时会发现负数,但没有不良影响:这些统计信息的错误和警告已被抑制。)
numa_stat¶
此接口允许运行时配置 NUMA 统计信息。
当页面分配性能成为瓶颈,并且您可以容忍某些可能的工具损坏和 NUMA 计数器精度降低时,您可以这样做
echo 0 > /proc/sys/vm/numa_stat
当页面分配性能不是瓶颈并且您希望所有工具都能工作时,您可以这样做
echo 1 > /proc/sys/vm/numa_stat
swappiness¶
此控制用于定义交换和文件系统分页的粗略相对 IO 成本,取值范围为 0 到 200。在 100 时,VM 假定 IO 成本相等,因此将对页缓存和交换支持的页面施加相同的内存压力;较低的值表示交换 IO 更昂贵,较高的值表示更便宜。
请记住,在内存压力下,文件系统 IO 模式往往比交换的随机 IO 更有效。最佳值需要通过实验确定,并且还会因工作负载而异。
默认值为 60。
对于内存交换,例如 zram 或 zswap,以及在比文件系统更快的设备上进行交换的混合设置,可以考虑超过 100 的值。例如,如果对交换设备的随机 IO 平均比文件系统 IO 快 2 倍,则 swappiness 应为 133(x + 2x = 200,2x = 133.33)。
在 0 时,内核不会启动交换,直到一个区域中的空闲页面和文件支持页面数量少于高水位线。
unprivileged_userfaultfd¶
此标志控制非特权用户可以使用 userfaultfd 系统调用的模式。将其设置为 0 以限制非特权用户仅在用户模式下处理页面故障。在这种情况下,没有 SYS_CAP_PTRACE 的用户必须传递 UFFD_USER_MODE_ONLY 才能使 userfaultfd 成功。禁止使用 userfaultfd 处理来自内核模式的故障可能会使某些漏洞更难被利用。
将其设置为 1 以允许非特权用户不受限制地使用 userfaultfd 系统调用。
默认值为 0。
控制 userfaultfd 权限的另一种方法是使用 /dev/userfaultfd 而不是 userfaultfd(2)。请参阅Userfaultfd。
user_reserve_kbytes¶
当 overcommit_memory 设置为 2(“永不过量分配”模式)时,保留 min(当前进程大小的 3%, user_reserve_kbytes) 的空闲内存。这是为了防止用户启动一个占用大量内存的进程,导致他们无法恢复(杀死该进程)。
user_reserve_kbytes 默认设置为 min(当前进程大小的 3%, 128MB)。
如果此值减小到零,则将允许用户通过单个进程分配所有空闲内存,减去 admin_reserve_kbytes。任何后续尝试执行命令都将导致“fork: 无法分配内存”。
更改此设置会在应用程序请求内存时立即生效。
vfs_cache_pressure¶
此百分比值控制内核回收用于缓存目录和 inode 对象的内存的倾向。
在 vfs_cache_pressure=vfs_cache_pressure_denom 的默认值下,内核将尝试以相对于 pagecache 和 swapcache 回收的“公平”速率回收目录项和 inode。降低 vfs_cache_pressure 会使内核更倾向于保留目录项和 inode 缓存。当 vfs_cache_pressure=0 时,内核绝不会因内存压力而回收目录项和 inode,这很容易导致内存不足的情况。将 vfs_cache_pressure 增加到超过 vfs_cache_pressure_denom 会使内核更倾向于回收目录项和 inode。
将 vfs_cache_pressure 显著增加到超过 vfs_cache_pressure_denom 可能会对性能产生负面影响。回收代码需要获取各种锁才能找到可释放的目录和 inode 对象。当 vfs_cache_pressure 等于 (10 * vfs_cache_pressure_denom) 时,它将查找比现有数量多十倍的可释放对象。
注意:此设置应始终与 vfs_cache_pressure_denom 一起使用。
vfs_cache_pressure_denom¶
默认值为 100(允许的最小值)。需要相应的 vfs_cache_pressure 设置才能生效。
watermark_boost_factor¶
此因子控制内存碎片化时的回收级别。它定义了一个区域高水位线的百分比,当不同移动性的页混合在页块中时,将回收该百分比的内存。其目的是让整理在未来减少工作量,并提高未来高阶分配(如 SLUB 分配、THP 和 hugetlbfs 页)的成功率。
为了与 watermark_scale_factor 参数保持一致,单位是万分之一。默认值 15,000 意味着如果由于碎片化导致页块混合,将回收高达高水位线 150% 的内存。回收级别由近期发生的碎片化事件数量决定。如果此值小于一个页块,则将回收一个页块的页(例如,64 位 x86 上为 2MB)。提升因子为 0 将禁用此功能。
watermark_scale_factor¶
此因子控制 kswapd 的积极性。它定义了节点/系统中剩余内存量达到多少时 kswapd 会被唤醒,以及需要多少内存空闲时 kswapd 才会再次进入休眠状态。
单位为万分之一。默认值为 10,表示水印之间的距离是节点/系统中可用内存的 0.1%。最大值为 3000,即内存的 30%。
如果大量线程进入直接回收 (allocstall) 或 kswapd 过早进入休眠 (kswapd_low_wmark_hit_quickly),这可能表明 kswapd 为延迟原因维护的空闲页面数量太少,无法满足系统中发生的分配突发。此时可以使用此旋钮相应地调整 kswapd 的积极性。
zone_reclaim_mode¶
zone_reclaim_mode 允许用户设置在某个区域内存耗尽时,回收内存的积极程度。如果将其设置为零,则不进行区域回收。分配将从系统中其他区域/节点满足。
这是通过 OR 运算组合的值
1 |
区域回收开启 |
2 |
区域回收写出脏页 |
4 |
区域回收交换页 |
zone_reclaim_mode 默认禁用。对于文件服务器或受益于数据缓存的工作负载,应禁用 zone_reclaim_mode,因为缓存效果可能比数据局部性更重要。
如果已知工作负载已被分区,并且每个分区都适合 NUMA 节点内,并且访问远程内存会导致可测量的性能下降,则考虑启用一个或多个 zone_reclaim 模式位。页分配器在分配离节点页面之前将采取额外措施。
允许区域回收写出页面可以阻止写入大量数据的进程在其他节点上弄脏页面。如果区域已满,区域回收将写出脏页面,从而有效地限制进程。这可能会降低单个进程的性能,因为它无法再使用所有系统内存来缓冲传出写入,但它保留了其他节点上的内存,以便其他节点上运行的其他进程的性能不会受到影响。
允许常规交换有效地将分配限制在本地节点,除非通过内存策略或 cpuset 配置明确覆盖。