自学内容网 自学内容网

Redis线上阻塞要如何排查

一、指令阻塞其他指令
因为Redis执行指令是单线程的,因为单次执行速度会非常快,但是如果你让单次执行变慢了,那么也会阻塞后续的指令执行。
哪些情况会让指令变慢:
1.指令获取的数据很多,比如大数据量下执行keys、hgetall、smembers等指令。我们可以通过查看Redis的慢查找到问题,不要去执行慢查操作
2.大Key,我单次查询的的数据过大,也会导致单次执行变慢。所以我们需要拆分大key。
keys命令
全库扫描:KEYS 命令会扫描整个数据库中的所有键,匹配符合给定模式的键名。当 Redis 数据库中的键非常多时,KEYS 命令的执行会变得非常缓慢,且会导致 Redis 进程的 CPU 使用率大幅上升。
阻塞 Redis:由于 KEYS 命令会执行全库扫描,它可能会导致 Redis 无法及时响应其他请求,造成 Redis 服务的阻塞。特别是在生产环境中,可能导致 Redis 变得非常缓慢,影响整体的系统性能。
SCAN 命令:Redis 提供了一个更高效的替代命令 SCAN,它可以逐步地返回匹配模式的键,而不是一次性扫描所有键。SCAN 是增量迭代的,每次迭代返回一部分键,这样可以避免长时间阻塞 Redis 实例。
例如:
bash
redis-cli SCAN 0 MATCH name*
二、CPU扛不住了
因为Redis处理命令只用到一个cpu,所以当cpu超过我们负荷的时候,也会导致阻塞。
1.Redis是否有牺牲cpu去换取内存的一些配置,比如数据类型底层数据结构的配置。有些数据类型是去追求极致空间,所以会牺牲CPU。
2.如果也没有,那就是需要加机器了
三.持久化阻塞
1.虽然说Redis的持久化是异步做的,但是for子进程的时候就慢,那么也会导致问题。
2.AOF刷盘的时候,由于磁盘压力,导致操作时间够久,主线程为了数据一致性会阻塞指令。
四:其他原因
1.其他的程序跟Redis部署在一台机器,导致cpu之间的相互影响
2.网络问题 包括网络是否稳定,是否有延迟、带宽是否足够
3.客户端连接数是否达到了Redis的最大连接数
阻塞问题,一般线上都是有搭监控的,看redis命令的rt有没有上涨,估计是考察big key问题吧,阿里云官网对big key的处理有一份文档,说的还是比较全面的

Redis 的堵塞(或阻塞)通常指的是客户端在执行某些命令时被阻塞,直到某些条件满足。

一、常见的 Redis 堵塞原因

  1. 阻塞式命令
    可能原因:客户端执行了这些命令,而在当前时刻相关的键(例如列表、队列)没有数据,导致阻塞。
    ○ Redis 提供了几个阻塞式命令,例如 BLPOP、BRPOP、BRPOPLPUSH 等,这些命令会让客户端阻塞,直到有数据可以返回。例如,当列表为空时,BLPOP 会等待直到有元素被推入列表。
  2. 慢查询
    可能原因:某个命令消耗了过多的 CPU 或内存资源,导致 Redis 无法及时响应其他请求。
    ○ Redis 会执行某些需要大量计算或者数据处理的命令(例如 SORT、SUNIONSTORE、ZUNIONSTORE 等),这些命令在处理大量数据时可能导致阻塞。
  3. 内存不足
    可能原因:内存不足,Redis 会根据配置(如 maxmemory-policy)来阻塞某些操作,避免过度消耗内存。
    ○ 如果 Redis 实例的内存接近或超过了限制,Redis 会开始阻塞一些写请求(尤其是在内存使用达到 maxmemory 限制时)。
  4. 数据库持久化(AOF 或 RDB)
    可能原因:AOF 或 RDB 生成过程中占用过多资源,影响正常的请求处理。
    ○ Redis 在执行持久化操作时(如 RDB 快照或 AOF 写入),会消耗大量 CPU 和 I/O 资源。在这种情况下,特别是如果持久化操作时间较长,可能会导致其他请求的响应时间变慢,甚至看起来像是阻塞。
  5. 客户端未及时关闭连接
    ○ 如果客户端没有正确关闭连接或长时间保持空闲状态,这可能会导致连接池中的连接数用尽,从而影响其他客户端的请求响应时间。
  6. 集群节点故障
    ○ 在 Redis 集群模式下,某些节点的故障(例如网络中断、硬件故障等)可能导致客户端被阻塞,因为 Redis 无法从集群中获取数据,或者需要等待节点恢复。

