redis阻塞问题原因

文章探讨了Redis性能问题的内外部原因,包括持久化操作如AOF重写和RDB生成时的fork阻塞,CPU使用饱和,尤其是单核使用情况,以及慢查询和大key的影响。外部因素涉及网络问题,如网络抖动和网卡状态,服务器是否使用swap,负载情况,以及CPU在NUMA架构下的性能影响。建议通过监控和调整这些因素来优化Redis服务。
摘要由CSDN通过智能技术生成

原理层次分析

测试数据

for i in `seq 10000`;do echo "hmset $RANDOM id `date +%s%N | md5sum | head -c 8`" name;done >/redis.sql
cat /redis.sql |redis-cli -a $password

一、内因

1、持久化带来的阻塞问题(AOF重写和生成RDB)

在做AOF重写和生成RDB的时候(bgsave命令也是),需要fork操作创建子进程。他会复制复制内存页表。
从经验来讲redis 有10G需要复制20MB的页表。fork一般情况下来说每个GB耗时20MS。大概500G一秒。

确认是否发生 fork 可以看记录日志
11288:M 16 Mar 2023 22:55:33.001 * Background saving started by pid 1947
1947:C 16 Mar 2023 22:55:33.020 * DB saved on disk
1947:C 16 Mar 2023 22:55:33.022 * Fork CoW for RDB: current 0 MB, peak 0 MB, average 0 MB
2、CPU使用饱和

1、查看方式top命令

2、redis-cli --stat 查看每秒钟处理命令个数(查看requests 后面+号的内容表示每秒处理数量)。 如果接近每秒处理8-10W个命令个数说明redis 压力特别大。

3、是否单核CPU使用饱和(参考集群数据倾斜问题排查是否有begkey 是否用到pipeline等)

慢查询或者大key

1、api 数据结构使用不合理经常导致慢查询和大key。
2、redis-cli --bigkeys查询大key
3、慢查询 slowlog get n 获取。此查询结果不包含网络延迟和命令排队时间。

二、外因

1、网络问题(包括代理网络问题)
网络抖动
网卡查看是否超时。网卡打满会导致严重超时。
网络闪断
网络延迟
redis-cli --latency
网卡软中断
ifconfig 查看drop

2、使用swap交换分区
尽量关闭swap。
free -m 也可以查看。

3、服务器负载。load查看

4、cpu竞争和多CPU NAMV架构
跨两个物理核心,基于总线交互会影响性能
可以绑定在物理核心上

可以使用lscpu 查看服务器cpu状况。
NUMA node0 CPU(s):     0-5,12-17
NUMA node0 CPU(s):     6-11,18-23

#可以绑定0 12这组或者 1 13、6 18、7 19 

taskset -c 0,12 redis-server
这里 0和12是物理核心1的2个逻辑核心编号
这样可以保证可以以在同一个物理核心上的多个逻辑核心进行切换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值