Redis 在 Linux 系统的配置优化.docx
通常来看,Redis开发和运维人员更加关注的是Redis本身的一些配置优化,例如AOF和RDB的配置优化、数据结构的配置优化等,但是对于操作系统是否需要针对Redis做一些配置优化不甚了解或者不太关心,然而事实证明一个良好的系统操作配置能够为Redis服务良好运行保驾护航。
众所周知Redis的作者对于Windows操作系统并不感冒,目前大部分公司都会将Web服务器、数据库服务器等部署在Linux操作系统上,Redis也不例外。所以接下来介绍Linux操作系统如何优化Redis,包含如下七个方面。
一.内存分配控制
1.vm.overcommit_memory
Redis在启动时可能会出现这样的日志:
#?WARNING?overcommit_memory?is?set?to?0!?Background?save?may?fail?under?low?memory?condition.?To?fix?this?issue?add?vm.overcommit_memory?=?1?to?/etc/sysctl.conf?and?then?reboot?or?run?the?
command?sysctl?vm.overcommit_memory=1?for?this?to?take?effect.
在分析这个问题之前,首先要弄清楚什么是overcommit?Linux操作系统对大部分申请内存的请求都回复yes,以便能运行更多的程序。因为申请内存后,并不会马上使用内存,这种技术叫做overcommit。如果Redis在启动时有上面的日志,说明vm.overcommit_memory=0,Redis提示把它设置为1。
vm.overcommit_memory用来设置内存分配策略,它有三个可选值,如下表所示。
vm.overcommit_memory
含义
0
表示内核将检查是否有足够的可用内存。如果有足够的可用内存,内存申请通过,否则内存申请失败,并把错误返回给应用进程
1
表示内核允许超量使用内存直到用完为止
2
表示内核决不过量的(neverovercommit)使用内存,即系统整个内存地址空间不能超过swap+50%的RAM值,50%是overcommit_ratio默认值,此参数同样支持修改
注意:本文的可用内存代表物理内存与swap之和。
日志中的Backgroundsave代表的是bgsave和bgrewriteaof,如果当前可用内存不足,操作系统应该如何处理fork。如果vm.overcommit_memory=0,代表如果没有可用内存,就申请内存失败,对应到Redis就是fork执行失败,在Redis的日志会出现:
Cannot?allocate?memory?
Redis建议把这个值设置为1,是为了让fork能够在低内存下也执行成功。
2.获取和设置
获取:
cat?/proc/sys/vm/overcommit_memory
0
设置:
echo?vm.overcommit_memory=1??/etc/sysctl.conf
sysctl?vm.overcommit_memory=1
3.最佳实践
Redis设置合理的maxmemory,保证机器有20%~30%的闲置内存。
集中化管理aof重写和rdb的bgsave。
设置vm.overcommit_memory=1,防止极端情况下,会造成fork失败。
二.swappiness
1.参数说明
swap对于操作系统来比较重要,当物理内存不足时,可以swapout一部分内存页,以解燃眉之急。但世界上没有免费午餐,swap空间由硬盘提供,对于需要高并发、高吞吐的应用来说,磁盘IO通常会成为系统瓶颈。在Linux中,并不是要等到所有物理内存都使用完才会使用到swap,系统参数swppiness会决定操作系统使用swap的倾向程度。swappiness的取值范围是0~100,swappiness的值越大,说明操作系统可能使用swap的概率越高,swappiness值越低,表示操作系统更加倾向于使用物理内存。swap的默认值是60,了解这个值的含义后,有利于Redis的性能优化。下表对swappiness的重要值进行了说明。
swapniess
策略
0
Linux3.5以及以上:宁愿OOMkiller也不用swap
Linux3.4以及更早:宁愿swap也不要OOMkiller
1
Linux3.5以及以上:宁愿swap也不要OOMkiller
60
默认值
100
操作系统会主动地使用swap
运维提示:OOM(OutOfMemory)killer机制是指Linux操作系统发现可用内存不足时,强制杀死一些用户进程(非内核进程),来保证