内存管理-14-内核文档翻译-4-vm.rst(/proc/sys/vm)


===============================
Documentation for /proc/sys/vm/
===============================

kernel version 2.6.29

Copyright (c) 1998, 1999, Rik van Riel <riel@nl.linux.org>

Copyright (c) 2008 Peter W. Morreale <pmorreale@novell.com>

For general info and legal blurb, please look in index.rst.

------------------------------------------------------------------------------

此文件包含 /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
- dirtytime_expire_seconds
- dirty_writeback_centisecs
- drop_caches
- extfrag_threshold
- extra_free_kbytes
- hugetlb_shm_group
- kswapd_threads
- 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
- mmap_rnd_bits
- mmap_rnd_compat_bits
- nr_hugepages
- nr_hugepages_mempolicy
- nr_overcommit_hugepages
- nr_trim_pages (only if CONFIG_MMU=n)
- numa_zonelist_order
- oom_dump_tasks
- reap_mem_on_sigkill
- oom_kill_allocating_task
- overcommit_kbytes
- overcommit_memory
- overcommit_ratio
- page-cluster
- panic_on_oom
- percpu_pagelist_fraction
- stat_interval
- stat_refresh
- numa_stat
- swappiness
- unprivileged_userfaultfd
- user_reserve_kbytes
- vfs_cache_pressure
- watermark_boost_factor
- watermark_scale_factor
- zone_reclaim_mode
- want_old_faultaround_pte

 

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。

每当应用程序请求内存时,更改此值都会生效。


block_dump

==========

block_dump 在设置为非零值时启用块 I/O 调试。有关块 I/O 调试的更多信息,请参阅 Documentation/admin-guide/laptops/laptop-mode.rst。


compact_memory

==============

仅在设置了 CONFIG_COMPACTION 时可用。当将 1 写入文件时,所有zones都会被压缩,以便尽可能以连续的块形式提供可用内存。这在分配大页面(例如,分配大页面)时非常重要,尽管进程也会根据需要直接压缩内存。


compact_unevictable_allowed

===========================

仅在设置了 CONFIG_COMPACTION 时可用。设置为 1 时,压缩过程会检查不可回收的 lru(mlocked pages)以查找需要压缩的页面。此选项适用于允许轻微page faults导致停顿,从而获得较大的连续可用内存的系统。设置为 0 可防止压缩过程移动不可回收的页面。默认值为 1。


dirty_background_bytes

======================

包含后台内核刷新线程将开始回写的脏内存量。

注意:
dirty_background_bytes 与 dirty_background_ratio 对应。一次只能指定其中一个。写入一个 sysctl 时,会立即将其用于评估脏内存限制,而读取另一个 sysctl 时则显示为 0。


dirty_background_ratio

======================

包含占总可用内存(包含空闲页面和可回收页面)的百分比,表示后台内核刷新线程将开始写出脏数据的页面数。

总可用内存不等于总系统内存。


dirty_bytes

===========

包含脏内存量,当进程进行磁盘写入时,脏内存量达到该值时,进程自身将开始回写。

注意:dirty_bytes 与 dirty_ratio 对应。一次只能指定其中一个。写入一个 sysctl 时,会立即将其计入脏内存限制,而读取另一个 sysctl 时则显示为 0。

注意:dirty_bytes 允许的最小值为两页(以字节为单位);任何低于此限制的值都将被忽略,并保留旧配置。


dirty_expire_centisecs

======================

此可调参数用于定义脏数据何时足够旧,可以被内核刷新线程写出。它以百分之一秒为单位。内存中脏数据超过此时间间隔的数据将在下次刷新线程唤醒时写出。


dirty_ratio

===========

包含可用内存总量(包含空闲页面和可回收页面)的百分比,表示正在执行磁盘写入操作的进程自身将开始写入脏数据的页面数量。

总可用内存不等于总系统内存。


dirtytime_expire_seconds

========================

