搜索

7.5. 配置系统内存容量

download PDF
本节讨论与内存相关的内核参数,这些参数可能有助于提高系统上的内存利用率。通过更改 /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。其他有效值包括从 -1615
注意
由调整的进程生成的进程会继承 oom_score 进程的 oom_score。
swappiness
swappiness 值范围从 0100,控制系统优先选择匿名内存或页面缓存的程度。高值提高了文件系统性能,同时将较少的活动进程从 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
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.