这些内核参数有可能有助于提高系统的内存利用率。通过更改/proc
文件系统中相应的文件的值来临时设置这些参数以用于测试目的。确定用例生成最佳性能的值后,可以使用sysctl
命令永久设置它们。
通常通过设置一个或多个内核参数的值来配置内存使用情况。可以通过更改/proc
文件系统中文件的内容来临时设置这些参数,也可以使用procps-ng
软件包提供的sysctl
工具永久设置这些参数。
例如,要将overcommit_memory
参数临时设置为1:1
echo 1 > /proc/sys/vm/overcommit_memory
要永久设置这个值,在/etc/sysctl.conf
文件中添加vm.overcommit_memory=1
然后运行:
1 | sysctl -p |
临时设置参数对于确定参数对系统的影响很有用。然后,当确定参数的值有所需效果时,可以永久设置参数。
虚拟内存参数
除非另有说明,否者列出的参数都位于
/proc/sys/vm
中。
dirty_ratio
百分比值,修改总系统内存的百分比时,系统开始使用
pdflush
操作将修改写入磁盘。默认为20%
。dirty_background_ratio
百分比值,修改系统总内存百分比时,系统开始后台将修改写入磁盘。默认值为
20%
。overcommit_memory
定义是接受还是拒接大内存请求的条件。
默认值为
0
,默认情况下,内核通过估计可用内存量和过大的请求失败来执行启发式内存过量使用处理。但是由于使用启发式而非精准算法分配内存,因此使用此设置可以重载内存。当此参数设置为1时,内核不执行内存过量使用处理。增加了内存过载的可能性,但提高了内存密集型任务的性能。
当此参数设置为
2
时,内核拒绝内存请求等于或大于总可用SWAP
空间和overcommit_ratio
中指定的物理RAM的百分比之和。这样可以降低过度使用内存的风险,但建议仅适用于交换区域大于物理内存的系统。overcommit_ratio
指定当
overcommit_memory
设置为2时考虑的物理RAM的百分比。默认是50%
。max_map_conut
定义进程可以使用的最大内存映射区域数。默认为
65545
,适用于大多数情况。如果程序需要映射超过此数量的文件,增加此值。min_free_kbytes
指定在系统中保持空闲的最小千字节数。这用于确定每个低内存区域的适当值,每个低内存区域都按照其大小按比例分配了多个保留的内存空闲页面。
极端值可能会损坏系统。将
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
。swappiness
swappiness
值(0-100)控制系统支持的匿名内存或页面缓存程度。较高的值可提高文件系统性能,同时积极地将较少活动的进程从RAM中交换出来。较低的值可避免将进程交换到内存中,这通常或降低延迟,但代价是I/O
性能。默认为60
。设置
swappiness==0
将非常积极的避免交换。这增加了强内存和I/O压力下OOM被杀死的风险。
文件系统参数
所列出的参数位于/proc/sys/fs
.
aio-max-nr
定义所有活动异步输入/输出上下文中允许的最大事件数。默认值为
65535
。修改此值不会预先分配或调整任何内核数据结构的大小。file-max
确定整个系统的最大文件句柄数。默认值最大值是
8192
或者可用内存页面的十分之一。提高此值可以解决由于缺少可用文件句柄而导致的错误。
内核参数
以下参数的默认位于/oroc/sys/kernel
中,可由内核在引导时根据可用的系统资源计算。
msgmax
定义消息队列中任何单个消息的最大允许大小(以字节为单位)。该值不得超过队列的大小(msgmnb)。要确定系统上的当前
msgmax
值,使用:1
sysctl kernel.msgmax
msgmnb
定义单个消息队列的最大值(字节为单位),要确定系统上的当前
msgmnb
值,使用:1
sysctl kernel.msgmnb
msgmni
定义消息队列标识符的最大数量(以及队列的最大数量),要确定系统上的当前
msgmin
值,使用:1
sysctl kernel.msgmni
shmall
定义一次可在系统上使用的共享内存页面的总数,例如,x86_64架构上的页面为4096字节。
要确定系统当前
shmall
值,使用:1
sysctl kernel.shmall
shmmax
定义内核允许的单个共享内存段的最大大小(字节为单位)。要确定系统上的当前
shmmax
值,使用:1
sysctl kernel.shmmax
shmmni
定义系统范围的最大共享内存段数,所有系统上的默认值均为
4096
。threads-max
定义一次可用于内核的系统阀内最大线程数。要确定系统上当前的
threads-max
值,使用:1
sysctl kernel.threads-max
默认结果是:
1
mempages/(8*THREAD_SIZE/PAGESIZE)