当惰性时间 inode 不断更新其页面时,时间戳已更新的 inode 将永远没有机会被写出。此外,如果文件系统上唯一发生的事件是由 atime 更新导致的脏时间 inode,则会调度一个工作进程来确保该 inode 最终被推送到磁盘。此可调参数用于定义脏 inode 何时足够旧,可以被内核刷新线程写回。此外,它还用作唤醒 dirtytime_writeback 线程的间隔。


dirty_writeback_centisecs

=========================

内核刷新线程会定期唤醒并将“旧”数据写入磁盘。此可调参数表示这些唤醒之间的间隔,以百分之一秒为单位。

将此参数设置为零将完全禁用定期回写。


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 //实测,单次执行1.74s

这是一个非破坏性操作,不会释放任何脏对象。为了增加此操作释放的对象数量,用户可以在写入 /proc/sys/vm/drop_caches 之前运行 `sync`。这将最大限度地减少系统中的脏对象数量,并创建更多待删除的候选对象。

此文件并非用于控制各种内核缓存(inode、dentry、pagecache 等)增长的手段。当系统其他位置需要内存时,这些对象会被内核自动回收。

使用此文件可能会导致性能问题。由于它会丢弃缓存的对象,因此重新创建已丢弃的对象可能会消耗大量的 I/O 和 CPU 资源####,尤其是在这些对象使用率较高的情况下。因此,不建议在测试或调试环境之外使用。

使用此文件时,您可能会在内核日志中看到以下信息:

cat (1234): drop_caches: 3

这些信息仅供参考,并不表示您的系统存在任何问题。要禁用它们,请将 4(位 2)echo到 drop_caches 中(只是不打印这条log了)。


extfrag_threshold

=================

此参数会影响内核是压缩内存还是直接回收以满足高阶分配。debugfs 中的 extfrag/extfrag_index 文件显示了系统中每个区域内每个阶的碎片索引。趋向于 0 的值表示分配会因内存不足而失败;趋向于 1000 的值表示失败是由于碎片造成的;-1 表示只要满足水位线,分配就会成功。

如果碎片索引(fragmentation index) <= extfrag_threshold,内核将不会压缩zone中的内存。默认值为 500。


highmem_is_dirtyable //msm-5.4中已无

====================

仅适用于启用了 CONFIG_HIGHMEM 的系统(32 位系统)。

此参数控制是否将高端内存用于脏写操作节流。默认情况下不考虑高端内存,这意味着只有内核直接可见/可用的内存量才能被脏写。因此,在内存较大且低端内存耗尽的系统上,写入操作可能会过早受到节流,导致流式写入速度变得非常慢。

将该值更改为非零值将允许更多内存被污染,从而允许写入者写入更多数据,这些数据可以更有效地刷新到存储中。请注意,这也存在过早 OOM 终止的风险,因为某些写入者(例如直接块设备写入)只能使用低内存,并且它们可以在不受任何限制的情况下用脏数据填满低内存。


extra_free_kbytes

====================

此参数指示VM在后台回收 (kswapd) 启动的阈值与直接回收(通过分配进程)启动的阈值之间保留额外的可用内存。

这对于需要低延迟内存分配且内存分配突发性有限的工作负载非常有用。例如,一个接收和传输网络流量(导致内核内存分配)的实时应用程序,其最大总消息突发大小为 200MB,可能需要 200MB 的额外可用内存来避免与直接回收相关的延迟。


hugetlb_shm_group //msm-5.4中已无

=================

hugetlb_shm_group 包含允许使用 hugetlb 页面创建 SysV 共享内存段的组 ID。


kswapd_threads

==============

kswapd_threads 允许您控制系统上运行的每个node节点的 kswapd 线程数。这使您能够将额外的 CPU 资源用于主动页面替换,以减少直接回收。当直接回收被阻止时,它们消耗的 CPU 也会被阻止。根据工作负载的不同,结果可能会导致系统的总 CPU 使用率上升、下降或保持不变。

更积极的页面替换可以减少直接回收,而直接回收会导致任务延迟,并降低通过页面缓存执行文件系统 IO 时的吞吐量。直接回收使用 /proc/vmstat 中的 allocstall 计数器进行记录####。

