7.5. 配置系统内存容量
本节讨论与内存相关的内核参数,这些参数可能有助于提高系统上的内存利用率。通过更改
/proc
文件系统中对应文件的值,可以临时为测试目的设置这些参数。确定为用例生成最佳性能的值后,您可以使用 sysctl 命令永久设置它们。
内存用量通常通过设置一个或多个内核参数的值来配置。这些参数可以通过更改 /proc 文件系统中文件的内容来临时设置,也可以使用 sysctl 工具(由 procps-ng 软件包提供)永久设置。
例如,要临时将 overcommit_memory 参数设置为 1,请运行以下命令:
# echo 1 > /proc/sys/vm/overcommit_memory
要永久设置这个值,请在
/etc/sysctl.conf
中添加 sysctl vm.overcommit_memory=1
,然后运行以下命令:
# sysctl -p
临时设置参数对于确定参数对您的系统的影响很有用。当您确定参数的值具有所需的效果时,您可以永久设置 参数。
注意
7.5.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
- 指定在系统中保持可用最小 KB 数。这用于为每个低内存区域确定适当的值,每个低内存区域会根据它们的大小分配大量保留的可用页面。警告极端值可能会破坏您的系统。将
min_free_kbytes
设置为非常低的值可防止系统回收内存,这可能会导致系统挂起和 OOM 终止进程。但是,设置min_free_kbytes
太高(例如,系统内存总量为 5-10%)会导致系统立即进入内存不足状态,从而导致系统花费太多时间回收内存。 - oom_adj
- 如果系统内存不足,
panic_on_oom
参数被设置为0,
oom_killer
函数会终止进程,直到系统可以恢复,从具有最高oom_score
的进程开始。oom_adj
参数帮助确定进程的oom_score
这个参数是为每个进程标识符设置的。值-17
可禁用该进程的oom_killer
。其他有效值包括从-16
到15
。注意由调整的进程生成的进程会继承oom_score
进程的 oom_score。 - swappiness
- swappiness 值范围从
0
到100
,控制系统优先选择匿名内存或页面缓存的程度。高值提高了文件系统性能,同时将较少的活动进程从 RAM 交换出来。低值可避免将进程交换出内存,这通常会降低 I/O 性能。默认值为60
。警告设置swappiness==0
将非常积极避免交换,这会增加 OOM 终止遭受强内存和 I/O 压力的风险。
7.5.2. 文件系统参数
本节中列出的参数位于
/proc/sys/fs
中,除非另有说明。
- aio-max-nr
- 定义所有活跃的异步输入/输出上下文中允许的最大事件数。默认值为
65536
。修改这个值不会预先分配或重新定义任何内核数据结构。 - file-max
- 确定整个系统处理的最大文件数。Red Hat Enterprise Linux 7 的默认值是
8192
的最大值,或者内核启动时可用的空闲内存页中最多的 10 个。增加这个值可解决缺少可用文件 handle 导致的错误。
7.5.3. 内核参数
以下参数的默认值(位于
/proc/sys/kernel/
目录中)可在引导时由内核计算,具体取决于可用的系统资源。
- msgmax
- 定义消息队列中任意条消息的最大允许大小,以字节为单位。这个值不能超过队列的大小(
msgmnb
)。要确定系统中的当前msgmax
值,请使用:# sysctl kernel.msgmax
- msgmnb
- 定义单个消息队列的最大字节大小。要确定系统中的当前
msgmnb
值,请使用:# sysctl kernel.msgmnb
- msgmni
- 定义消息队列标识符的最大数量,以及队列的最大数量。要确定系统中的当前
msgmni
值,请使用:# sysctl kernel.msgmni
- shmall
- 定义一次系统上可以使用的共享内存页面总量。例如,AMD64 和 Intel 64 构架中的页面是 4096 字节。要确定系统中的当前
shmall
值,请使用:# sysctl kernel.shmall
- shmmax
- 定义内核允许的单个共享内存段的最大大小(以字节为单位)。要确定系统中的当前
shmmax
值,请使用:# sysctl kernel.shmmax
- shmmni
- 定义系统范围的最大共享内存片段数。所有系统上的默认值为
4096
。 - threads-max
- 定义一次内核可用的系统范围最大线程数。要确定系统中的当前
threads-max
值,请使用:# sysctl kernel.threads-max
默认值为以下结果:mempages / (8 * THREAD_SIZE / PAGE SIZE )
最小值为20
。