zbus 百万次同步、异步调用,无法运行完成
@少帮主 @zbus
你好,我打算使用 zbus,所以做了一次测试。
测试过程如下: 下载 zbus,我的操作系统:win7 64 + jdk6,运行 zbus.bat,调整参数:Xmx3072m,verbose false,运行一个消费者:ConsumerExample.java,同时把输出关闭掉。然后,修改生产者,ProducerExample.java 中的代码,把里面的 for 循环改为 1百万 次,关闭system.out 输出,同时打开 jconsole 来监控内存。
结果发现,开始时,内存趋势是,一直往上涨,但最后程序无法运行完成,意思是后面内存后面基本用光,程序最后的打印语句没有输出,程序也没有退出。
请问,是不是我的测试有问题?不合理?还是程序有 bug ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
6.2.0 消息持久化了,里面尝试去压下10亿以上的消息
http://git.oschina.net/rushmore/zbus
不限制异步刷入JVM容易产生full GC
居然没提示我有回复:) 非常详细的测试,加入zbus群,这样的截图方便掉交流,如果有问题也好暴露给更多人
1、消费者的代码中,把控制台输出语句注释掉。
2、为了排除生产者的消息大小的影响,把消息的 body 设置为空字符串,同时把控制台输出语句去掉,输出结束 1百万 次运行后的时间。
3、重启服务器
4、运行消费者
5、打开监控台
6、打开jconsole 监控服务器与消费者
7、运行生产者,并监控:
253秒后,运行完:
8、这次,完美运行。每次调用时间大约是 0.25 毫秒。
9、为了了解后面的运行情况,在不重启服务器与消费者的情况下,再次运行生成者,并观察服务器的情况:
10、从上面的图中,可以得出初步答案,同步调用,没有问题。但在 myeclipse 的环境中运行,会导致出错。
11、接着再做了一次异步的检测,但异步测试没有完成。现在要出去,晚上回来再继续。
1、重新启动服务器。
2、运行消费者。把编译好的生产者、消费者复制到D:javaAppzbuszbus-dist下,并写两个运行生产者和消费者的批处理文件。代码如下:
运行消费者:
3、打开jconsole 内存监控
这是对服务器内存的监控:
4、运行生产者,并监控生产者与消费者:
但由于控制台输出影响,所以运行比较慢,把生产者与消费者的窗口最小化,监控变为:
最后,大约15分钟后,在我切换查看生产者窗口和消费者窗口时,这两个窗口分别自动退出,最后服务器的截图如下:
注,截图中的 cpu 突然上升,是我做了把生产者与消费者的窗口最小化后出现的。
为了排除 终端控制台 的影响,我准备再次把代码改一下,取消控制台的输出,并输出运行完后的时间。
在下一个回复中,把结果呈现出来。
下面是我的测试过程及代码:
1、修改 zbus.bat 并启动,把其中的内存改为 -Xmx3072m,不向服务器终端输出信息(个人测试发现,如果向服务器终端发信息,速度慢一倍):-verbose false,代码如下:
2、打开消费者的例子,不做任何改动,运行一个消费者。
3、打开生产者代码:http://git.oschina.net/rushmore/zbus/blob/master/src/test/java/org/zstacks/zbus/ProducerExample.java?dir=0&filepath=src%2Ftest%2Fjava%2Forg%2Fzstacks%2Fzbus%2FProducerExample.java&oid=1361d7a004b598a663e7a349f4a95b1333348f1c&sha=f15235a43d905bb227c43bcd3111249072aee3a0,修改其中的输出语句,把循环次数改为 1000 * 1000,并输出循环次数。
代码如下:
4、运行 jvm 内存监控程序: jconsole,监控服务器的内存使用情况:
5、在未运行 生产者 时,内存情况如下:
现在一切都完全正常。
6、现在开始运行生产者代码,观察输出情况:
刚开始的时候,运行得很好,但大约一两分钟后,系统开始缓慢下来了。再到后面,就运行速度很慢,并出现内存溢出的现象(注意观察时间轴、内存和 cpu 使用情况),如图:
这时,系统就运行不下去了。
为了排除是 myeclipse 的问题,我将重新在终端运行上述步骤。并在下一个回复中展现我的测试。
异步场景下,现在zbus没有加入流量控制导致的瞬间消息飙升,消费者来不及消费,吃掉内存。这个加入流量控制又不好做要测试,后续我加上流量控制
这是我做的压力测试,没有你说的问题,我不知道你的jvm配置是否正确。
加入zbus群: 467741880
Talk is cheap, show me the code
在上面直接贴出来问题吧
别说100W,压力测试基本上几十个亿以上的测试。 你有没有消费者,如果没有,消息会一直堆积的哦,内存上涨是正常的,不堆积,java在压力测试下内存都会上涨,要等待GC
同步和异步我都测试了,50w都没有问题,但上到100w就都不行。还有,我用jconsole监控内存,貌似内存一直在增加,所以我怀疑会不会是内存没有正常释放导致的
试过了,也是一样存在同样的问题
你把ProducerExample中的代码改成同步模式,异步刷入上百万的请求会产生堆积。
http://git.oschina.net/rushmore/zbus/blob/master/src/test/java/org/zstacks/zbus/ProducerExample.java?dir=0&filepath=src%2Ftest%2Fjava%2Forg%2Fzstacks%2Fzbus%2FProducerExample.java&oid=1361d7a004b598a663e7a349f4a95b1333348f1c&sha=f15235a43d905bb227c43bcd3111249072aee3a0