默认值为 1,可接受值的范围为 1-16。始终从 2-6 范围内的较低值开始。较高的值应经过测试以证明其合理性。如果尽管值较高但仍发生直接回收,则由于锁争用增加,发生的直接回收成本(以延迟为单位)可能会更高。


laptop_mode

===========

laptop_mode 是一个控制“笔记本电脑模式”的旋钮。该旋钮控制的所有内容均在 Documentation/admin-guide/laptops/laptop-mode.rst 中讨论。


legacy_va_layout

================

如果非零,则此 sysctl 将禁用新的 32 位 mmap 布局 - 内核将对所有进程使用旧版(2.4)布局。


lowmem_reserve_ratio

====================

对于某些在高内存机器上执行特殊工作负载,内核允许从“低内存”区域分配进程内存是危险的。这是因为这些内存可能会通过 mlock() 系统调用或由于交换空间不可用而被锁定。

在高内存较大的机器上,这种可回收低内存的不足可能是致命的。

因此,Linux 页面分配器具有一种机制,可以防止*可能*使用高内存的分配占用过多的低内存。这意味着一定量的低内存可以避免被锁定的用户内存占用。

(同样的道理也适用于旧的 16 MB ISA DMA 区域。此机制还将保护该区域免受可能使用 highmem 或 lowmem 的分配的影响)。

`lowmem_reserve_ratio` 可调参数决定了内核在保护这些较低区域时的积极程度。

如果您的机器使用 highmem 或 ISA DMA,并且您的应用程序正在使用 mlock(),或者您正在运行没有交换区的系统,那么您可能应该更改 lowmem_reserve_ratio 设置。

lowmem_reserve_ratio 是一个数组。您可以通过阅读此文件来查看它们:

    % cat /proc/sys/vm/lowmem_reserve_ratio
    256     256     32

但是,这些值不会直接使用。内核会根据这些值计算每个区域的保护页数量。这些保护页在 /proc/zoneinfo 中显示为保护页数组,如下所示。(这是 x86-64 系统的示例)。每个zone都有一个保护页数组,如下所示:

  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),并且 watermark[WMARK_HIGH] 用作水位标记,则内核判断该区域不应使用,因为 pages_free(1355) 小于 watermark + 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 (if zone[i] means DMA or DMA32 zone)
    32  (others)
    === ====================================

如上表达式所示,它们是比率的倒数。256 表示 1/256。保护页面的数量约为节点上较高区域管理页面总数的 0.39%。

如果您想保护更多页面,则较小的值更有效####。最小值为 1(1/1 -> 100%)。小于 1 的值将完全禁用页面保护。


max_map_count

==============

此文件包含进程可拥有的最大内存映射区域数量。内存映射区域是调用 malloc 的副作用,由 mmap、mprotect 和 madvise 直接使用,以及在加载共享库时使用。

虽然大多数应用程序需要的映射少于一千个,但某些程序(尤其是 malloc 调试器)可能会消耗大量映射,例如每次分配最多占用一到两个映射。

默认值为 65536。


memory_failure_early_kill: //msm-5.4无

==========================

控制当硬件在后台检测到内核无法处理的未纠正的内存错误(通常是内存模块中的 2 位错误)时如何终止进程。在某些情况下(例如页面在磁盘上仍有有效副本),内核将透明地处理故障,而不会影响任何应用程序。但如果没有其他最新的数据副本,内核将终止进程以防止任何数据损坏传播。

1:一旦检测到损坏,立即终止所有映射了损坏且无法重新加载的页面的进程。请注意,此功能不适用于某些类型的页面,例如内核内部分配的数据或交换缓存,但适用于大多数用户页面。

0:仅从所有进程取消映射损坏的页面,并且仅终止尝试访问该页面的进程。

终止操作使用可捕获的带有 BUS_MCEERR_AO 的 SIGBUS 信号完成,因此进程可以根据需要进行处理。

此功能仅在具有高级机器检查处理的架构/平台上有效,并且取决于硬件功能。

