4.3. 配置工具

内存使用量往往是通过设置一个或多个内核的参数值来进行配置的。这些参数可以通过改变在 /proc 文件系统中的文件内容来进行暂时设置,或是通过设置系统核心参数工具来进行永久设置,此工具由 procps-ng 数据包提供。
例如,要将 overcommit_memory 参数暂时设置为 1,请运行以下指令:
# echo 1 > /proc/sys/vm/overcommit_memory
要永久设置这个值,请运行以下指令:
# sysctl vm.overcommit_memory=1
暂时设置一个参数有利于决定此参数对系统的影响。用户可以在确定了参数值有预期的效果之后再将其设置为永久值。

4.3.1. 配置大页面

大页面依赖于连续的内存区域,因此最好在启动时,也就是在内存变为片段前就定义好大页面。为此,请添加以下参数至内核启动命令行:
hugepages
启动时在内核中定义 2MB 定值大页面的数量。默认值为 0。只有在系统拥有足够的物理持续性空闲页面时才能进行分配(或是收回)大页面。此参数保留的页面不能用于其他目的。
此值可以在启动后通过改变 /proc/sys/vm/nr_hugepages 文件值来调节。
更多详情请参阅相关内核文档,默认安装于 /usr/share/doc/kernel-doc-kernel_version/Documentation/vm/hugetlbpage.txt 中。
/proc/sys/vm/nr_overcommit_hugepages
通过超量使用内存来定义系统所能创建和使用的最大数量的额外大页面。在此文件中写入任何非零的值,表示系统包含此数目的大页面,在不变的页面池耗尽后,这些大页面便来自于内核的常规页面池。由于这些额外的大页面是未使用过的,因此它们会释放并返回至内核的常规页面池中。

4.3.2. 配置系统内存容量

本章探讨与内存相关的内核参数,它们可能有助于提高用户系统的内存使用率。基于测试目的,可以通过改变 /proc 文件系统中相应的文件值来暂时设置这些参数。一旦决定了能提供最佳性能的值,就可以使用 sysctl 指令来进行永久设置。

4.3.2.1. 虚拟内存参数

此章中的参数都在 /proc/sys/vm 内,除非另有标明。
dirty_ratio
一个百分比值。当整个系统内存的这一百分比值被修改时,系统会通过运行 pdflush 将改动写入磁盘。默认值为 20%。
dirty_background_ratio
一个百分比值。当整个系统内存的这一百分比值被修改时,系统会在后台将改动写入磁盘。默认值为 10 %。
overcommit_memory
定义用来决定接受或拒绝一个大内存请求的注意事项。
默认值为 0。默认情况下,内核执行探索法内存超量使用,是通过估算可用内存大小和由于太大而失败的请求来进行处理的。但由于内存分配使用的是探索法而不是精确算法,这一设置导致超载内存是可能的。
当这一参数设置成 1 时,内核不执行内存超量使用处理。这增加了内存超量的可能性,但提高了内存密集型任务的性能。
当这一参数设置成 2 时,内核拒绝请求,即请求的内存等于或大于总的可用交换空间,以及在 overcommit_ratio 中指定的物理 RAM 的百分比。这减少了超量使用内存的风险,但仅在系统交换空间大于物理内存时推荐此设置。
overcommit_ratio
overcommit_memory 设置为 2 时,设定所考虑的物理 RAM 的百分比。默认值为 50
max_map_count
定义一个进程可以使用的最大内存映射区域数量。默认值(65530)适用于大部分情况。如果应用程序需要映射超过此数量的文件,可增加此值。
min_free_kbytes
指定千字节的最小数量,使之在整个系统中都保持空闲。这是用来给每一个低内存区决定一个合适的值,每一个低内存区都按照其大小比例分配了大量保留的空闲页面。

警告

极值会损坏用户的系统。将 min_free_kbytes 设置为一个极小的值以防止系统回收内存,回收内存会导致系统锁死,以及 OOM-killing 进程。但是,将 min_free_kbytes 设置过高 (例如,整个系统内存的 5–10% )会使系统立即进入一种内存不足的状态,导致系统花太多时间来回收内存。
oom_adj
在系统内存不足,并且 panic_on_oom 参数设置成 0 的情况下,oom_killer 功能会结束进程,直至系统可以恢复,从最高的 oom_score 进程开始。
oom_adj 参数有助于确定一个进程的 oom_score。此参数以每一个进程标识符为单位进行设置。值为 -17 时会禁用进程的 oom_killer。其他有效值是从 -1615

注意

由一个调整过的进程而产生的进程会继续该进程的 oom_score
swappiness
一个从 0100 的值可以控制系统交换的程度。高值优先考虑系统效率,并在进程不活跃时主动交换物理内存耗尽的进程。低值优先考虑响应度,并且尽可能久地避免交换物理内存耗尽的进程。默认值为 60

4.3.2.2. 文件系统参数

此章中的参数都在 /proc/sys/fs 内,除非另有标明。
aio-max-nr
定义在异步输入/输出环境中允许的最大事件数量。默认值为 65536。修改此值不会预分配或改变任何内核数据结构的大小。
file-max
定义内核分配的最大的文件句柄数量。默认值与内核中的 files_stat.max_files 值相匹配,将此值设为最大值 NR_FILE(8192,在红帽企业版 Linux 中)或是以下结果:
(mempages * (PAGE_SIZE / 1024)) / 10
增加此值可以解决由于缺少可用的文件句柄而引起的错误。

4.3.2.3. 内核参数

此章中的参数都在 /proc/sys/kernel 内,除非另有标明。
msgmax
以字节为单位,定义任何一个在信息队列中的信息可能的最大值。该值不能超过队列的大小(msgmnb)。默认值为 65536
msgmnb
以字节为单位,定义每一个信息队列的最大值。默认值为 65536
msgmni
定义信息队列标识符的最大数量(以及队列的最大数量)。在 64 位架构的系统中,默认值为 1985
shmall
定义页面上共享内存的总量,这些内存是系统可以同时使用的。
shmmax
定义页面上内核允许的单个共享内存片段的最大值。
shmmni
定义系统范围内最大的共享内存片段数量。在所有系统中的默认值为 4096
threads-max
定义系统范围内内核能同时使用的最大线程量。默认值与内核参数 max_threads 相同,或为以下结果:
mempages / (8 * THREAD_SIZE / PAGE SIZE )
最小值为 20