Redis 项目中,一个名为 “[BUG] Deadlock with streams on redis 7.2” 的 issue 12290 吸引了我的注意。这个 bug 中,redis 服务器在处理特定的客户端请求时陷入了死循环,这个现象在 redis 这样的高性能、高可靠性的数据库系统中是极为罕见的。
直接从 Github Release 7.2-rc2 下载 Reids 7.2 的源码,然后编译二进制。这里编译指令带上这两个 Flag make REDIS_CFLAGS="-Og -fno-omit-frame-pointer
",方便后续分析工具能够拿到堆栈信息。复现步骤很简单,启动 Redis server ,接着运行 feeder.py 和 subscriber.py 这两个脚本。我们会看到订阅者在处理部分流之后会阻塞住,不再有输出。同时 Redis 进程的 CPU 直接飙到了 100%,新的 redis client 也连不上去服务器了,如下图。
完整讨论在:
Redis Issue 分析:流数据读写导致的“死锁”问题(1)
Redis Issue 分析:流数据读写导致的“死锁”问题(2)
第 2 篇其实还有待继续深挖