应用程序可以使用 PR_MCE_KILL prctl 单独覆盖此设置


memory_failure_recovery //msm-5.4无

=======================

启用内存故障恢复(平台支持时)

1:尝试恢复。

0:内存故障时始终进入恐慌状态。


min_free_kbytes

===============

这用于强制 Linux VM保留最少数量的可用千字节。VM使用此数字来计算系统中每个低内存区域的 watermark[WMARK_MIN] 值。每个低内存区域都会根据其大小按比例获得一定数量的预留可用页面。

需要一定的最小内存量来满足 PF_MEMALLOC 分配;如果您将此值设置为低于 1024KB,您的系统将会出现微妙的故障,并且在高负载下容易死锁####。

将此值设置得太高会导致您的机器立即 ​​OOM。


min_slab_ratio //msm-5.4无

==============

这仅适用于 NUMA 内核。

每个区域的总页面百分比。区域回收(从本地zone回退)时,如果区域中可回收的 slab 页面比例超过此百分比,则将回收 slab。这确保即使在很少执行全局回收的 NUMA 系统中,slab 的增长也能得到控制。

默认值为 5%。

请注意,slab 回收以每个区域/节点的方式触发。回收 slab 内存的过程目前并非特定于节点,并且速度可能不够快。


min_unmapped_ratio //msm-5.4无

==================

此功能仅适用于 NUMA 内核。

这是每个区域中页面总数的百分比。只有当超过此百分比的页面处于 zone_reclaim_mode 允许回收的状态时,才会进行区域回收。

如果 zone_reclaim_mode 的值为 4,则该百分比会与所有文件支持的未映射页面(包括交换缓存页面和 tmpfs 文件)进行比较。否则,仅考虑由普通文件支持的未映射页面,而不考虑 tmpfs 文件等类似文件支持的未映射页面。

默认值为 1%。


mmap_min_addr

=============

该文件指示限制用户进程映射的地址空间大小。由于内核空引用错误可能会根据前几页内存中的信息意外触发,因此不应允许用户空间进程写入这些内存。默认情况下,此值设置为 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 //msm-5.4上无

============

更改大页池的最小大小。

请参阅文档/admin-guide/mm/hugetlbpage.rst


nr_hugepages_mempolicy //msm-5.4上无

======================

在特定 NUMA 节点集上,在运行时更改大页池的大小。

请参阅文档/admin-guide/mm/hugetlbpage.rst


nr_overcommit_hugepages //msm-5.4上无

=======================

更改大页池的最大大小。最大值为 nr_hugepages + nr_overcommit_hugepages。

请参阅文档/admin-guide/mm/hugetlbpage.rst


nr_trim_pages //msm-5.4上无

=============

此功能仅适用于 NOMMU 内核。

此值用于调整 2 的幂对齐 NOMMU mmap 分配的多余页面修剪行为。

值为 0 时,将完全禁用分配修剪;值为 1 时,将积极修剪多余页面。任何大于等于 1 的值都充当启动分配修剪的水位线。

默认值为 1。

更多信息请参阅 Documentation/nommu-mmap.txt。


numa_zonelist_order //msm-5.4上无

===================

此 sysctl 仅适用于 NUMA,且已弃用。除节点顺序之外的任何操作都将失败!

“内存分配位置”由区域列表控制。

(本文档为了便于解释,忽略了 ZONE_HIGHMEM/ZONE_DMA32。您可以将 ZONE_DMA 理解为 ZONE_DMA32……)

在非 NUMA 情况下,GFP_KERNEL 的区域列表顺序如下:ZONE_NORMAL -> ZONE_DMA
这意味着,只有当 ZONE_NORMAL 不可用时,GFP_KERNEL 的内存分配请求才会从 ZONE_DMA 获取内存。

在 NUMA 情况下,您可以考虑以下两种顺序。假设有两个节点NUMA,并且节点0的GFP_KERNEL的区域列表如下:

(A) 节点0 ZONE_NORMAL -> 节点0 ZONE_DMA -> 节点1 ZONE_NORMAL
(B) 节点0 ZONE_NORMAL -> 节点1 ZONE_NORMAL -> 节点0 ZONE_DMA。