二、如何排查 Redis 堵塞问题

  1. 查看阻塞命令
    redis-cli CLIENT LIST
    你可以根据输出查看哪些客户端被阻塞,以及它们执行的命令类型。
    ○ 使用 Redis 的 CLIENT LIST 命令查看当前所有连接的状态。阻塞的客户端会在输出中标明 blocked。
  2. 查看慢查询日志
    redis-cli SLOWLOG GET
    该命令会显示 Redis 的慢查询日志,帮助你识别哪些命令执行得很慢。
    ○ Redis 支持记录慢查询,使用 SLOWLOG 命令查看执行时间超过指定阈值的命令。慢查询可能是导致阻塞的原因之一。
  3. 查看 Redis 日志文件
    ○ Redis 的日志文件中记录了很多操作信息,包括错误、警告、性能瓶颈等。查看 Redis 日志文件可能帮助你发现一些导致阻塞的异常情况。
    ○ Redis 日志文件位置在 redis.conf 配置文件中定义。默认情况下日志会被写入 /var/log/redis/ 或其他指定路径。
  4. 查看内存使用情况
    redis-cli INFO MEMORY
    ○ 使用 INFO MEMORY 命令查看 Redis 的内存使用情况。如果内存使用过高,可能会导致 Redis 被迫进行垃圾回收或无法响应请求。
  5. 检查持久化过程
    redis-cli INFO persistence
    如果正在进行持久化操作,检查它是否正在消耗过多资源或时间。
    ○ 如果 Redis 在执行 RDB 快照或 AOF 写入时,可能会出现堵塞情况。通过查看 INFO persistence 可以检查持久化的状态:
  6. 检查集群状态(如使用 Redis 集群)
    redis-cli CLUSTER INFO
    redis-cli CLUSTER NODES
    ○ 如果你在使用 Redis 集群,执行 CLUSTER INFO 和 CLUSTER NODES 来检查集群的健康状态。集群节点之间的通信故障可能会导致请求阻塞。
  7. 检查客户端连接池
    ○ 如果你使用的是 Redis 客户端连接池,确保连接池配置得当(例如连接池大小和最大连接数),避免连接池枯竭造成的阻塞。
  8. 查看网络延迟
    ○ 如果 Redis 运行在分布式环境中,网络延迟或网络故障也可能导致客户端请求超时或阻塞。可以使用 ping 命令或网络监控工具检查 Redis 和客户端之间的网络状况。

三、优化建议

  1. 避免使用阻塞命令
    ○ 如果不是必须的,尽量避免使用 BLPOP、BRPOP 等阻塞命令,或者优化业务逻辑,减少阻塞等待的时间。
  2. 调整慢查询阈值
    ○ 如果慢查询是问题的根源,可以通过调整 slowlog-log-slower-than 参数来记录更详细的慢查询日志,并优化慢查询的命令。
  3. 优化 Redis 配置
    ○ 配置合理的内存使用策略(如 maxmemory),避免内存不足导致的阻塞。
    ○ 设置合理的持久化策略和频率,避免持久化操作影响性能。
  4. 增加 Redis 实例或集群节点
    ○ 在访问量较大的场景下,考虑增加 Redis 的实例或集群节点,提高 Redis 的可扩展性。
    通过这些方法,你可以定位并解决 Redis 的堵塞问题,提高 Redis 服务的性能和可靠性。

原文地址:https://blog.csdn.net/Fireworkit/article/details/145278811

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!