projecteru / redis-cerberus

Redis Cluster Proxy
MIT License
352 stars 82 forks source link

使用如 redis-benchmark 在高压力的情况下会使 cerberus 崩溃 #13

Closed zheplusplus closed 9 years ago

zheplusplus commented 9 years ago

测试方式

redis-benchmark -h 127.0.0.1 -p 8889 -P 10 -t get,set -c 1000 -d 10000 -l -q

可以很容易令单线程 cerberus 崩溃.

表征

崩溃通常发生在一组 set 请求测试结束, get 请求刚刚开始的时候.

原因分析

这并不是因为新开始的 get 请求会令 cerberus 崩溃, 而是在 set 请求结束时, 一部分客户端会直接关闭 socket; cerberus 会判定这些 socket 对应的客户端及这些客户端的缓冲区失效 (内存被回收), 但是, 如果这些缓冲区在上一次 writev 调用中没有全部写出, 下一次 writev 继续写出就会引起崩溃.

对日常使用的影响

通常的 web 应用在压力不高的情况下不会引起崩溃, 因为