1、fork耗时导致高并发请求延时


RDB和AOF的时候,其实会有生成RDB快照,AOF rewrite,耗费磁盘IO的过程,主进程fork子进程
fork的时候,子进程是需要拷贝父进程的空间内存页表的,也是会耗费一定的时间的
一般来说,如果父进程内存有1个G的数据,那么fork可能会耗费在20ms左右,如果是10G~30G,那么就会耗费20 * 10,
甚至20 * 30,也就是几百毫秒的时间
info stats中的latest_fork_usec,可以看到最近一次form的时长
redis单机QPS一般在几万,fork可能一下子就会拖慢几万条操作的请求时长,从几毫秒变成1秒


优化思路: fork耗时跟redis主进程的内存有关系,一般控制redis的内存在10GB以内,slave -> master,全量复制


2、AOF的阻塞问题


redis将数据写入AOF缓冲区,单独开一个现场做fsync操作,每秒一次
但是redis主线程会检查两次fsync的时间,如果距离上次fsync时间超过了2秒,那么写请求就会阻塞
everysec,最多丢失2秒的数据,一旦fsync超过2秒的延时,整个redis就被拖慢


优化思路: 优化硬盘写入速度,建议采用SSD,不要用普通的机械硬盘,SSD,大幅度提升磁盘读写的速度


3、主从复制延迟问题


主从复制可能会超时严重,这个时候需要良好的监控和报警机制
在info replication中,可以看到master和slave复制的offset,做一个差值就可以看到对应的延迟量
如果延迟过多,那么就进行报警


4、主从复制风暴问题


如果一下子让多个slave从master去执行全量复制,一份大的rdb同时发送到多个slave,会导致网络带宽被严重占用
如果一个master真的要挂载多个slave,那尽量用树状结构,不要用星型结构.使用slave of设置


5、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.




0: 检查有没有足够内存,没有的话申请内存失败
1: 允许使用内存直到用完为止
2: 内存地址空间不能超过swap + 50%


如果是0的话,可能导致类似fork等操作执行失败,申请不到足够的内存空间
查看当前值:

cat /proc/sys/vm/overcommit_memory


临时解决:

echo "vm.overcommit_memory=1" >> /etc/sysctl.conf 

 sysctl vm.overcommit_memory=1


永久解决方法:将其写入/etc/sysctl.conf文件中。
6、swapiness
查看当前值:
cat /proc/version,查看linux内核版本


如果linux内核版本<3.5,那么swapiness设置为0,这样系统宁愿swap也不会oom killer(杀掉进程)
如果linux内核版本>=3.5,那么swapiness设置为1,这样系统宁愿swap也不会oom killer


保证redis不会被杀掉
临时解决:

echo 0 > /proc/sys/vm/swappiness 

 echo vm.swapiness=0 >> /etc/sysctl.conf


永久解决方法:将其写入/etc/sysctl.conf文件中。
7、最大打开文件句柄


ulimit -n 10032 10032


自己去上网搜一下,不同的操作系统,版本,设置的方式都不太一样


8、tcp backlog
redis启动时报出了下面的警告
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set 
to the lower value of 128


意思是:TCP  backlog设置值,511没有成功,因为 /proc/sys/net/core/somaxconn这个设置的是更小的128.

查看当前值:
cat /proc/sys/net/core/somaxconn     查看 somaxconn的值
临时解决:
echo 511 > /proc/sys/net/core/somaxconn 修改 somaxconn的值
永久解决方法:(即之前的以后启动还需要修改此值)
将其写入/etc/rc.local文件中
9.
redis启动时报出了下面的警告:

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. 
 临时解决:echo never > /sys/kernel/mm/transparent_hugepage/enabled



永久解决方法:(即之前的以后启动还需要修改此值)
将其写入/etc/rc.local文件中