[Linux 内核]翻译kernel-4.4.94/Documentation/sysctl/vm.txt
针对 /proc/sys/vm/* 的文档 内核版本 2.6.29
© 1998, 1999, Rik van Riel riel@nl.linux.org
© 2008 Peter W. Morreale pmorreale@novell.com
通用信息与法律声明请参阅 README。
==============================================================
本文件记录了 /proc/sys/vm 目录下的 sysctl 文件,适用于 Linux 内核 2.6.29。
该目录中的文件可用于调优 Linux 内核虚拟内存(VM)子系统的行为,以及脏数据写回磁盘的策略。
大多数文件的默认值与初始化逻辑可在 mm/swap.c 中找到。
当前 /proc/sys/vm 包含以下文件:
- admin_reserve_kbytes
- block_dump
- compact_memory
- compact_unevictable_allowed
- dirty_background_bytes
- dirty_background_ratio
- dirty_bytes
- dirty_expire_centisecs
- dirty_ratio
- dirty_writeback_centisecs
- drop_caches
- extfrag_threshold
- hugepages_treat_as_movable
- hugetlb_shm_group
- laptop_mode
- legacy_va_layout
- lowmem_reserve_ratio
- max_map_count
- memory_failure_early_kill
- memory_failure_recovery
- min_free_kbytes
- min_slab_ratio
- min_unmapped_ratio
- mmap_min_addr
- nr_hugepages
- 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
- panic_on_oom
- percpu_pagelist_fraction
- stat_interval
- swappiness
- user_reserve_kbytes
- vfs_cache_pressure
- zone_reclaim_mode
==============================================================
admin_reserve_kbytes
系统中为具备 cap_sys_admin 能力的用户预留的空闲内存量(单位:KB)。
admin_reserve_kbytes 默认值为 min(空闲页的 3%,8MB)。
在默认的 overcommit “猜测(guess)”模式下,这应足以让管理员登录并在必要时杀掉进程。
在 overcommit “从不(never)”模式下,系统应当将该值增大,以涵盖用于恢复操作的程序的完整虚拟内存大小(Virtual Memory Size)。否则,root 可能无法登录恢复系统。
如何计算一个最低实用的预留值?
示例:sshd 或 login + bash(或其他 shell)+ top(或 ps、kill 等)。
对于 overcommit “guess”,可以累加其常驻集大小(RSS)。在 x86_64 上约为 8MB。
对于 overcommit “never”,取它们的虚拟大小(VSZ)中的最大值,并加上 RSS 的总和。在 x86_64 上约为 128MB。
修改该值在应用程序请求内存时生效。
==============================================================
block_dump
当设置为非零值时,启用块设备 I/O 调试。关于块 I/O 调试的更多信息,参见 Documentation/laptops/laptop-mode.txt。
==============================================================
compact_memory
仅在启用 CONFIG_COMPACTION 时可用。向该文件写入 1,将对所有内存域(zone)进行内存压实(compaction),尽可能地使空闲内存在物理上呈连续块。这对分配巨页(huge pages)很重要;同时,进程在需要时也会直接进行内存压实。
==============================================================
compact_unevictable_allowed
仅在启用 CONFIG_COMPACTION 时可用。当设置为 1 时,压实操作允许检查不可回收(unevictable)LRU(例如被 mlock 锁定的页)以进行移动。这适用于将小缺页(minor page fault)的卡顿作为可接受代价来换取更大的连续空闲内存的系统。设置为 0 则阻止移动不可回收页。默认值为 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
此调节项用于定义“脏”数据在内存中驻留多久后,才有资格被内核刷新线程写回。单位为百分之一秒(centisecs)。数据在内存中的脏驻留时间超过该间隔时,会在下次刷新线程唤醒时被写出。
==============================================================
dirty_ratio
以“包含空闲页与可回收页的总可用内存”的百分比表示。当进程生成磁盘写操作时,当脏内存达到该比例,该进程自身将开始写出脏数据。
注意:总可用内存并不等于系统总内存。
==============================================================
dirty_writeback_centisecs
内核刷新线程会周期性唤醒并将“较旧”的数据写回磁盘。该调节项以百分之一秒(centisecs)表示唤醒间隔。
将其设为 0 可完全禁用周期性写回。
==============================================================
drop_caches
对该文件写入将使内核丢弃“干净”的缓存,以及可回收的 slab 对象(如 dentry 与 inode)。一旦丢弃,它们占用的内存将被释放。
释放页缓存:
echo 1 > /proc/sys/vm/drop_caches
释放可回收 slab 对象(包括 dentry 与 inode):
echo 2 > /proc/sys/vm/drop_caches
同时释放 slab 对象与页缓存:
echo 3 > /proc/sys/vm/drop_caches
该操作是非破坏性的,不会释放任何“脏”的对象。为增加本操作可释放对象的数量,用户可在写入 /proc/sys/vm/drop_caches 前先运行 sync。这将最小化系统中的“脏”对象数量,从而创建更多可被丢弃的候选对象。
该文件并不是用来控制各类内核缓存(inode、dentry、页缓存等)增长的手段。这些对象在系统其他地方需要内存时会被内核自动回收。
使用该文件可能导致性能问题。由于其丢弃了缓存对象,可能需要大量 I/O 与 CPU 来重建被丢弃的对象,尤其在它们使用频繁的情况下。因此,除测试或调试环境外不推荐使用。
当使用该文件时,你可能会在内核日志中看到信息性消息:
cat (1234): drop_caches: 3
这些仅为信息提示,并不表示系统出现问题。要禁用这些消息,可向 drop_caches 写入 4(第 3 位)。
==============================================================
extfrag_threshold
该参数影响内核在满足高阶(高阶页)分配时,是选择进行内存压实(compaction)还是直接回收(direct reclaim)。debugfs 中的 extfrag/extfrag_index 文件显示系统中每个内存域的各阶的碎片化指数。接近 0 的值意味着分配失败是由于内存不足;接近 1000 的值意味着分配失败是由于碎片化;-1 表示只要水位线满足,分配就会成功。
如果某个内存域的碎片化指数 <= extfrag_threshold,内核将不会对该域进行压实。默认值为 500。
==============================================================
hugepages_treat_as_movable
该参数控制是否允许从 ZONE_MOVABLE 分配巨页(hugepages)。若设置为非零,巨页可从 ZONE_MOVABLE 分配。ZONE_MOVABLE 是在内核启动参数 kernelcore= 指定后创建的,因此如果未使用 kernelcore=,该参数无效。
在部分情况下(依赖架构与巨页大小),巨页迁移(hugepage migration)是可用的。如果某个巨页支持迁移,则无论该参数取值如何,均允许从 ZONE_MOVABLE 进行分配。换言之,该参数仅影响不可迁移的巨页。
==============================================================
hugetlb_shm_group
hugetlb_shm_group 包含允许使用 hugetlb 页创建 SysV 共享内存段(shm)的组 ID。
==============================================================
laptop_mode
laptop_mode 是一个开关,用于控制“笔记本模式”。该模式下的所有行为均在 Documentation/laptops/laptop-mode.txt 中讨论。
==============================================================
legacy_va_layout
若非零,则该 sysctl 禁用新的 32 位 mmap 布局——内核将对所有进程使用传统(2.4)布局。
==============================================================
lowmem_reserve_ratio
针对在高内存(highmem)机器上的一些特定工作负载,允许进程内存从“低内存(lowmem)”域分配可能是危险的。这是因为该内存可能会通过 mlock() 系统调用被固定(pinned),或由于无可用交换空间而无法回收。
在大型 highmem 机器上,这种缺少可回收的 lowmem 内存可能是致命的。
因此,Linux 页分配器提供了一种机制,防止原本可以使用 highmem 的分配过多地使用 lowmem。这意味着会保留一定数量的 lowmem,避免被捕获为固定的用户内存。
(同样的论点适用于旧的 16MB ISA DMA 区域。该机制也会保护该区域不被原本可以使用 highmem 或 lowmem 的分配所占用。)
可调项 lowmem_reserve_ratio 决定内核在保护这些较低内存域时的激进程度。
如果你的机器使用 highmem 或 ISA DMA,且你的应用程序调用了 mlock(),或你在无交换空间(swap)运行,那么你可能需要修改 lowmem_reserve_ratio。
lowmem_reserve_ratio 是一个数组。你可以通过读取该文件来查看:
% cat /proc/sys/vm/lowmem_reserve_ratio
256 256 32
注意:该数组的元素数量比内存域(zone)数量少一个。因为最高的内存域在后续计算中不需要该值。
但这些值并非直接使用。内核会据此为每个内存域计算“保护页数(protection pages)”。这些值以数组形式显示在 /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 域(index=0)发起的是“普通页(normal pages,index=2)”需求,且使用的水位线为 watermark[WMARK_HIGH],则内核会判断不应使用该 DMA 域,因为 pages_free(1355) 小于 watermark + protection[2](4 + 2004 = 2008)。如果保护值为 0,则该域会被用于普通页需求。如果需求本身是 DMA 域(index=0),则使用 protection[0](=0)。
zone[i] 的 protection[j] 按以下公式计算:
(i < j):
zone[i]->protection[j]
= (从 zone[i+1] 到 zone[j] 的所有 managed_pages 在该节点上的总和)
/ lowmem_reserve_ratio[i];
(i = j):
不需要保护,值为 0;
(i > j):
不需要(视为 0)。
lowmem_reserve_ratio[i] 的默认值:
256(如果 zone[i] 表示 DMA 或 DMA32 域)
32(其他情况)。
如上式,它们是“比例的倒数”。256 表示 1/256。保护页的数量约为该节点上更高内存域的总 managed_pages 的 0.39%。
如果希望保护更多页,减小该值更有效。最小值为 1(1/1 -> 100%)。
==============================================================
max_map_count
该文件包含单个进程可拥有的最大内存映射区域数量。内存映射区域可能作为调用 malloc 的副作用产生,也可由 mmap、mprotect 直接创建,加载共享库也会使用到它们。
大多数应用只需要不到一千个映射,但特定程序(尤其是 malloc 调试器)可能消耗大量映射,例如每次分配消耗一到两个映射。
默认值为 65536。
==============================================================
memory_failure_early_kill
控制在后台检测到不可纠正的内存错误(通常是内存条上的 2bit 错误)且内核无法处理时,如何杀死进程。在某些情况下(如该页在磁盘上还有有效副本),内核会透明地处理该错误,不影响应用。但如果数据没有其他最新副本,内核会杀死进程以防止数据损坏传播。
1:一旦检测到损坏且无法重新加载的页,立即杀死所有映射了该页的进程。注意这不适用于少数页类型(如内核内部分配的数据或交换缓存),但对大多数用户页有效。
0:仅从所有进程中解除映射该损坏页,只有在进程尝试访问该页时才杀死该进程。
杀死操作通过可捕获的 SIGBUS(BUS_MCEERR_AO)进行,进程可以选择处理。
该功能仅在具有高级机器检查(machine check)处理的体系结构/平台上激活,并取决于硬件能力。
应用可通过 PR_MCE_KILL prctl 单独覆盖该设置。
==============================================================
memory_failure_recovery
启用内存错误恢复(当平台支持时)。
1:尝试恢复。
0:在内存错误时始终 panic。
==============================================================
min_free_kbytes
用于强制 Linux VM 保持最小的空闲内存(单位:KB)。VM 使用该值为系统中的每个 lowmem 域计算 watermark[WMARK_MIN]。每个 lowmem 域将按其大小比例获得一定数量的保留空闲页。
满足 PF_MEMALLOC 分配需要最小量的内存;如果将该值设置到低于 1024KB,系统将出现微妙问题,并在高负载下易于死锁。
设置过高会立即导致系统 OOM。
==============================================================
min_slab_ratio
仅在 NUMA 内核中可用。
这是每个内存域总页数的一个百分比。在发生内存域回收(即从本地域回退进行分配)时,如果某个域中可回收 slab 页的百分比超过该值,则将回收 slab。该项确保即使在很少执行全局回收的 NUMA 系统中,slab 增长仍受控制。
默认值为 5%。
注意 slab 回收是在每个域/节点的维度上触发。当前回收 slab 的过程并非节点特定,因此可能不够快速。
==============================================================
min_unmapped_ratio
仅在 NUMA 内核中可用。
这是每个内存域总页数的一个百分比。仅当某个域中处于 zone_reclaim_mode 所允许回收的状态的页超过该百分比时,才会触发域回收。
如果 zone_reclaim_mode 包含值 4(按位或),则该百分比与所有文件支持的未映射页进行比较,包括交换缓存(swapcache)页与 tmpfs 文件。否则,仅考虑由普通文件支持的未映射页,不包括 tmpfs 等。
默认值为 1%。
==============================================================
mmap_min_addr
该文件指示用户进程被禁止映射的地址空间大小。由于内核空指针解引用(null dereference)错误可能会基于内存前几页的信息误操作,用户态进程不应被允许写入这些区域。默认值为 0,安全模块不会强制执行此保护。将其设置为类似 64k 的值,能够让绝大多数应用正常工作,同时为可能的内核漏洞提供纵深防御。
==============================================================
nr_hugepages
修改巨页池的最小大小。
参见 Documentation/vm/hugetlbpage.txt。
==============================================================
nr_overcommit_hugepages
修改巨页池的最大大小。最大值为 nr_hugepages + nr_overcommit_hugepages。
参见 Documentation/vm/hugetlbpage.txt。
==============================================================
nr_trim_pages
仅在 NOMMU 内核中可用。
该值用于调节以 2 的幂对齐的 NOMMU mmap 分配的“多余页裁剪(excess page trimming)”行为。
值为 0 时完全禁用裁剪;值为 1 时积极裁剪多余页。任何 >=1 的值都作为触发裁剪的水位线。
默认值为 1。
更多信息参见 Documentation/nommu-mmap.txt。
==============================================================
numa_zonelist_order
该 sysctl 仅适用于 NUMA。
内存从何处分配由 zonelist 决定。(为便于说明,本节忽略 ZONE_HIGHMEM/ZONE_DMA32……可以将 ZONE_DMA 理解为 ZONE_DMA32 的情形。)
在非 NUMA 情况下,GFP_KERNEL 的 zonelist 顺序如下:
ZONE_NORMAL -> ZONE_DMA
这意味着只有当 ZONE_NORMAL 不可用时,GFP_KERNEL 的分配请求才会从 ZONE_DMA 获取内存。
在 NUMA 情况下,可以考虑以下两种顺序。假设是双节点 NUMA,以下为节点 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)为节点 0 的进程提供最佳局部性,但在 ZONE_NORMAL 耗尽前就会使用 ZONE_DMA。这增加了 ZONE_DMA OOM 的可能性,因为 ZONE_DMA 通常较小。
类型(B)不能提供最佳局部性,但对 ZONE_DMA 的 OOM 更具鲁棒性。
类型(A)称为“节点(Node)”顺序;类型(B)称为“域(Zone)”顺序。
“节点顺序”表示先按节点排序,再在节点内按域排序。指定“[Nn]ode”选择节点顺序。
“域顺序”表示先按域类型排序,再在每个域内按节点排序。指定“[Zz]one”选择域顺序。
指定“[Dd]efault”表示请求自动配置。自动配置在以下情况选择“节点”顺序:
(1)如果 DMA 域不存在;或
(2)如果 DMA 域占可用内存的 50% 以上;或
(3)如果任一节点的 DMA 域占其本地内存的 70% 以上,且本地内存容量足够大。
否则将选择“域”顺序。推荐使用默认顺序,除非它给你的系统/应用带来问题。
==============================================================
oom_dump_tasks
在内核执行 OOM 杀戮(OOM-killing)时,启用系统范围的任务转储(不包括内核线程),包含 pid、uid、tgid、vm 大小、rss、nr_ptes、nr_pmds、swapents、oom_score_adj 分数与名称等信息。这有助于判断 OOM 杀手为何被触发、识别导致 OOM 的“流氓”任务,以及了解 OOM 杀手为何选择特定任务进行杀死。
若设为 0,则抑制该信息。在拥有数千任务的超大系统上,可能无法为每个任务转储内存状态信息。这类系统不应在 OOM 条件下被强制承受性能损耗,当这些信息并非需要时更是如此。
若设为非零,则在 OOM 杀手实际杀死某个内存占用任务时显示这些信息。
默认值为 1(启用)。
==============================================================
oom_kill_allocating_task
在内存不足(out-of-memory)情况下,启用或禁用杀死触发 OOM 的任务。
若设为 0,OOM 杀手会扫描整个任务列表,并基于启发式选择一个要杀死的任务。通常会选择一个“流氓”且占用大量内存的任务,杀死它能释放大量内存。
若设为非零,OOM 杀手将直接杀死触发 OOM 的任务。这样可避免任务列表扫描的开销。
如果选择了 panic_on_oom,则该设置优先生效,覆盖 oom_kill_allocating_task 的值。
默认值为 0。
==============================================================
overcommit_kbytes
当 overcommit_memory 设为 2 时,已提交(committed)的地址空间不得超过“交换空间 + 该物理内存量(单位:KB)”。详见下文。
注意:overcommit_kbytes 与 overcommit_ratio 是对应关系,同时只能指定其中一个。设置其中一个会禁用另一个(读取时显示为 0)。
==============================================================
overcommit_memory
该值为一个标志,控制是否允许内存过量分配(overcommit)。
当该标志为 0 时,内核会尝试在用户态请求更多内存时估计剩余可用内存量。
当该标志为 1 时,内核假装总有足够的内存,直到真的耗尽。
当该标志为 2 时,内核使用“从不过量分配(never overcommit)”策略,试图防止任何内存过量分配。注意 user_reserve_kbytes 会影响该策略。
该功能非常有用,因为很多程序会为了“以防万一”而 malloc() 巨量内存,实际却使用很少。
默认值为 0。
更多信息参见 Documentation/vm/overcommit-accounting 与 mm/mmap.c::__vm_enough_memory()。
==============================================================
overcommit_ratio
当 overcommit_memory 设为 2 时,已提交的地址空间不得超过“交换空间 + 物理内存的该百分比”。详见上文。
==============================================================
page-cluster
page-cluster 控制一次从交换空间(swap)中读取的“相邻页”的最大数量。这是页缓存预读(readahead)的交换空间对应项。这里的“相邻”并非指虚拟/物理地址相邻,而是指在交换空间上相邻——意味着它们曾一同被换出(swapped out)。
这是一个对数值:设置为 0 表示“一页”;设为 1 表示“2 页”;设为 2 表示“4 页”,依此类推。设为 0 完全禁用交换预读。
默认值为 3(即一次 8 页)。如果你的工作负载交换密集(swap-intensive),调整该值可能带来少量收益。
较低的值意味着首次缺页的延迟较低,但如果后续缺页本可通过相邻页预读被带入,较低值会导致额外的缺页与 I/O 延迟。
==============================================================
panic_on_oom
启用或禁用在内存不足(OOM)时触发 panic 的功能。
若设为 0,内核会杀死一些“流氓”进程,称为 oom_killer。通常,oom_killer 能杀死这些进程并让系统存活。
若设为 1,当发生 OOM 时内核会 panic。然而,如果某个进程通过内存策略(mempolicy)或 cpusets 限制仅使用某些节点,而这些节点内存耗尽,oom-killer 可能只会杀死该进程,不会 panic。因为其他节点仍可能有空闲内存,系统整体状态可能尚未致命。
若设为 2,即使在上述情况(包括内存 cgroup 下的 OOM),内核也会强制 panic,整个系统都会 panic。
默认值为 0。值 1 与 2 多用于集群故障切换(failover),请根据你的故障切换策略选择。panic_on_oom=2 配合 kdump 能提供极强的调查手段,可获取快照以分析 OOM 原因。
==============================================================
percpu_pagelist_fraction
该值是每个内存域中最多可分配给每 CPU 页列表(per cpu page list)的页数占比(高水位 pcp->high)。最小值为 8。意味着我们不允许任何单个 per_cpu_pagelist 分配超过该域页数的 1/8。该条目仅改变“热”的每 CPU 页列表的值。用户可以设定例如 100,表示为每个 per cpu 页列表分配该域的 1/100。
每个 per cpu 页列表的批量(batch)值也会随之更新。设为 pcp->high/4。batch 的上限为(PAGE_SHIFT * 8)。
初始值为 0。内核在引导时不会使用该值来设定每个 per cpu 页列表的高水位。如果向该 sysctl 写入 ‘0’,将恢复为默认行为。
==============================================================
stat_interval
VM 统计信息的更新时间间隔。默认值为 1 秒。
==============================================================
swappiness
用于定义内核进行交换(swap)操作的激进程度。更高的值会增加激进程度,更低的值会减少交换量。值为 0 指示内核在某个内存域中“空闲页 + 文件支持页”的数量低于该域的高水位线(high watermark)之前,不发起交换。
默认值为 60。
==============================================================
user_reserve_kbytes
当 overcommit_memory 设为 2(“从不过量分配”模式)时,预留 min(当前进程大小的 3%,user_reserve_kbytes) 的空闲内存。该项旨在防止用户启动单个“吃内存”的进程,以至于无法恢复(无法杀死该进程)。
user_reserve_kbytes 默认值为 min(当前进程大小的 3%,128MB)。
若将其降为 0,则允许用户用单个进程分配所有空闲内存,但需减去 admin_reserve_kbytes。此后任何尝试执行命令都会出现“fork: Cannot allocate memory”。
修改该值在应用程序请求内存时生效。
==============================================================
vfs_cache_pressure
该百分比值控制内核对目录项(dentry)与 inode 对象缓存回收的倾向。
在默认值 vfs_cache_pressure=100 下,内核会以相对于页缓存与交换缓存回收的“公平”速率来回收 dentry 与 inode。减小 vfs_cache_pressure 会使内核更倾向于保留 dentry 与 inode 缓存。当 vfs_cache_pressure=0 时,内核在内存压力下永远不会回收 dentry 与 inode,这很容易导致 OOM。增大 vfs_cache_pressure 超过 100 会使内核更倾向于回收 dentry 与 inode。
显著增大 vfs_cache_pressure(远大于 100)可能带来负面性能影响。回收代码需要获取各种锁来查找可回收的目录与 inode 对象。当 vfs_cache_pressure=1000 时,它将尝试查找数量为常规的十倍的可回收对象。
==============================================================
zone_reclaim_mode
当某个内存域(zone)内存耗尽时,zone_reclaim_mode 允许设置更激进或更保守的回收方式。若设为 0,则不进行域回收。从系统的其他内存域/节点满足分配。
该值为以下位的按位或(OR):
1 = 启用域回收
2 = 域回收时写出脏页
4 = 域回收时进行交换(swap)
默认禁用 zone_reclaim_mode。对于文件服务器或受益于数据被缓存的工作负载,应保持禁用,因为缓存效应可能比数据局部性更重要。
如果已知工作负载按分区划分,并且每个分区均适配于单个 NUMA 节点,且访问远程内存会造成可测的性能下降,则可启用域回收。页分配器将优先回收容易重用的页(当前未使用的页缓存页),再分配到其他节点上的页。
允许域回收写出页可以阻止写入大量数据的进程在其他节点上弄脏页。当某个域填满时,域回收会写出脏页,从而有效地限制该进程。这可能降低单个进程的性能,因为它无法使用全系统内存为写出缓冲,但这会保留其他节点上的内存,使在其他节点上的其他进程性能不受影响。
允许常规交换(swap)实际上会将分配限制在本地节点,除非通过内存策略或 cpuset 配置显式覆盖。
============ 文档结束 =================================
