写点什么

是谁拖(慢)了 Redis 的后腿?

用户头像
escray
关注
发布于: 2021 年 03 月 26 日
是谁拖(慢)了 Redis 的后腿?

如果发现 Redis 突然变慢了,那么如何系统性的应对?可以从三个方面考虑:Redis 自身特性、文件系统和操作系统《Redis 核心技术与实战》学习笔记 11,部分已经作为留言发布,但是留言太多,排在后面的一般很难被大家看到,所以集中发布在这里,欢迎讨论。


题图来自网络


18 | 波动的响应延迟:如何应对变慢的 Redis?(上)


执行了一下 redis-cli --intrinsic-latency 120 命令,发现结果比较有意思,两次的结果差不多,从一开始 1 ms 的延迟,一直到后来的 8000+ ms。我访问的是 aliyun 上的 Redis。


> redis-cli --intrinsic-latency 120
Max latency so far: 1 microseconds.Max latency so far: 9 microseconds.Max latency so far: 11 microseconds.Max latency so far: 15 microseconds.Max latency so far: 18 microseconds.Max latency so far: 96 microseconds.Max latency so far: 118 microseconds.Max latency so far: 122 microseconds.Max latency so far: 221 microseconds.Max latency so far: 1047 microseconds.Max latency so far: 1677 microseconds.Max latency so far: 3378 microseconds.Max latency so far: 4173 microseconds.Max latency so far: 8509 microseconds.2085259894 total runs (avg latency: 0.0575 microseconds / 57.55 nanoseconds per run).Worst run took 147862x longer than the average latency.
复制代码


Redis 性能诊断的三个关键点:Redis 自身特性、操作系统、文件系统


Value 类型为 String 时,操作复杂度 O(1),这个也解释了为什么有一些公司用 Redis 的时候,String 到底。


Value 类型为 Set 时,Sort、SUNION/SMEMBERS 操作复杂度分别为 O(N+M*log(M)) 和 O(N),后一个好理解,前面的那个估计得琢磨一下。


用 SSCAN 多次迭代返回代替 SMEMBERS 返回集合中所有成员。

KEYS 命令一般不用于生产环境。

不要让一批 key 的过期时间相同,可以加一个随机数


对于课后题,在生产环境中代替 KEYS 命令,返回与输入模式匹配的 keys,可以使用 SSCAN 分批次返回。


执行了一下 @泠小墨 留言中的例子,结果稍微有点意外


> keys * 1) "1101001" 2) "page1:uv" 3) "aa" 4) "comments" 5) "aaa" 6) "1101000" 7) "zr" 8) "testzset" 9) "mqback"10) "mylist"11) "testkey"12) "mqstream"13) "a"14) "testhash"15) "hell"16) "hello"> scan 0 count 11) "8"2) 1) "1101001"> scan 0 count 21) "12"2) 1) "1101001"   2) "comments"
复制代码


在 课代表 @kaito 的提示下,看了一下 Redis 在 SCAN 时采用的 高位进位法,确实浅显易懂。


19 | 波动的响应延迟:如何应对变慢的 Redis?(下)


没有发现慢查询,也没有同时删除大量的 keys,那么接下来呢?


作为 Redis 菜鸟,我觉得大多数情况下,AOF 写回策略不需要 always 的配置。


高速固态硬盘 SSD 已经成为性能优化的“杀手锏”,如果不差钱……


操作系统内存 swap 被触发之后,会影响 Redis 主 IO 线程,那么延续上面 SSD 的思路,加大内存应该可以解决部分问题。


对于关闭内存大页机制的办法,我在 macOS 上没有找到 /sys/kernel 目录。


小结中的 9 个检查点 Checklist,让我觉得专栏物超所值。课代表 @kaito 令人发指的给出了 11 个检查点,让我有了秘籍在手,天下我有的感觉。


对于课后题,没有遇到过 Redis 变慢的情况,如果以后遇到了,就回到这篇专栏文章,应该能找到线索。


虽然暂时没有接触或者运维业务中的 Redis ,但是这个专栏同时也讲了很多操作系统、底层架构方面的内容,学海无涯。


发布于: 2021 年 03 月 26 日阅读数: 8
用户头像

escray

关注

Let's Go 2017.11.19 加入

在学 Elasticsearch 的项目经理

评论

发布
暂无评论
是谁拖(慢)了 Redis 的后腿?