类型A为节点0上的进程提供了最佳的局部性,但ZONE_DMA会在ZONE_NORMAL耗尽之前被使用。这增加了ZONE_DMA内存溢出(OOM)的可能性,因为ZONE_DMA通常较小。

类型B无法提供最佳的局部性,但对DMA区域的OOM具有更强的鲁棒性。

类型A被称为“节点”顺序。类型B被称为“区域”顺序。

“节点顺序”先按节点对区域列表进行排序,然后再按每个节点内的区域进行排序。指定“[Nn]ode”作为节点顺序

“区域顺序”会先按区域类型对区域列表进行排序,然后再按每个区域内的节点进行排序。指定“[Zz]one”作为区域顺序。

指定“[Dd]efault”可请求自动配置。

在 32 位系统中,需要保留普通区域以供内核访问,因此将选择“区域”顺序。

在 64 位系统中,需要 DMA32/DMA 的设备相对较少,因此将选择“节点”顺序。

建议使用默认顺序,除非这会给您的系统/应用程序带来问题。


oom_dump_tasks

==============

当内核执行 OOM 终止时,启用生成系统级任务转储(不包括内核线程),其中包含 pid、uid、tgid、vm size、rss、pgtables_bytes、swapents、oom_score_adj score 和 name 等信息。这有助于确定调用 OOM 终止程序的原因、识别导致 OOM 终止的恶意任务,以及确定 OOM 终止程序为何选择终止该任务。

如果设置为零,则此信息将被抑制。在包含数千个任务的大型系统中,可能无法转储每个任务的内存状态信息####。此类系统不应被迫在 OOM 情况下承受性能损失,因为这些信息可能并非必需。

如果设置为非零,则每当 OOM 终止程序实际终止占用大量内存的任务时,都会显示此信息。

默认值为 1(启用)。


reap_mem_on_sigkill

===================

此项用于启用或禁用接收 SIGKILL 信号的进程的内存回收功能,并且发送 SIGKILL 信号的进程必须具备 CAP_KILL 功能。

如果设置为 1,当某个进程从具有 CAP_KILL 功能的进程接收到 SIGKILL 信号时,该进程将被添加到 oom_reaper 队列中,oom_reaper 线程可以接收该队列并回收该进程的内存。此功能回收的内存来自通过用户 sys_kill 或内核 kill_pid 接收 SIGKILL 信号的进程。

如果设置为 0,则不会回收通过用户 sys_kill 或内核 kill_pid 发送的 SIGKILL 信号的进程的内存。

默认值为 0(禁用)。


oom_kill_allocating_task

========================

此选项用于启用或禁用在内存不足的情况下kill触发 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。

有关更多信息,请参阅 Documentation/vm/overcommit-accounting.rst 和 mm/util.c::__vm_enough_memory()。

 

overcommit_ratio

================

当 overcommit_memory 设置为 2 时,已提交的地址空间不得超过交换空间加上此百分比的物理 RAM。参见上文。


page-cluster

============

page-cluster 控制单次尝试从交换区读入的连续页面数量。这与页面缓存预读在交换区中相对应。
此处提到的连续性并非指虚拟/物理地址的连续性,而是交换空间的连续性——这意味着它们是一起被换出的。

它是一个对数值——设置为 0 表示“1 页”,设置为 1 表示“2 页”,设置为 2 表示“4 页”,以此类推。设置为 0 表示完全禁用交换区预读。

默认值为 3(一次读取 8 页)。如果您的工作负载需要频繁交换,则将其调整为其他值可能会带来一些小的好处。

较低的值意味着初始故障的延迟较低,但同时也会带来额外的故障和 I/O 延迟(如果后续故障是连续页面预读的一部分)。


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_fraction

========================

cat默认是0.####

