Too young, too simple. Sometimes, naive & stupid

配置系统内存容量

这些内核参数有可能有助于提高系统的内存利用率。通过更改/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。其他有效值为-1615

    由调整后的进程生成的进程会集成进程的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)