Redis变慢的五大原因以及排查方法

  • Post author:
  • Post category:其他




一、 慢操作五大原因

如下图所示,主要分为与


操作系统


相关以及与


Redis集群实例之间与内部


相关两个方面

请添加图片描述



1. Redis实例之间以及内部数据传输阻塞(客户端、磁盘、主从通信、切片集群通信)

解决方法 — 主从集群时,限制主库RDB文件大小。



2. 多CPU多核架构(绑核,绑CPU)

解决方法—绑核绑CPU。



3. sql语句执行阻塞(慢查询、过期key)

解决方法—避免慢查询指令、客户端做聚合、对key设置不同的过期时间、使用异步线程删除bigkey。



4. AOF文件系统,RDB大内存页(AOF持久化阻塞、大内存页)

解决方法—AOF级别调整,使用高速硬盘、关闭大内存页机制。



5. 操作系统Swap操作(内存磁盘数据转换、内存清理)

解决方法—增加机器内存、使用Redis集群、调整内存清理机制触发参数。



二、实际中Redis变慢的可能情况

  1. 使用

    复杂度过高

    的命令或一次

    查询全量数据

  2. 操作

    bigkey

  3. 大量

    key 集中过期

  4. Redis所用内存达到分配给Redis的

    maxmemory

  5. 客户端使用

    短连接

    和 Redis 相连;


  6. Redis 实例的数据量大

    时,无论是生成 RDB,还是 AOF 重写,都会导致 fork 耗时严重;

  7. AOF 的写回策略为 always

    ,导致每个操作都要同步刷回磁盘;
  8. Redis 实例运行

    机器的内存不足

    ,导致

    swap

    发生,Redis 需要到 swap 分区读取数据;
  9. 进程

    绑定CPU,绑核

    不合理;
  10. Redis 实例运行机器上开启了透明

    内存大页机制

  11. 网卡压力过大。(

    网络IO压力大

    )。



三、慢操作排查方法

  • 查看

    慢查询日志

    指令:


    slowlog get


    (会显示超过预先设定阈值的一些指令,慢日志底层是队列有大小限制,满了会删除队列中最早的记录);
  • 使用


    –bigkeys -i 0.1


    指令:

    查找每种数据类型中最大的bigkey

    ,需要扫描全库,

    会阻塞主线程

    ,所以最好放到从库统计,或者用-i指令不连续执行统计操作。

参考文章:

https://time.geekbang.org/column/article/292285



版权声明:本文为skye_fly原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。