这是每个区域中分配给每个 CPU 页面列表的页面比例(最高标记 pcp->high)。该值的最小值为 8。这意味着我们不允许每个区域中超过 1/8 的页面被分配到任何单个 per_cpu_pagelist 中。此条目仅更改热门的 per CPU 页面列表的值。用户可以指定一个数字,例如 100,以将每个区域的 1/100 分配给每个 CPU 页面列表。

每个 CPU 页面列表的批处理值也会随之更新。批处理值设置为 pcp->high/4。批处理的上限为 (PAGE_SHIFT * 8)。

初始值为 0。内核在启动时不会使用此值来设置每个 CPU 页面列表的高水位线。如果用户将 0 写入此 sysctl,它将恢复为默认行为。


stat_interval

=============

VM统计信息更新的时间间隔。默认值为 1 秒。


stat_refresh //msm-5.4无

============

任何读取或写入操作(仅限 root 用户)都会将所有每个 CPU 的VM统计信息刷新到其全局总计中,以便在测试时获得更准确的报告,例如 cat /proc/sys/vm/stat_refresh /proc/meminfo。

作为副作用,它还会检查是否存在负总计(其他地方报告为 0),如果发现任何负总计,则会“失败”并返回 EINVAL,并在 dmesg 中发出警告。(在撰写本文时,已知有时会发现一些统计信息为负数,但这并无不良影响:这些统计信息的错误和警告已被抑制。)


numa_stat //msm-5.4无

=========

此接口允许在运行时配置 numa 统计信息。

当页面分配性能成为瓶颈,并且您可以容忍某些工具可能出现故障以及 numa 计数器精度下降时,您可以执行以下操作:

echo 0 > /proc/sys/vm/numa_stat

当页面分配性能不是瓶颈,并且您希望所有工具都能正常工作时,您可以执行以下操作:

echo 1 > /proc/sys/vm/numa_stat


swappiness

==========

此控件用于定义内核交换内存页面的积极程度。值越高,积极程度越高;值越低,交换量越小。值为 0 表示内核在可用页面和文件支持页面数量低于区域中的高水位线之前不启动交换。

默认值为 60。


unprivileged_userfaultfd

========================

此标志控制非特权用户使用 userfaultfd 系统调用的模式。将其设置为 0 可限制非特权用户仅在用户模式下处理页面错误。在这种情况下,没有 SYS_CAP_PTRACE 权限的用户必须传递 UFFD_USER_MODE_ONLY 才能使 userfaultfd 成功执行。禁止使用 userfaultfd 从内核模式处理错误可能会使某些漏洞更难以利用。

将其设置为 1 可允许非特权用户不受限制地使用 userfaultfd 系统调用。

默认值为 0。


user_reserve_kbytes

===================

当 overcommit_memory 设置为 2(“永不过量使用”模式)时,会预留最小(当前进程大小的 3%,即 user_reserve_kbytes)的可用内存。这旨在防止用户启动单个占用大量内存的进程,从而无法恢复(终止占用大量内存的进程)。

user_reserve_kbytes 默认为最小(当前进程大小的 3%,即 128MB)。

如果将此值降至零,则用户将可以使用单个进程分配所有可用内存(减去 admin_reserve_kbytes)。任何后续尝试执行命令都将导致“fork: Cannot allocate memory”(无法分配内存)。

更改此值会在应用程序请求内存时生效。

 

vfs_cache_pressure

==================

此百分比值控制内核回收用于 caching 目录和 inode 对象的内存的倾向。

在默认值 vfs_cache_pressure=100 下,内核将尝试以相对于页面缓存和交换缓存回收的“合理”速率回收 dentry 和 inode。降低 vfs_cache_pressure 会导致内核优先保留 dentry 和 inode 缓存。当 vfs_cache_pressure=0 时,由于内存压力,内核将永远不会回收 dentry 和 inode,这很容易导致内存不足的情况。将 vfs_cache_pressure 增加到 100 以上会导致内核优先回收 dentry 和 inode。

将 vfs_cache_pressure 大幅增加至 100 以上可能会对性能产生负面影响。回收代码需要使用各种锁来查找可释放的目录和 inode 对象。如果 vfs_cache_pressure=1000,它将查找比实际可释放对象数量多十倍的可释放对象。


