缘起
笔者最近新部署的一套redis集群因为没有配置auto-aof-rewrite-percentage
和auto-aof-rewrite-min-size
选项,造成AOF文件不断增大,在手动进行BGREWRITEAOF
时,观察日志发现系统分配内存问题导致AOF重写失败。所以研究了下Linux系统容量相关的内存调优。
系统内存调优
与内存容量调节相关参数都保存在/proc/sys/vm
目录中
overcommit_memory
规定决定是否接受超大内存请求的条件。这个参数有三个可能的值:
0 — 默认设置。内核执行启发式内存过量使用处理,方法是估算可用内存量,并拒绝明显无效 的请求。遗憾的是因为内存是使用启发式而非准确算法计算进行部署,这个设置有时可能会造 成系统中的可用内存超载。
1 — 内核执行无内存过量使用处理。使用这个设置会增大内存超载的可能性,但也可以增强大 量使用内存任务的性能。
2 — 内存拒绝等于或者大于总可用 swap 大小以及 overcommit_ratio 指定的物理 RAM 比例 的内存请求。如果您希望减小内存过度使用的风险,这个设置就是最好的。如果系统的Swap分区大于物理内存可以使用这个设置,如果系统没有设置swap或者swap分区很小不建议使用此参数,因为整个系统可能会OOM掉。
overcommit_ratio
将 overcommit_memory 设定为 2 时,指定所考虑的物理 RAM 比例。默认为 50。
max_map_count
规定某个进程可能使用的最大内存映射区域。在大多数情况下,默认值 65530 就很合适。如果您 的程序需要映射比这个文件数更多的文件可增大这个值。
nr_hugepages
规定在内核中配置的超大页数。默认值为 0。只有系统中有足够的连续可用页时方可分配(或者取 消分配)超大页。为这个参数保留的页无法用于其他目的。
虚拟内存调节
虚拟内存一般由进程、文件系统缓存以及内核消耗。虚拟内存的使用由很多因素决定,受以下参数影响:
swappiness
参数值可为 0-100,控制系统 swap 的程序。高数值可优先系统性能,在进程不活跃时主动将其转 换出物理内存。低数值可优先互动性并尽量避免将进程转换处物理内存,并降低反应延迟。默认值 为 60。
min_free_kbytes
保证系统间可用的最小 KB 数。这个值可用来计算每个低内存区的水印值,然后为其大小按比例分 配保留的可用页。
设定这个参数时请小心,因为该值过低和过高都有问题。
min_free_kbytes 太低可防止系统重新利用内存。这可导致系统挂起并让 OOM 杀死多个 进程。
但将这个参数值设定太高(占系统总内存的 5-10%)会让您的系统很快会内存不足。Linux 的设计是使用所有可用 RAM 缓存文件系统数据。设定高 min_free_kbytes 值的结果是在 该系统中花费太多时间重新利用内存。
dirty_ratio
规定百分比值。当脏数据组成达到系统内存总数的这个百分比值后开始写下脏数据(pdflush)。 默认值为 20。
dirty_background_ratio
规定百分比值。当脏数据组成达到系统内存总数的这个百分比值后开始在后端写下脏数据 (pdflush)。默认值为 10。
drop_caches
将这个值设定为 1、2 或者 3 让内核放弃各种页缓存和 slab 缓存的各种组合。
1 系统无效并释放所有页缓冲内存。
2 系统释放所有未使用的 slab 缓冲内存。
3 系统释放所有页缓冲和 slab 缓冲内存。
这是一个非破坏性操作。因为无法释放脏项目,建议在运行 sync 设定这个参数值。 不建议在生产环境中使用 drop_caches 释放内存。
调整方法
调整这些参数的方法可以分两种情况,临时调整和永久设定
已笔者遇到的AOF重写失败情况为例,需要临时调节。
临时调节
1 | # echo 1 > /proc/sys/vm/overcommit_memory |
永久设定
永久设定需要使用sysctl这个命令,示例如下:
1 | # echo 'vm.overcommit_memory' >> /etc/sysctl.conf && sysctl -p |