• Redis深入学习笔记(五)Redis阻塞原因


    在实际使用Redis中,有时会碰到客户端timeout异常,或者没有可用连接异常等等异常,总结大概有如下原因:

    内部阻塞原因:

      1)大对象存取。

      2)Fork阻塞。

      3)Aof刷盘阻塞(距离上次刷盘大于2s时主线程会阻塞,直到当前刷盘完成)。

      4)HugePage写操作阻塞(对于开启Transparent HugePages的操作系统,每次写命令引起的复制内存页单位由4K变为2MB,放大了512倍,会拖慢写操作的执行时间,导致大量写操作慢查询)。

    外部阻塞原因:

      1)与其他cpu密集型应用一起部署,出现cpu竞争。

      2)启用持久化时将redis进程与cpu绑定,子进程与父进程公用一个cpu,子进程进行持久化时会大幅度占用cpu资源(通常90%),造成父进程cpu资源不足。

      3)内存交换(过小的最大内存设置,会发生内存交换,将内存数据写到磁盘上,性能杀手)。

       4)客户端连接过多。当Redis用于大量分布式节点访问且生命周期比较短的场景时,如比较典型的在Map/Reduce中使用Redis。因为客户端服务存在频繁启动和销毁的情况且默认Redis不会主动关闭长时间闲置连接或检查关闭无效的TCP连接,因此会导致Redis连接数快速消耗且无法释放的问题。这种场景下建议设置tcp-keepalive和timeout参数让Redis主动检查和关闭无效连接(客户端使用单例或者连接池方式)。

       5)半连接队列过小。系统对于特定端口的TCP连接使用backlog队列保存。Redis默认的长度为511,通过tcp-backlog参数设置。如果Redis用于高并发场景为了防止缓慢连接占用,可适当增大这个设置,但必须大于操作系统允许值才能生效。当Redis启动时如果tcp-backlog设置大于系统允许值将以系统值为准。使用echo511>/proc/sys/net/core/somaxconn命令进行修改。可以通过netstat-s命令获取因backlog队列溢出造成的连接拒绝统计。

      6)网络延迟。Redis提供了测量机器之间网络延迟的工具,在redis-cli-h{host}-p{port}命令后面加入如下参:

      数进行延迟测试:

        --latency:持续进行延迟测试,分别统计:最小值、最大值、平均值、采样次数。

        --latency-history:统计结果同--latency,但默认每15秒完成一行统计,可通过-i参数控制采样时间。

        --latency-dist:使用统计图的形式展示延迟统计,每1秒采样一次。

      排查并明确原因后可以针对性的对Redis进行优化,增加服务吞吐量。

      下一篇会介绍Redis内存分配相关。

  • 相关阅读:
    python调用函数
    python递归函数的执行过程
    linux rwx 权限说明
    linux ssh scp免密码
    linux的bash特性
    python3常用的内置函数
    linux清理系统缓存
    vim常用命令
    公司项目安装禅道
    jquery 自定义动画
  • 原文地址:https://www.cnblogs.com/iamsach/p/8516327.html
Copyright © 2020-2023  润新知