Redis linux配置优化

1. vm.overcommit_memory

关于overcommit_memory,linux操作系统对大部分申请内存的请求都回复yes,以便能运行更多的程序。因为申请内存后并不会马上使用内存,这种技术叫做overcommit,如果vm.overcommit_memory设置为0,Redis在启动时可能会有此提示信息:

2557:M 19 Jul 04:55:32.244 # 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.

即Redis提示把它设置为1.

vm.overcommit_memory用来设置内存分配策略,有三个可选值,如下:.

0: 表示内核将检查是否有足够的可用内存。如果有足够的可用内存,内存申请通过,否则内存申请失败,并把错误返回给应用程序

1:表示内核允许超量使用内存直到用完为止

2: 表示内核绝不过量("never overcommit")使用内存,即系统整个内存地址空间不能超过swap+50%的RAM值,50%是overcommit_ratio默认值,该参数同样支持修改。

日志中的backgroud save代表的是bgsave和bgrewriteaof,如果当前内存不足,vm.overcommit_memory设置为0,操作系统在处理fork操作时可能出现申请内存失败的情况,在Redis的日志会出现cannot allocate memory.

Redis建议把这个值设置为1,就是为了让fork操作能够在低内存下也执行成功。

设置方法:

[root@orcl19c redis]# cat /proc/sys/vm/overcommit_memory 
0
[root@orcl19c redis]# echo "vm.overcommit_memory =1" >> /etc/sysctl.conf
[root@orcl19c redis]# sysctl vm.overcommit_memory =1
vm.overcommit_memory = 0
sysctl: malformed setting "=1"

2. swappiness

对于操作系统,当物理内存不足时可以将一部分内存也进行swap操作,但swap空间由硬盘提供,对于需要高并发、高吞吐的应用来说,磁盘IO通常会成为系统瓶颈。在linux中,并不是要等到所有物理内存都使用完才会使用到swap,系统参数swappiness会决定操作系统使用swap的倾向程度。swappiness的取值范围是0-100,swappiness的取值越大,说明操作系统可能使用swap的概率越高,越低则越倾向于使用物理内存,其默认值为60。Redis linux配置优化_第1张图片

OOM(out of memory) killer是指linux操作系统发现可用内存不足时,强制杀死一些用户进程(非内核进程),来保证系统有足够的内存进行分配。

注:swappiness参数在linux3.5版本前后表现的并不完全相同,因此设置该参数时应考虑到操作系统的版本。

设置方法:

[root@orcl19c redis]# echo 60 > /proc/sys/vm/swappiness  --设置操作,重启后会失效
[root@orcl19c redis]# echo vm.swappiness=60 >> /etc/sysctl.conf --追加操作,重启后会立即生效

swap监控:

(1). 查看swap总体情况

free -m

(2). 实时查看swap使用情况

vmstat 1

其中si和so代表操作系统的swap in和swap out

(3). 查看指定进程的swap使用情况

linux操作系统中,/proc/{pid}目录是存储指定进程的相关信息,其中/proc/{pid}/smaps记录了当前进程所对应的内存镜像信息,取一个Redis实例进行说明。

--获取Redis实例进程号

[root@orcl19c ~]# redis-cli -p 6379 info server |grep process
process_id:3492

 --获取进程总的使用swap大小

[root@orcl19c ~]# cat /proc/3492/smaps |grep Swap 
Swap:                  0 kB
Swap:                  0 kB
Swap:                  0 kB
Swap:                  0 kB
Swap:                  0 kB
Swap:                  0 kB
Swap:                  0 kB

设置建议:

如果linux>3.5,vm.swappiness=1,否则vm.swappiness=0,以实现如下两个目标:

物理内存充足的时候,使redis足够块

物理内存不足的时候,避免Redis死掉(如果当前Redis为高可用,死掉比阻塞更好)

3. 禁用THP透明大页

3492:M 23 Jul 06:42:04.641 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

从提示看,Redis建议修改THP的相关配置, linux kernel在2.6.38增加了THP特性,支持大内存页(2mb)分配,默认开启。当开启时可以降低fork子进程的速度,但fork操作之后,每个内存页从原来4KB变为2MB,会大幅增加重写期间父进程内存消耗。同时每次写命令引起的复制内存页单位放大了512倍,会拖慢写操作的执行时间,导致大量写操作慢查询。

禁用方法:

[root@orcl19c ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled 
[root@orcl19c ~]# echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled " >> /etc/rc.local  --永久生效

4. OOM killer

 

你可能感兴趣的:(Redis)