一,cpu,内存规划
CPU:
CPU不求核数多,但求主频高,Cache大,因为redis主处理模式是单进程的
内存:
一定要设置最大内存maxmemory参数,否则物理内存用爆了就会大量使用Swap
最少预留出55%的内存,在系统极度繁忙时,如果父进程的所有Page在子进程写RDB过程中都被修改过了,就需要两倍内存。
mem_fragmentation_ratio为内存碎片率
>内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低,也说明redis没有发生内存交换。
>但如果内存碎片率超过1.5,那就说明Redis消耗了实际需要物理内存的150%,其中50%是内存碎片率
>若是内存碎片率低于1的话,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换。内存交换会引起非常明显的响应延迟
内存优化系统配置:
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
lru策略:
默认策略为volatile-lru,对设置了expire time的key进行LRU清除,如果所有的key都没有设置expire timep写redis会报错
配置为noeviction时,内存超过maxmemory时写redis会报错
配置为allkeys-lru时,对所有key都做LRU
如果没有设置超时时间,则lru的策略需要设置为allkeys-lru,并且应用需要做好未命中的异常处理。特殊的,当redis当做DB时,请使用noneviction策略,但是需要对系统内存监控加强粒度
二,持久化设置
RDB和AOF两者毫无关系,完全独立运行,如果使用了AOF,重启时只会从AOF文件载入数据,不会再管RDB文件。
在配置上有三种选择:不持久化,RDB,RDB+AOF。官方不推荐只开启AOF(因为恢复太慢另外如果aof引擎有bug),除非明显的读多写少的应用。
开启AOF时应当关闭AOF自动rewrite,并在crontab中启动在业务低峰时段进行的bgrewrite。 如果在一台机器上部署多个redis实例,则关闭RDB和AOF的自动保存(save "", auto-aof-rewrite-percentage 0),通过crontab定时调用保存:
m h * * * redis-cli -p <port> BGSAVE
m h */4 * * redis-cli -p <port> BGREWRITEAOF
持久化的部署规划上,如果为主从复制关系,建议主关闭持久化。
如果一台服务器上启多个redis实例,为了防止上下文切换导致的开销,可以采用taskset。taskset是LINUX提供的一个命令,可以让某个程序运行在某个(或)某些CPU上。
# ps -ef | grep redis 查看redis-server进程
1009 6658 1 0 Sep02 ? 00:24:18 redis-server *:6382 [cluster]
# taskset -p 6658 显示进程运行的CPU,6658为redis-server的进程号
pid 6658‘s current affinity mask: ffffff
# taskset -pc 23 6658 指定进程6658运行在第24个cpu(从0开始计数)
pid 6658‘s current affinity list: 0-23
pid 6658‘s new affinity list: 23
# taskset -p 6658
pid 6658‘s current affinity mask: 800000
也可以在启动时指定运行的cpu:
taskset -c 23 ./redis-server ../redis.conf
taskset命令选项:
-p, --pid operate on an existing PID and not launch a new task
-c, --cpu-list specify a numerical list of processors instead of a bitmask. The list may contain multiple items, separated by comma, and ranges. For example, 0,5,7,9-11.