[转帖]Redis常见问题以及优化思路

redis,常见问题,以及,优化,思路 · 浏览次数 : 0

小编点评

## Redis 慢查询导致请求延时原因分析 **问题:** Redis 主线程是单线程的,当处理多个请求时,就会存在慢查询导致请求延时问题。 **分析:** * 问题的根源在于 Redis 主线程 fork 子进程的时候,子进程需要拷贝父进程的空间内存页表,这会导致 fork 耗时。 * AOF 的阻塞问题也会导致写请求阻塞,影响整体性能。 * info replication 中,可以看到 master 和 slave 复制的 offset,做一个差值就可以看到对应的延迟量,如果延迟过多,那么就进行报警。 **优化思路:** * 优化硬盘写入速度,建议采用 SSD,不要用普通的机械硬盘。 * 优化 Redis 的内存配置,例如设置 `maxmemory` 和 `minmemory` 属性。 * 降低 Redis 主线程的 fork 数,例如使用 `multi` 或 `cluster` 模块。 * 监控 Redis 主线程的 CPU 使用率和内存使用率,及时进行调整。 **其他建议:** * 可以使用 `redis-cli` 命令优化 Redis 性能。 * 可以使用 `slowlog` 选项记录 Redis 的性能指标,帮助分析性能问题。

正文

https://www.zeekling.cn/articles/2022/04/10/1649579684900.html

 

Redis存在慢查询导致请求延时

由于Redis主线程是单线程的,所以会存在慢查询会导致redis请求延时,可以参考:

https://www.zeekling.cn/articles/2020/07/23/1595493094855.html

redis存在大value导致请求延时

可以通过下面命令查找大value:

redis-cli -p 6379 -h 127.0.0.1 --bigkeys
redis-cli -p 6379 -h 127.0.0.1 --memkeys

fork 耗时导致高并发请求延时

RDB 和 AOF 的时候会存在 RDB 快照生成、AOF rewrite,耗费磁盘 IO 的过程。主进程 fork 子进程的时候,子进程是需要拷贝父进程的空间内存页表的,也是会耗费一定的时间的一般来说,如果父进程内存有 1 个 G 的数据,那么 fork 可能会耗费在 20ms 左右,如果是 10G~30G,那么就会耗费 20 * 10,甚至 20 * 30,也就是几百毫秒的时间。

info stats 中的 latest_fork_usec,可以看到最近一次 fork 的时长redis 单机 QPS 一般在几万,fork 可能一下子就会拖慢几万条操作的请求时长,从几毫秒变成 1 秒。

优化思路:fork 耗时跟 redis 主进程的内存有关系,一般控制 redis 的内存在 10GB 以内;否则 slave -> master 在全量复制等时候就可能会出现一些问题。

AOF 的阻塞问题

redis 将数据写入 AOF 缓冲区,单独开一个线程做 fsync 操作,每秒一次。但是 redis 主线程会检查两次 fsync 的时间,如果距离上次 fsync 时间超过了 2 秒,那么写请求就会阻塞everysec,最多丢失 2 秒的数据。一旦 fsync 超过 2 秒的延时,整个 redis 就被拖慢。

优化思路:优化硬盘写入速度,建议采用 SSD,不要用普通的机械硬盘,SSD 大幅度提升磁盘读写的速度。

主从复制延迟问题

主从复制可能会超时严重,这个时候需要良好的监控和报警机制。在 info replication 中,可以看到 master 和 slave 复制的 offset,做一个差值就可以看到对应的延迟量,如果延迟过多,那么就进行报警(可以写一个 shell 脚本去监控)

最大打开文件句柄

报错如下:

Increased maximum number of open files to 10032 (it was originally set to 1024).

句柄详解:http://www.freeoa.net/osuport/sysadmin/osfilehdnfd_1155.html

修改参数:

ulimit -n 10032 10032

tcp backlog

报错提示:

WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

TCP backlog 队列设计初衷是为了缓存服务器无法立即处理的握手请求先回顾一下三次握手的过程:

image.png

 

从服务器的视角来看,需要接受两个数据包(首个SYN,最后一个ACK)TCP backlog创建了两个队列来负责缓存已经收到的首个SYN和已经握手完成待应用层接收的连接负责缓存SYN的队列叫SYN QUEUE负责缓存已完成连接叫ACCEPT QUEUE.

举例子来说明:如果坐火车来说明的话,在春运时,火车站人满为患,进入火车站分为两步:

  1. 进入候车室(SYN QUEUE)
  2. 进入站台 (ACCEPT QUEUE)(握手完成)
  3. 坐上火车 (连接被应用程序使用)

