25.3. 虚拟内存参数
虚拟内存参数列在 /proc/sys/vm
目录中。以下是可用的虚拟内存参数:
vm.dirty_ratio
- 一个百分比值。修改系统内存占总内存的百分比时,系统开始向磁盘写入修改。默认值为 20 百分比。
vm.dirty_background_ratio
- 一个百分比值。修改系统内存占总内存的百分比时,系统会在后台开始向磁盘写入修改。默认值为 10%。
vm.overcommit_memory
- 定义决定接受或拒绝大型内存请求的条件。默认值为 0。默认情况下,内核会检查虚拟内存分配请求是否适合存在的内存量(总计 + swap),并只拒绝大型请求。否则,会授予虚拟内存分配,并允许内存过量使用。
- 设置
overcommit_memory
参数的值 - 当此参数设置为 1 时,内核不会执行内存过量使用处理。这会增加内存过载的可能性,但提高了内存密集型任务的性能。
-
当此参数设置为 2 时,内核拒绝对内存的请求等于或大于可用交换空间总量,以及
overcommit_ratio
中指定的物理 RAM 的百分比。此设置降低了过量使用内存的风险,只对 swap 分区大于其物理内存的系统使用。
vm.overcommit_ratio
-
当
overcommit_memory
设为 2 时,指定物理 RAM 的百分比。默认值为 50。 vm.max_map_count
- 定义进程可以使用的最大内存映射区域数。默认值为 65530。如果您的应用程序需要更多内存映射区域,则提高这个值。
vm.min_free_kbytes
-
设置保留可用页面池的大小。它还负责设置管理 Linux 内核中页面回收算法行为的
min_page
、low_page
和high_page
阈值。它还指定在系统中保留最少的可用 KB 数。这会为每个低内存区计算一个特定值,每个值都会被分配一个保留的空闲页面的大小。 - 设置
vm.min_free_kbytes
参数的值 - 增加参数值可有效减少应用程序工作集可用内存。因此,您只能将其用于内核驱动的工作负载,其中驱动程序缓冲区需要在原子上下文中分配。
减少参数值可能会导致内核无法服务系统请求,如果内存在系统中发生大量处理。
警告极端的值可能会降低系统性能。将
vm.min_free_kbytes
设置为非常低的值可防止系统有效地回收内存,这可能会导致系统崩溃并失败服务中断或其他内核服务。但是,设置vm.min_free_kbytes
太大地增加系统回收活动,从而导致分配延迟因为假的直接重新声明状态而造成分配延迟。这可能导致系统立即进入内存不足状态。vm.min_free_kbytes 参数还设置页面重新声明水位线,称为min_pages
。在确定两个其他内存水位线、low_pages
和high_pages
时,这个水位线被用作一个因素,它管理页面重新声明算法。/proc/PID/oom_adj
在事件中,当系统内存不足,并且panic_on_oom
参数设置为 0 时,oom_killer
功能会终止进程,从具有最高oom_score
的进程开始,直到系统恢复为止。oom_adj
参数决定了进程的oom_score
。这个参数会根据进程标识符设置。值 -17 可禁用该进程的oom_killer
。其他有效的值范围从 -16 到 15。注意由调整的进程创建的进程将继承该进程的
oom_score
。
vm.swappiness
- swappiness 值范围从 0 到 200,控制系统从匿名内存池回收内存或页面缓存内存池的程度。
- 设置 swappiness 参数的值
- 高的值首选文件映射驱动的工作负载,同时交换出较少访问的进程的 RAM 匿名映射内存。这对依赖于数据的文件或流应用(如存储中的文件)非常有用,以减少服务请求的 I/O 延迟。
低值优先选择匿名映射驱动的工作负载,同时回收页面缓存(文件映射内存)。这个设置对于不依赖于文件系统信息的应用程序很有用,并且主要利用动态分配和私有内存,如数学和数字缩小应用程序,以及某些硬件虚拟化超级visors (如 QEMU)。
vm.swappiness
参数的默认值为 60。警告将
vm.swappiness
设置为 0 主动避免将匿名内存交换到磁盘,这会增加oom_killer
功能在内存或 I/O 密集型工作负载期间终止进程的可能性。