如何进行Redis性能优化?这一篇就够了( 七 )


6.查看Redis内存是否发生Swap
$ redis-cli info | grep process_idprocess_id: 5332然后,进入 Redis 所在机器的 /proc 目录下的该进程目录中:
$ cd /proc/5332最后 , 运行下面的命令,查看该 Redis 进程的使用情况 。在这儿,我只截取了部分结果:
$cat smaps | egrep '^(Swap|Size)'Size: 584 kBSwap: 0 kBSize: 4 kBSwap: 4 kBSize: 4 kBSwap: 0 kBSize: 462044 kBSwap: 462008 kBSize: 21392 kBSwap: 0 kB一旦发生内存 swap,最直接的解决方法就是增加机器内存 。如果该实例在一个 Redis 切片集群中,可以增加 Redis 集群的实例个数,来分摊每个实例服务的数据量,进而减少每个实例所需的内存量 。
7.内存大页
如果采用了内存大页,那么 , 即使客户端请求只修改 100B 的数据 , Redis 也需要拷贝 2MB 的大页 。相反,如果是常规内存页机制,只用拷贝 4KB 。两者相比,你可以看到 , 当客户端请求修改或新写入数据较多时,内存大页机制将导致大量的拷贝,这就会影响 Redis 正常的访存操作,最终导致性能变慢 。
首先 , 我们要先排查下内存大页 。方法是:在 Redis 实例运行的机器上执行如下命令:
$ cat /sys/kernel/mm/transparent_hugepage/enabled[always] madvise never如果执行结果是 always,就表明内存大页机制被启动了;如果是 never,就表示,内存大页机制被禁止 。
在实际生产环境中部署时,我建议你不要使用内存大页机制,操作也很简单 , 只需要执行下面的命令就可以了:
echo never /sys/kernel/mm/transparent_hugepage/enabled其实,操作系统提供的内存大页机制,其优势是 , 可以在一定程序上降低应用程序申请内存的次数 。
但是对于 Redis 这种对性能和延迟极其敏感的数据库来说,我们希望 Redis 在每次申请内存时,耗时尽量短,所以我不建议你在 Redis 机器上开启这个机制 。
8.删除使用Lazy Free
支持版本:Redis 4.0+
1)主动删除键使用lazy free

  • UNLINK命令
 
127.0.0.1:7000> LLEN mylist(integer) 2000000127.0.0.1:7000> UNLINK mylist(integer) 1127.0.0.1:7000> SLOWLOG get1) 1) (integer) 12) (integer) 15054651883) (integer) 304) 1) "UNLINK"2) "mylist"5) "127.0.0.1:17015"6) ""注意:DEL命令,还是并发阻塞的删除操作
  • FLUSHALL/FLUSHDB ASYNC
127.0.0.1:7000> DBSIZE(integer) 1812295127.0.0.1:7000> flushall//同步清理实例数据 , 180万个key耗时1020毫秒OK(1.02s)127.0.0.1:7000> DBSIZE(integer) 1812637127.0.0.1:7000> flushall async//异步清理实例数据,180万个key耗时约9毫秒OK127.0.0.1:7000> SLOWLOG get 1) 1) (integer) 29961092) (integer) 15054659893) (integer) 9274//指令运行耗时9.2毫秒4) 1) "flushall"2) "async"5) "127.0.0.1:20110"6) "" 
2)被动删除键使用lazy free
 
lazy free应用于被动删除中,目前有4种场景 , 每种场景对应一个配置参数;默认都是关闭 。
lazyfree-lazy-eviction nolazyfree-lazy-expire nolazyfree-lazy-server-del noslave-lazy-flush no 
  • lazyfree-lazy-eviction
针对redis内存使用达到maxmeory,并设置有淘汰策略时;在被动淘汰键时,是否采用lazy free机制;因为此场景开启lazy free, 可能使用淘汰键的内存释放不及时,导致redis内存超用,超过maxmemory的限制 。此场景使用时,请结合业务测试 。(生产环境不建议设置yes)
  • lazyfree-lazy-expire
针对设置有TTL的键,达到过期后,被redis清理删除时是否采用lazy free机制;此场景建议开启 , 因TTL本身是自适应调整的速度 。
 
  • lazyfree-lazy-server-del
针对有些指令在处理已存在的键时,会带有一个隐式的DEL键的操作 。如rename命令,当目标键已存在,redis会先删除目标键,如果这些目标键是一个big key,那就会引入阻塞删除的性能问题 。此参数设置就是解决这类问题,建议可开启 。
 
  • slave-lazy-flush
针对slave进行全量数据同步,slave在加载master的RDB文件前,会运行flushall来清理自己的数据场景 ,  参数设置决定是否采用异常flush机制 。如果内存变动不大,建议可开启 。可减少全量同步耗时,从而减少主库因输出缓冲区爆涨引起的内存使用增长 。
3)lazy free的监控


推荐阅读