一、进入候车室入SYN QUEUE队列:SYN QUEUE队列的长度可以理解为候车室的大小专业术语叫做BACKLOG,当一个新的旅客到达时,安检员会根据候车室人数来决定是否允许旅客进入.

二、登上站台出SYN QUEUE队列,进入ACCEPT QUEUE队列:当站台可以容纳旅客的时候,检票员会将候车室的旅客按照先来后到的顺序,将旅客安置在站台,等候火车的到来,此时验证已经完成(你的车票已经被剪了),TCP已经完成的他的使命

三、挤进火车出ACCEPT QUEUE队列,当乘务员终于慢悠悠的打开车厢大门的时候,所有旅客有序进入火车中,握手完成

修改方法:

cat /proc/sys/net/core/somaxconn

echo 511 > /proc/sys/net/core/somaxconn

Redis集群主备缓存区满了导致主备频繁倒换

这个问题常见于低版本的redis,或者是client-output-buffer-limit replica没有使用默认值的时候

详细参见:https://www.zeekling.cn/articles/2022/02/27/1645957902937.html

与[转帖]Redis常见问题以及优化思路相似的内容:

[转帖]Redis常见问题以及优化思路

https://www.zeekling.cn/articles/2022/04/10/1649579684900.html Redis存在慢查询导致请求延时 由于Redis主线程是单线程的,所以会存在慢查询会导致redis请求延时,可以参考: https://www.zeekling.cn/art

[转帖]Redis 运维实战 第08期:监控

https://cloud.tencent.com/developer/article/1986832 Redis 在很多互联网公司都充当着非常核心的角色,因此,监控 Redis 以保证其稳定显得格外重要。这节内容就来聊聊 Redis 的一些常见监控项。 1 连接检测 连接失败检测:当监控组件无法连

[转帖]Redis 单机模式,主从模式,哨兵模式(sentinel),集群模式(cluster),第三方模式优缺点分析

https://www.cnblogs.com/leffss/p/11993646.html Redis 的几种常见使用方式包括: 单机模式 主从模式 哨兵模式(sentinel) 集群模式(cluster) 第三方模式 单机模式 Redis 单副本,采用单个 Redis 节点部署架构,没有备用节点

[转帖]redis脑裂是什么?如何解决

这也是一个常见面试题,对redis集群部署不熟悉的同学,可能压根没听过这个名词qvq 什么是redis脑裂 下面我们解释一下什么是redis脑裂: 关于reids集群会由于网络等原因出现脑裂的情况,所谓的集群脑裂就是,由于redis master节点和redis salve节点和sentinel处于

[转帖]1.5万字总结 Redis 常见面试题&知识点

https://segmentfault.com/a/1190000043302892 以下内容来源于于我开源的 JavaGuide (Java学习&&面试指南,Github 130k star,370人共同参与爱完善), 万字总结,质量有保障! 这篇文章最早写于2019年,经过不断完善,内容也更全

[转帖]阿里架构师进阶专题:Redis集群的5种使用方式,各自优缺点分析

https://www.toutiao.com/article/6611108111048507908/ 本文主要针对 Redis 常见的几种使用方式及其优缺点展开分析。 一、常见使用方式 Redis 的几种常见使用方式包括: Redis 单副本 Redis 多副本(主从) Redis Sentin

[转帖]Redis学习四(运维指南).

阅读目录 一、上线规划 二、常见运维操作 三、测试方法 回到顶部 一、上线规划 一般 redis 的参数配置都在 redis.conf 中,在上线前根据实际环境配置好合适参数,能有效提高 redis 的可用性。 redis 的运行机器 CPU 不求核数多,但求主频高,Cache大,因为 redis

[转帖]Redis 7 参数 修改 说明

2022-06-16 14:491800原创Redis 本文链接:https://www.cndba.cn/dave/article/108066 在之前的博客我们介绍了Redis 7 的安装和配置,如下: Linux 7.8 平台 Redis 7 安装并配置开机自启动 操作手册https://ww

[转帖]Redis 7.0 三节点哨兵(Sentinel)高可用 环境搭建手册

2022-06-17 16:253480原创Redis 本文链接:https://www.cndba.cn/dave/article/108088 1 哨兵高可用架构说明 Redis 最早的高可用方案是主从复制,但这种方案存在一个问题,就是当主库宕机后,从库不会自动切成主库,需要人工干预。 所有在主

[转帖]Redis 备份与恢复(RDB/AOF) 说明

2022-06-16 20:364580原创Redis 本文链接:https://www.cndba.cn/dave/article/108068 1 RDB 方式 1.1 RDB 备份恢复说明 Redis 的备份恢复有两种方法:RDB和AOF。 其中RDB 文件是一个经过压缩的二进制文件,有两个R