watermark_boost_factor

======================

此因子控制内存碎片化时的回收级别。它定义了当不同移动性的页面在页面块中混合时,zone高水位线的百分比。这样做的目的是减少将来的压缩工作量,并提高未来高阶分配(例如 SLUB 分配、THP 和 hugetlbfs 页面)的成功率。

为了使其与 watermark_scale_factor 参数相符,其单位为 10,000 的分数。!DISCONTIGMEM 配置中的默认值为 15,000,这意味着如果由于碎片化而导致页面块混杂,则最多可回收 150% 的高水位线。回收级别取决于近期发生的碎片化事件数量。如果此值小于一个页面块,则将回收相当于一个页面块大小的页面(例如,在 64 位 x86 上为 2MB)。如果提升因子为 0,则将禁用该功能。


watermark_scale_factor

======================

cat出来是1.####

此因子控制 kswapd 的积极性。它定义了 kswapd 被唤醒前节点/系统中剩余的内存量,以及 kswapd 重新进入睡眠状态前需要释放的内存量。

单位为 10,000 的分数。默认值为 10,表示水位线之间的距离为节点/系统中可用内存的 0.1%。最大值为 1000,即内存的 10%。

线程进入直接回收 (allocstall) 或 kswapd 过早进入睡眠状态 (kswapd_low_wmark_hit_quickly) 的频率过高,可能表明 kswapd 出于延迟原因维护的空闲页面数量对于系统中发生的分配突发而言过小。您可以使用该旋钮相应地调整 kswapd 的积极性。


zone_reclaim_mode //msm-5.4无

=================

zone_reclaim_mode 允许设置当某个区域内存不足时,回收内存的积极程度。如果设置为零,则不会进行zone回收。分配的内存将由系统中的其他zone/node满足。

此值由以下项进行或运算:

= ====================================
1 区域回收开启
2 区域回收写出脏页
4 区域回收交换页面
= =====================================

zone_reclaim_mode 默认处于禁用状态。对于文件服务器或受益于数据缓存的工作负载,应将 zone_reclaim_mode 保持禁用状态,因为缓存效果可能比数据本地性更重要。

如果已知工作负载的分区使得每个分区都适合 NUMA 节点,并且访问远程内存会导致可测量的性能下降,则可以启用 zone_reclaim。这样,页面分配器就会在分配节点外的页面之前,回收易于重用的页面(即当前未使用的页面缓存页面)。

允许区域回收写出页面可阻止正在写入大量数据的进程弄脏其他节点上的页面。如果区域已满,区域回收将写出脏页,从而有效地限制该进程。这可能会降低单个进程的性能,因为它无法再使用所有系统内存来缓冲传出的写入操作,但它会保留其他节点上的内存,从而不会影响在其他节点上运行的其他进程的性能。

允许常规交换可有效地限制对本地节点的分配,除非被内存策略或 cpuset 配置明确覆盖。

 

want_old_faultaround_pte:

=========================

默认情况下,faultaround 代码会生成新的 pte。当 want_old_faultaround_pte 设置为 1 时,faultaround 会生成旧的 pte。

在稀疏文件访问期间,faultaround 会映射更多页面,当所有页面都处于新状态(默认情况)时,在内存压力下,这会导致 vmscan 换出匿名页面,或者删除其他驻留的页面缓存页面。将 want_old_faultaround_pte 设置为 1 可以避免这种情况。

在某些架构上,将故障绕过 pte 设置为旧版本可能会导致性能下降。这是因为微故障会耗费大量周期,而这些周期需要遍历页面才能设置 pte 中的新位(young bit)。unixbench shell8 就是一个已知的 x86 性能下降测试。对于未出现性能下降的架构,或者工作负载在旧版本故障绕过 pte 下表现出整体性能优势的架构,请将 want_old_faultaround_pte 设置为 1。

默认值为 0。

 

posted on 2025-06-03 15:57  Hello-World3  阅读(63)  评论(0)    收藏  举报

导航