redis延迟

慢查询语句

SORT, LREM, SUNION, KEYS

fork

生成RDB,或者rewrite AOF的时候,会fork一个进程开搞。fork的时候会复制页表,大内存的实例复制耗时不能忽略,可能会有上百ms的延迟。 Linux默认page size 4k,页表按树状组织,至少包含一个页面指针,20G/4K * 8=40M,40M内存复制是需要几十到上百ms的时间的,如果是虚拟机更慢

huge page

Linux下,当进程占用内存很多时,会产生很多的page,造成页表大小爆炸,Linux会合并这些连续的small page,形成huge page,以减少页表大小,减少虚拟地址到物理地址的映射时间。这样的问题是,redis在做fork的时候,copy on write也会复制很大一块page出来,造成内存占用上升,甚至完全复制了一个进程内存。 这个时候执行以下命令禁用transparent huge page,不让small page自动合并成huge page

1
echo never > /sys/kernel/mm/transparent_hugepage/enabled

swap

物理内存不够用,有磁盘swap

aof

fsync会导致阻塞,一般每秒fsync一次(可以选择不fsync,甚至每条写入命令都fsync) strace可以跟踪系统调用

1
strace -p $(pidof redis-server) -T -e trace=fdatasync,write

大量key过期

redis的被动过期策略,会在每条命令执行完之后,随机选择几个key,看看是否有过期的,如果有就清理掉,并且比例超过25%的时候会继续执行这个清理操作。当同一时间有大量key过期时,这个操作就很耗时