Closed zheplusplus closed 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 继续写出就会引起崩溃.
writev
通常的 web 应用在压力不高的情况下不会引起崩溃, 因为
Buffer::writev
测试方式
可以很容易令单线程 cerberus 崩溃.
表征
崩溃通常发生在一组 set 请求测试结束, get 请求刚刚开始的时候.
原因分析
这并不是因为新开始的 get 请求会令 cerberus 崩溃, 而是在 set 请求结束时, 一部分客户端会直接关闭 socket; cerberus 会判定这些 socket 对应的客户端及这些客户端的缓冲区失效 (内存被回收), 但是, 如果这些缓冲区在上一次
writev
调用中没有全部写出, 下一次writev
继续写出就会引起崩溃.对日常使用的影响
通常的 web 应用在压力不高的情况下不会引起崩溃, 因为
writev
足够写出解决方法
Buffer::writev
强制连续写出