redis 一次故障排查
在流量控制设计中,用 redis 缓存流量实时值,redis 中缓存中一个 key 的 values 值是个 set,并且 set 的值有 3w+,每个值的存储的是 string,大多在 6-7 位。所以一个键值对的大小就在 200k 以上。
监控图
可以看到 cpu usage, network usage 两项指标前半部分都很高。cpu 使用率有毛刺产生。
遇到这个问题,我记得 redis value 值太大,对 redis 的 qps 影响还是比较大的。在数据包大小在 1k 的时候是个性能拐点。
解决方案
-
cpu、network 指标比较高
流量限制是 10 分钟批量更新的,更新的数据及时维护在 redis 中,在对外接口上过滤之前也定时缓存一个流量限制变量(内部缓存),这样对 redis 获取流量限制操作在 10 分中只要操作一次。
-
cpu 有毛刺
观察毛刺时间间隔,基本是有规律的(1 分钟到 2 分钟一个脉冲),猜测跟定时有关。考虑从 redis 的日志触发。如下:
redis log file
sudo tail -f /var/log/redis/redis.log
18013:C 04 Jan 16:41:36.609 * RDB: 905 MB of memory used by copy-on-write
16206:M 04 Jan 16:41:36.630 * Background saving terminated with success
16206:M 04 Jan 16:42:37.018 * 10000 changes in 60 seconds. Saving...
16206:M 04 Jan 16:42:37.035 * Background saving started by pid 18074
18074:C 04 Jan 16:42:50.182 * DB saved on disk
18074:C 04 Jan 16:42:50.191 * RDB: 918 MB of memory used by copy-on-write
16206:M 04 Jan 16:42:50.289 * Background saving terminated with success
通过上面基本定位是数据落磁盘的 cpu 开销。跟 redis 的默认配置有关:
sudo vi /etc/redis.conf
参考文章
Trouble Shooting —— Enable AOF可能导致整个Redis被Block住,在3.0.6版本仍然存在 - 凝雨 - Yun
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于