Redis常见问题以及优化思路
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 队列设计初衷是为了缓存服务器无法立即处理的握手请求先回顾一下三次握手的过程:
从服务器的视角来看,需要接受两个数据包(首个SYN,最后一个ACK)TCP backlog创建了两个队列来负责缓存已经收到的首个SYN和已经握手完成待应用层接收的连接负责缓存SYN的队列叫SYN QUEUE负责缓存已完成连接叫ACCEPT QUEUE.
举例子来说明:如果坐火车来说明的话,在春运时,火车站人满为患,进入火车站分为两步:
- 进入候车室(SYN QUEUE)
- 进入站台 (ACCEPT QUEUE)(握手完成)
- 坐上火车 (连接被应用程序使用)
一、进入候车室入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多实例部署)
- 解决Redis连接拒绝的方法(redis连接拒绝)
- 优化架构:Redis缓存加速数据库性能(redis缓存和数据库)
- 快速改进 Redis 密码安全性的批量方案(批量修改redis密码)
- 如何快速进入Redis数据库(怎样进入redis数据库)
- 微擎优化Redis发挥应有的作用(微擎redis的作用)
- 调整Redis,缓解内存不足境地(当内存不够时redis)
- 实现更强大的广告体验Redis助力(广告的redis实现)
- 借助Redis实现数据自增优化(自增redis)
- 限制登陆次数借助Redis提高安全性(登陆次数限制redis)
- 常见的Redis面试题一种简单而强大的缓存解决方案(最常用的redis面试题)
- 免费使用Redis软件,获取无与伦比的体验(免费redis软件)
- 如何有效封装Redis以提高使用效率(怎么封装redis)
- Redis搜索优化策略挖掘更高效率(如何优化redis搜索)
- 使用Redis优化余额表查询(使用redis做余额表)
- 多台Redis优化性能的友好选择(同时写多台redis)
- Redis高版本带来的性能提升(redis高版本性能)
- Redis优化网站静态页体验(redis 静态页)
- 警惕Redis集群连接数超负荷(redis集群连接数过多)
- 方案Redis集群最佳实施方案优化性能加快你的速度(redis集群最佳实施)
- 利用Redis集群实现的时间差更新(redis集群更新时间差)
- Redis集群切换节省时间获取更好的效率(redis集群切换时间)
- Redis集群实现分区优化(redis 集群 分区)
- Redis 阻塞排查指南一张图解分析(redis阻塞排查图解)
- Redis锁机制升级,优化就在眼前(redis锁机制优化版本)
- 利用Redis锁实现多进程安全互斥(redis锁如何使用)
- 重新配置Redis文件,提升系统性能(redis重新配置文件)
- 管理Redis连接池,让优化体验上线(redis 连接池上线)
- 红色激情Redis配置性能参数优化(redis配置性能优化)
- Redis缓存调优优化你的网站性能(redis缓存调优)
- 存储容量提升Redis服务器存储容量优化设置最大限度限制(redis 设置最大)
- 一键清空 Redis 表中所有数据(redis清除表数据)