/proc/sys/vm 使用

发布时间 2023-11-13 22:54:16作者: yooooooo

这些参数主要是用来调整virtual memory子系统的行为以及数据的写出(从RAM到ROM)。
这些节点(参数)的默认值和初始化的过程大部分都可以在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
  • extra_free_kbytes
  • 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
  • mmap_rnd_bits
  • mmap_rnd_compat_bits
  • nr_hugepages
  • nr_overcommit_hugepages
  • nr_trim_pages (only if 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
  • stat_refresh
  • swappiness
  • user_reserve_kbytes
  • vfs_cache_pressure
  • watermark_scale_factor
  • zone_reclaim_mode
  • unprivileged_userfaultfd

==============================================================
admin_reserve_kbytes

系统中为拥有cap_sys_admin的权限(可以大致理解到root权限)的user预留的free memory数量
admin_reserve_kbytes 默认为min(3% of free pages, 8MB)(也就是3%的free pages与8MB中较小的值)
在必要的情况下,在默认的大量使用的'guess' 模式下,能有足够多的memory给管理员登录和杀死进程。
运行在大量使用‘never’下的系统应该增加这个值到用于恢复的程序的完整虚拟内存大小。否则,root无法登录来恢复系统。

如何计算一个可用的预留最小值呢?

sshd or login + bash (or some other shell) + top (or ps, kill, etc.) (需要考虑到这几个程序需要的虚拟内存)
对于大量使用'guess'模式,我们可以算RSS。在x86_64,这个值是8MB。

对于大量使用'never'模式,我们可以采用他们的虚拟大小的最大值再加上他们的RSS。(VSZ+RSS)。在x86_64 这个值是128MB.

改变这个值,每当程序需要内存时都会收到影响。

==============================================================
block_dump

把block_dump设置为一个非零值,可以打开block I/O调试。在Documentation/laptops/laptop-mode.txt可以查看更多关于block I/O调试的内容。

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

compact_memory
在CONFIG_COMPACTION设置了的时候这个参数才能访问。这个参数被写1的时候,所有的zone会被压缩,因此所有可用的memory都是连续的块。对于需要大量内存的情况,这很重要,尽管进程可以根据需要直接压缩内存。

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

compact_unevictable_allowed
在CONFIG_COMPACTION设置了的时候这个参数才能访问。这个参数被写1的之后,压缩是可以检查不能被写出的、lru(最近最少使用)的页面以便进行压缩的。这个应该使用在为了大的连续内存而可以接受小的页面错误的系统中。这个参数被设置为0来阻止不能被写出的页面的移动。默认值是1。

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

dirty_background_bytes
这个值包含后台内核刷新进程即将开始回写到的内存的大小。
Contains the amount of dirty memory at which the background kernel flusher threads will start writeback.
Note:dirty_background_bytes 和dirty_background_ratio互斥使用。一次只能指定他们中的一个。当其中一个sysctl 被写入,那会立马在dirty memory的范围的计算过程中起作用,并且另外一个的值读出来是0。

如果内核线程的脏页面大于这个值,就开始回写到磁盘里面

==============================================================
dirty_background_ratio
后台内核刷新线程即将写出的脏数据所占的页面,占包括free页面和可回收页面的在内的总可用页面数的百分比。这里说的总可用内存不等于系统的总内存。

==============================================================
dirty_bytes
一个生成磁盘的进程写入的"memory dirty"的大小,并且这个"memory dirty"会自动回写。
注:dirty_bytes 和dirty_ratio的使用相关。一次只能指定他们中的一个。当一个sysctl被调用,那它会立马被用来评估“dirty memory”的极限并且其他的sysctl读出来的结果是0。
注:dirty_bytes 被允许的最小值是两页(字节数);任何比这个小的值的设定都会被忽略,并且保持原来的值。

==============================================================
dirty_expire_centisecs
这个可调的值是用来定义脏数据因为足够老而被内核清理线程(kernel flusher threads)写出的时间。

它的单位是百分之一秒。在“dirty in-memory”中存在时间超过这个值的数据会在下一次清理进程醒过来的时候写出。

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

dirty_ratio
这个参数, 是指free pages和reclaimable pages占总内存的一个百分比,当达到这个百分比的时候,生成磁盘写操作的进程将会自动开始把脏数据写出。
总可用memory和总系统内存不相等

dirty_background_ratio 和 dirty_ratio的 区别 两个参数用于控制内核将多少内存页标记为脏页(已被修改但尚未写入磁盘)的阈值。
dirty_background_ratio 参数表示当系统中脏页占总内存的百分比超过该阈值时,内核会开始异步地将脏页写入磁盘,以避免脏页过多堆积而导致系统响应变慢。默认值为10。
dirty_ratio 参数表示当系统中脏页占总内存的百分比超过该阈值时,内核会强制将脏页同步地写入磁盘,以确保数据的持久化。默认值为20。
总结而言,dirty_background_ratio 控制异步写入磁盘的阈值,而 dirty_ratio 控制同步写入磁盘的阈值。这两个参数结合起来可以平衡系统性能和数据持久化之间的关系。

==============================================================
dirty_writeback_centisecs
内核清理线程将定期地醒过来,并且讲脏数据写出到磁盘。这个参数就是指这个时间间隔,单位是百分之一秒。
把这个值设置为0就完全地disable了定期回写的做法。

==============================================================
drop_caches

对这个参数写入,会导致内核清扫caches以及像inodes之类的可回收的slab对象。一旦清理了,他们的内存就变成可用的了。

清理cache:

echo 1 > /proc/sys/vm/drop_caches

清理可回收的slab对象(包括目录和inodes):

 echo 2 > /proc/sys/vm/drop_caches

清理cache和可回收的slab对象:

 echo 3 > /proc/sys/vm/drop_caches

这个操作非破坏性的,不会清理脏对象。要增加这个操作可清理的对象的数量,可以运行“sync”后再往proc/sys/vm/drop_caches节点写值。这样会使得系统的脏对象变得最少,并且增加可以被清理的对象。

这个文件不是一种用来控制各种内核cache(inodes,目录,cache等)增长的手段。这些对象会在系统别的地方需要内存时被内核主动回收。

使用这个文件会造成一些性能问题。因为这个操作舍弃了缓存的一些对象,而可能需要大量的I/O和CPU来重新创建这些被舍弃的对象,特别是当他们被大量使用的时候。因此,在测试和debug之外的环境中,是不建议使用的。

当这个文件被使用的时候,你可能可以看到kernel log中有这样的信息:

 cat (1234): drop_caches: 3

==============================================================
vfs_cache_pressure

该文件表示内核回收用于directory和inode cache内存的倾向;缺省值100表示内核将根据pagecache和swapcache,把directory和inode cache保持在一个合理的百分比;降低该值低于100,将导致内核倾向于保留directory和inode cache;增加该值超过100,将导致内核倾向于回收directory和inode cache。

==============================================================
min_free_kbytes

该文件表示强制Linux VM最低保留多少空闲内存(Kbytes)。

缺省设置:724(512M物理内存)

当可用内存低于这个值时,系统会尝试通过回收缓存页面来增加可用内存,以避免内存压力过大而导致系统性能下降。增加min_free_kbytes的值可以增加系统的可用内存,但同时可能会减少文件系统缓存的大小,影响文件系统的性能。

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

swapiness

该文件表示系统进行交换行为的程度,数值(0-100)越高,越可能发生磁盘交换。

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

lowmem_reserve_ratio
/proc/sys/vm中的lowmem_reserve_ratio是一个内核参数,用于控制Linux内核中低内存区域的内存保留比例。低内存区域是指物理内存地址最低的那部分内存。通过调整lowmem_reserve_ratio的值,可以控制内核为低内存区域保留的内存比例。
保留低内存区域的目的是为了在系统出现内存压力时,预留一定量的内存用于处理关键任务和系统运行所需的基本内存操作。这个保留的比例可以保证系统在内存不足时能够继续正常运行而不会导致系统崩溃或性能下降。
需要注意的是,如果低内存区域的保留比例过高,可能会导致其他应用程序的内存需求无法得到满足,从而影响系统的整体性能。因此,在调整lowmem_reserve_ratio的值时,要考虑系统的实际内存使用情况和需求。

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

user_reserve_kbytes
user_reserve_kbytes 是一个 /proc/sys/vm 下的虚拟文件,在 Linux 上用于控制用户空间可用的内存保留量。当用户空间程序消耗内存时,内核会按照一定的算法计算用户空间程序当前的内存需求,并保留一定量的内存作为缓冲区,以确保用户空间程序稍后再次申请内存时能够快速获得。这个保留的内存量就由 user_reserve_kbytes 参数控制。
user_reserve_kbytes 参数的默认值是 131072(即128MB),它可以通过修改 /etc/sysctl.conf 文件或使用 sysctl 命令动态调整。将该值设为较高的数值可以增加用户空间程序可以使用的内存量,从而提高性能,但会减少内核用于缓冲区的内存量。设为较低的值则会确保内核可以更多地保留内存作为缓冲区,提高内核的 I/O 性能。但是过度减小该值可能会导致用户空间程序频繁申请内存导致性能下降。
总之,user_reserve_kbytes 参数可以通过调整来平衡用户空间程序和内核之间的内存使用,以便在性能和内存利用率之间取得最佳平衡。

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

panic_on_oom

panic_on_oom 是一个 /proc/sys/vm 下的虚拟文件,在 Linux 上用于控制发生 Out of Memory(OOM)时的系统行为。当系统内存不足时,内核需要进行选择,决定如何处理这种情况。panic_on_oom 参数用于确定当发生 OOM 时是否触发系统的 panic(崩溃)。
默认情况下,panic_on_oom 的值为 0,表示不触发系统 panic。如果将其值设为 1,则表示系统在发生 OOM 时会触发 panic,导致系统崩溃。这通常用于需要系统管理员手动干预的情况,以便提供更多的信息和处理机会。
触发 panic 后,内核会生成一个崩溃转储(kernel panic dump),其中包含了系统内存状态信息,这对于问题跟踪和调试非常有用。然而,触发 panic 会导致系统停止运行,因此需要谨慎使用。
总之,panic_on_oom 参数用于控制系统在发生 OOM 时的行为,决定是否触发系统崩溃(panic),以便进行问题跟踪和调试。

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

oom_dump_tasks

oom_dump_tasks 是一个 /proc/sys/vm 下的虚拟文件,在 Linux 上用于控制 Out of Memory(OOM)发生时是否将当前运行的任务信息转储到系统日志中。
默认情况下,oom_dump_tasks 的值为 0,表示不进行任务信息转储。将其值设为 1,则表示在发生 OOM 时将当前运行的任务信息转储到系统日志中。
当系统内存不足时,内核会尝试通过释放一些内存来满足新请求。如果内核无法进行有效的内存释放,那么会选择终止一些任务以腾出内存空间。这个选择通常由 OOM killer 进行,它会尝试找出对系统整体性能影响较小的任务来终止。
开启 oom_dump_tasks 参数后,在发生 OOM 时,内核会将相关的任务信息转储到系统日志中,以便进行问题分析和故障排查。这些信息包括任务号(PID)、任务名称、内存使用情况等。
总之,oom_dump_tasks 参数用于控制系统在发生 OOM 时是否将当前运行的任务信息转储到系统日志中,以便进行问题分析和故障排查。

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

oom_kill_allocating_task

(1)谁触发了OOM就干掉谁

(2)谁最“坏”就干掉谁

oom_kill_allocating_task这个参数就是控制这个选择路径的,当该参数等于0的时候选择(2),否则选择(1)。

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

overcommit_memory

/proc/sys/vm 中的 overcommit_memory 参数用于控制系统对内存的分配策略。正常情况下,当程序申请内存时,系统会根据当前可用的内存大小进行分配。
overcommit_memory 参数有以下几种设置选项:

0:表示使用默认的内存分配方式,即根据系统当前可用内存的大小来决定是否分配内存。
1:表示始终允许分配所有申请的内存。即使系统当前可用内存不足,也会分配内存。这可能导致后续的 out-of-memory 错误。
2:表示检查系统当前可用内存的大小和进程申请的内存大小,如果当前可用内存大小加上申请的内存大小超过了系统的限制,那么拒绝内存申请。这种模式可以防止过度使用内存并避免 out-of-memory 错误。

因此,overcommit_memory 参数用于调整系统对于内存分配的策略,不同的设置选项可以影响系统对于内存的分配行为。

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

overcommit_kbytes

当 overcommit_memory 设置为 2 时,已提交的地址空间不允许超过交换空间加上这个物理 RAM 量。见下文。

注意:overcommit_kbytes 是 overcommit_ratio 的对应物。一次只能指定其中一个。设置一个会禁用另一个(读取时显示为 0)。

==============================================================
overcommit_ratio

当 overcommit_memory 设置为 2 时,已提交的地址空间不允许超过交换空间加上这个物理 RAM 的百分比。往上看。

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

block_dump

在 /proc/sys/vm 中,block_dump 参数用于启用或禁用块设备操作的跟踪日志记录。当此参数设置为1时,Linux内核将记录块设备操作的详细信息,包括读取和写入操作。这些日志信息将记录在内核的日志缓冲区中。
启用 block_dump 可以帮助诊断和调试系统中的块设备问题。通过分析跟踪记录,可以确定块设备的访问模式、频率和性能瓶颈。这对于性能优化和故障排除可能非常有用。
要启用 block_dump,将 /proc/sys/vm/block_dump 文件的值设置为1。要禁用该功能,将其设置为0。注意,启用 block_dump 会产生大量的日志信息,可能会对系统性能产生负面影响。因此,建议仅在需要跟踪块设备操作时启用它。

==============================================================
compact_memory

在 /proc/sys/vm 中,compact_memory 参数用于启用或禁用内存紧缩(memory compaction)功能。内存紧缩是一种操作系统的内存管理技术,用于优化内存的利用率和性能。
当 compact_memory 参数被设置为1时,内核会在系统空闲或低负载时尝试进行内存紧缩操作。内存紧缩是通过将页面重新组织和重新分配来合并内存碎片,从而在物理内存上创造更大的连续空闲空间。这有助于减少内存碎片化,并为大型连续内存请求提供更好的响应性能。紧缩内存可以提高程序的整体性能,特别是在使用大量内存的情况下。
要启用内存紧缩,将 /proc/sys/vm/compact_memory 文件的值设置为1。要禁用该功能,将其设置为0。
请注意,内存紧缩操作可能会消耗一定的系统资源和时间,并且可能会对系统的响应性能产生一定的影响,特别是在大内存系统中。因此,在启用内存紧缩之前,建议评估系统的特定需求和性能影响。

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

laptop_mode

此参数只会影响直接内存回收,只有两个值:

  • 0:允许直接内存回收对匿名页lru链表中的页进行回写操作,并且允许直接内存回收唤醒flush内核线程
  • 非0:直接内存回收不会对匿名页lru链表中的页进行回写操作

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

legacy_va_layout

在 /proc/sys/vm 中,legacy_va_layout 参数用于控制 Linux 内核的虚拟地址空间布局。虚拟地址空间是指进程在内存中使用的地址范围。
当 legacy_va_layout 参数被设置为1时,Linux 内核使用传统的虚拟地址布局方式。在这种布局方式下,内核将虚拟地址空间的前3GB保留给用户空间(用户进程可使用),将最后1GB保留给核心空间。
当 legacy_va_layout 参数被设置为0时,Linux 内核使用新的虚拟地址布局方式。在这种布局方式下,内核将虚拟地址空间的前1TB保留给用户空间,将接下来的128TB保留给核心空间。这种布局方式可以提供更大的用户空间地址范围,适用于需要大量内存的应用程序。
虚拟地址空间布局对于系统的性能和可用内存空间有一定的影响。选择合适的布局方式取决于系统的需求和应用程序的特性。
要更改 legacy_va_layout 参数的值,可以通过修改 /proc/sys/vm/legacy_va_layout 文件的内容来实现。

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

max_map_count

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

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

默认值为 65530。

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

mmap_min_addr

此文件指示用户进程将被限制映射的地址空间量。由于内核空引用错误可能会根据内存前几页中的信息意外操作,因此不应允许用户空间进程写入它们。默认情况下,此值设置为 0,安全模块不会强制执行任何保护。将此值设置为 64k 之类的值将允许绝大多数应用程序正常工作,并针对未来潜在的内核错误提供深度防御。

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

page-cluster
/proc/sys/vm 是 Linux 内核模块的一个接口,用于控制和调整虚拟内存子系统的参数。
page-cluster 代表页面簇(cluster)的大小,它是指在从磁盘加载页面到内存时,内核一次要从磁盘读取的页面数量。页面簇的默认大小是 3 个页面。
较大的页面簇大小可提高磁盘I/O效率,因为操作系统可以一次预取并加载更多的页面到内存中。然而,较大的页面簇大小也可能导致页面的浪费,因为如果只使用页面簇中的一部分页面,其他页面就会被浪费掉。
调整 page-cluster 的值可能需要根据系统的特定需求进行实验和调整,以找到适合系统性能的最佳设置。

==============================================================
percpu_pagelist_high_fraction
这是每个区域中可以存储到 per-cpu 页面列表的页面比例。它是根据在线 CPU 数量划分的上限。最小值为 8,这意味着我们不允许每个区域中超过 1/8 的页面存储在每个 CPU 的页面列表中。此条目仅更改热 per-cpu 页面列表的值。用户可以指定一个像 100 这样的数字来在每个 CPU 列表之间分配每个区域的 1/100。

无论高分数的值如何,每个每 cpu 页面列表的批处理值都保持不变,因此分配延迟不受影响。

初始值为零。内核使用该值根据区域的低水位线和本地在线 CPU 的数量来设置高 pcp->high 标记。如果用户向这个 sysctl 写入“0”,它将恢复到这个默认行为。

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

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

==============================================================
memory_failure_recovery

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

1:尝试恢复。

0:内存故障时painic。

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

mmap_rnd_compat_bits

此值可用于选择位数,以确定 vma 区域基址的随机偏移量,这些偏移量是由在支持调整地址空间随机化的架构上以兼容模式运行的应用程序的 mmap 分配产生的。该值将受架构支持的最小和最大值的限制。

该值可以在启动后使用 /proc/sys/vm/mmap_rnd_compat_bits 可调参数进行更改

==============================================================
memory_failure_early_kill

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

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

0:只从所有进程中取消映射损坏的页面,并且只杀死一个试图访问它的进程。

杀死是使用带有 BUS_MCEERR_AO 的可捕获 SIGBUS 完成的,因此进程可以根据需要处理此问题。

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

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

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

stat_refresh

任何读取或写入(仅限 root)都会将所有 per-cpu vm 统计信息刷新到它们的全局总数中,以便在测试时获得更准确的报告,例如猫 /proc/sys/vm/stat_refresh /proc/meminfo

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

在Linux操作系统中,/proc/sys/vm目录包含了与虚拟内存管理相关的参数和统计信息。其中,stat_refresh是一个控制内核是否更新/proc/stat文件中系统统计信息的参数。
/proc/stat文件包含了系统中各种进程和资源的统计信息,包括CPU使用情况、上下文切换次数、中断次数等。这些统计信息对于系统性能分析和监控非常有用。
stat_refresh参数决定了内核更新/proc/stat文件中统计信息的频率。当stat_refresh被设置为非零值时,内核会以固定的时间间隔更新/proc/stat文件,将最新的统计信息写入其中。这样,用户程序可以通过读取/proc/stat文件获取最新的系统统计信息。
默认情况下,stat_refresh被设置为0,表示禁用内核自动更新/proc/stat文件。用户程序可以通过将stat_refresh设置为非零值,启用自动更新功能。
总而言之,stat_refresh参数用于控制内核是否自动更新/proc/stat文件中的系统统计信息。启用该功能可以让用户程序获取实时的系统性能统计信息,用于系统监控和性能优化等目的。

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

当页面分配性能成为瓶颈并且您可以容忍一些可能的工具损坏和降低的 numa 计数器精度时,您可以执行以下操作:

echo 0 > /proc/sys/vm/numa_stat

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

echo 1 > /proc/sys/vm/numa_stat

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

unprivileged_userfaultfd

unprivileged_userfaultfd 是一个位于 /proc/sys/vm 文件中的内核参数,它用于控制是否允许非特权用户创建和使用 userfaultfd 文件描述符。
userfaultfd 是一种用于处理用户空间中的页面错误的机制。它允许用户空间程序注册一个文件描述符,以接收有关指定内存区域的页面错误通知。当发生页面错误时,内核将发送通知给用户空间,用户空间程序可以根据这些通知来处理错误,例如重新映射页面或从其他位置读取缺失的数据。
unprivileged_userfaultfd 参数允许非特权用户创建和使用 userfaultfd 文件描述符。在以前的内核版本中,只有特权用户(例如管理员)才能创建和使用 userfaultfd 文件描述符。但是,通过设置 unprivileged_userfaultfd 参数为1,非特权用户也可以创建和使用 userfaultfd 文件描述符。
启用 unprivileged_userfaultfd 参数有助于扩展 userfaultfd 的使用范围,使更多的应用程序能够受益于这个机制。例如,它可以用于内核虚拟机监视器(KVM)等虚拟化软件中,以提高内存管理的效率和性能。
需要注意的是,启用 unprivileged_userfaultfd 参数可能会增加系统的风险,因为用户空间程序有可能滥用 userfaultfd 机制来执行恶意操作。因此,在启用该参数之前,需要评估系统的安全需求,并确保用户空间程序的可信度。

==============================================================
mmap_rnd_compat_bits
在 /proc/sys/vm 目录下,mmap_rnd_compat_bits 的作用是为 Linux 内核中的 mmap() 系统调用提供一个额外的安全层级。它用于随机化进程的虚拟地址空间布局,使攻击者难以预测内存布局并利用缓冲区溢出等漏洞。
该特性通过在 mmap() 系统调用期间随机化内存映射的基地址来工作。在支持该特性的系统上,默认情况下,mmap_rnd_compat_bits 设置为8,这意味着映射的基地址将在256个页面(每个页面大小为4KB)的范围内随机化。可以通过内核中的配置选项来调整此范围。
随机化虚拟地址空间布局使攻击者更难成功发起攻击,因为他们需要猜测正确的内存地址进行攻击。它还有助于防止常见的利用技术,如返回导向编程(ROP),通过使攻击者更难在内存中找到所需的工具。
总而言之,mmap_rnd_compat_bits 是一个安全特性,通过随机化进程的内存映射布局来增强程序的保护。建议启用此特性以提高系统的安全性。

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

watermark_boost_factor

在 /proc/sys/vm 目录下,watermark_boost_factor 是一个与内存分配和回收相关的参数。它代表了一个提升因子,用于调整内核在当系统内存紧张时触发内存回收的水位线。
水位线是内核用于判断是否需要触发内存回收的阈值。当空闲内存低于水位线时,内核会启动内存回收机制以释放内存并避免系统内存耗尽。水位线通常分为三个等级:min、low 和 high。
watermark_boost_factor 是一个浮点数,其默认值为1.0。它决定了在内存紧张时,内核将水位线向下调整的程度。较大的值将降低水位线,使内核更频繁地触发内存回收,从而提高内存的利用率和系统的响应性能。较小的值将增加水位线,使内核更少地触发内存回收,从而减少系统的开销。
调整 watermark_boost_factor 的值可以根据系统的需求来平衡内存利用率和响应性能。一般情况下,较大的值适用于高负载系统,而较小的值适用于资源充足的系统。

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

watermark_scale_factor

在 /proc/sys/vm 目录下,watermark_scale_factor 是一个与内存管理相关的参数。它用于调整内核在计算内存水位线时考虑的“内存压力”因素的比例。
内存水位线是内核用于判断是否需要触发内存回收的阈值。当系统内存紧张时,内核将调整水位线,并启动内存回收机制以释放内存并避免系统内存资源耗尽。内核根据多个因素来计算水位线,其中之一就是“内存压力”。
watermark_scale_factor 是一个浮点数,默认值为1.0。它决定了内核在计算水位线时将“内存压力”因素乘以多少。较大的值将增加内存压力对水位线的影响,使内核更敏感地触发内存回收。较小的值则减少内存压力对水位线的影响,使内核更少地触发内存回收。
调整 watermark_scale_factor 的值可以根据系统的需求来平衡内存利用率和系统的响应性能。较大的值适用于对内存利用率敏感的系统,例如服务器;而较小的值适用于对系统响应性能敏感的系统,例如桌面计算机或移动设备。
值得注意的是,调整 watermark_scale_factor 需要慎重,因为过高或过低的值可能导致系统的性能问题或内存资源管理不足。建议在根据实际情况进行调整之前,先进行充分的测试和评估。

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

zone_reclaim_mode

在 /proc/sys/vm 目录中,zone_reclaim_mode 是一个控制内核分页器回收内存区域的参数。它用于确定是否应该尝试回收 NUMA 架构中分区的内存。
NUMA (Non-Uniform Memory Access) 架构是一种非一致性内存访问架构,其中系统中的不同内存区域(也称为节点)可能与处理器有不同的访问延迟和带宽。内核会尝试在本地节点上分配内存以提高性能,但当本地节点内存不足时,它可能还会尝试从其他节点上的内存分配。
zone_reclaim_mode 参数控制了内核在分配内存时是否尝试回收其他节点上的内存来满足请求。该参数的值可以是以下几种模式之一:

0:表示不启用区域回收模式。内核将仅在本地节点上尝试分配内存,而不会回收其他节点上的内存。这可能导致节点上的内存不均衡分布。

1:表示启用区域回收模式。内核将在本地节点内存不足时尝试回收其他节点上的内存。这可以帮助提高内存的分布均衡性,但可能会引入额外的开销。

2:表示启用区域回收模式,并使用不可靠的回收功能。内核将在本地节点内存不足时尝试回收其他节点上的内存,并使用一种不可靠的算法来决定回收的内存是否符合条件。这可以进一步提高内存的分布均衡性,但可能导致一些性能问题。

通过设置 zone_reclaim_mode 参数,可以根据系统需求平衡内存分配的性能和分布均衡性。对于 NUMA 架构的系统,启用合适的区域回收模式可以帮助优化内存管理和性能。

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

mmap_rnd_bits