zbus 百万次同步、异步调用,无法运行完成

Tom-Lin 发布于 2015/06/27 18:37
阅读 2K+
收藏 3

@少帮主 @zbus

你好,我打算使用 zbus,所以做了一次测试。

测试过程如下: 下载 zbus,我的操作系统:win7 64 + jdk6,运行 zbus.bat,调整参数:Xmx3072m,verbose false,运行一个消费者:ConsumerExample.java,同时把输出关闭掉。然后,修改生产者,ProducerExample.java 中的代码,把里面的 for 循环改为 1百万 次,关闭system.out 输出,同时打开 jconsole 来监控内存。

结果发现,开始时,内存趋势是,一直往上涨,但最后程序无法运行完成,意思是后面内存后面基本用光,程序最后的打印语句没有输出,程序也没有退出。

请问,是不是我的测试有问题?不合理?还是程序有 bug ?

加载中
0
Tom-Lin
Tom-Lin
试过了,也是一样存在同样的问题
0
Tom-Lin
Tom-Lin
同步和异步我都测试了,50w都没有问题,但上到100w就都不行。还有,我用jconsole监控内存,貌似内存一直在增加,所以我怀疑会不会是内存没有正常释放导致的
少帮主
少帮主
别说100W,压力测试基本上几十个亿以上的测试。 你有没有消费者,如果没有,消息会一直堆积的哦,内存上涨是正常的,不堆积,java在压力测试下内存都会上涨,要等待GC
0
少帮主
少帮主

这是我做的压力测试,没有你说的问题,我不知道你的jvm配置是否正确。

加入zbus群: 467741880

Talk is cheap, show me the code

在上面直接贴出来问题吧

少帮主
少帮主
异步场景下,现在zbus没有加入流量控制导致的瞬间消息飙升,消费者来不及消费,吃掉内存。这个加入流量控制又不好做要测试,后续我加上流量控制
0
Tom-Lin
Tom-Lin

下面是我的测试过程及代码:

1、修改 zbus.bat 并启动,把其中的内存改为 -Xmx3072m,不向服务器终端输出信息(个人测试发现,如果向服务器终端发信息,速度慢一倍):-verbose false,代码如下:

REM SET JAVA_HOME=C:\jdk1.6
SET ZBUS_HOME=.
SET JAVA_OPTS=-Dfile.encoding=UTF-8 -server -Xms64m -Xmx3072m -XX:+UseParallelGC
SET MAIN_CLASS=org.zstacks.zbus.server.ZbusServer
REM -p 15555 -store dummy|sql
SET MAIN_OPTS=-h 0.0.0.0 -p 15555 -store dummy -verbose false
REM -track 127.0.0.1:16666;127.0.0.1:16667
SET LIB_OPTS=%ZBUS_HOME%/lib;%ZBUS_HOME%/lib/*;%ZBUS_HOME%/conf;
"%JAVA_HOME%\bin\java" %JAVA_OPTS% -cp %LIB_OPTS% %MAIN_CLASS% %MAIN_OPTS%



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,并输出循环次数。

代码如下:

package org.zstacks.zbus;

import org.zstacks.zbus.client.Broker;
import org.zstacks.zbus.client.Producer;
import org.zstacks.zbus.client.broker.SingleBroker;
import org.zstacks.zbus.client.broker.SingleBrokerConfig;
import org.zstacks.znet.Message;

public class ProducerExample {
	public static void main(String[] args) throws Exception{  
		//1)创建Broker代理【重量级对象,需要释放】
		SingleBrokerConfig config = new SingleBrokerConfig();
		config.setBrokerAddress("127.0.0.1:15555");
		final Broker broker = new SingleBroker(config);
		
		//2) 创建生产者 【轻量级对象,不需要释放,随便使用】
		Producer producer = new Producer(broker, "MyMQ");
		producer.createMQ(); //如果已经确定存在,不需要创建
		
		for(int i=0;i<1000 * 1000;i++){
			Message msg = new Message(); 
			msg.setBody("hello world");  
			Message res = producer.sendSync(msg, 1000);
			System.out.println(i + ": " + res); 
		}
		
		//3)销毁Broker
		broker.close();
	} 
}



4、运行 jvm 内存监控程序: jconsole,监控服务器的内存使用情况:

5、在未运行 生产者 时,内存情况如下:

现在一切都完全正常。

6、现在开始运行生产者代码,观察输出情况:

刚开始的时候,运行得很好,但大约一两分钟后,系统开始缓慢下来了。再到后面,就运行速度很慢,并出现内存溢出的现象(注意观察时间轴、内存和 cpu 使用情况),如图:

这时,系统就运行不下去了。


为了排除是 myeclipse 的问题,我将重新在终端运行上述步骤。并在下一个回复中展现我的测试。


0
Tom-Lin
Tom-Lin

1、重新启动服务器。

2、运行消费者。把编译好的生产者、消费者复制到D:\javaApp\zbus\zbus-dist下,并写两个运行生产者和消费者的批处理文件。代码如下:


REM SET JAVA_HOME=C:\jdk1.6
SET ZBUS_HOME=.
SET MAIN_CLASS=org.zstacks.zbus.ConsumerExample
SET LIB_OPTS=%ZBUS_HOME%/lib;%ZBUS_HOME%/lib/*;%ZBUS_HOME%/conf;
"%JAVA_HOME%\bin\java" -cp %LIB_OPTS% %MAIN_CLASS%



REM SET JAVA_HOME=C:\jdk1.6
SET ZBUS_HOME=.
SET MAIN_CLASS=org.zstacks.zbus.ProducerExample
SET LIB_OPTS=%ZBUS_HOME%/lib;%ZBUS_HOME%/lib/*;%ZBUS_HOME%/conf;
"%JAVA_HOME%\bin\java" -cp %LIB_OPTS% %MAIN_CLASS%




运行消费者:

3、打开jconsole 内存监控

这是对服务器内存的监控:

4、运行生产者,并监控生产者与消费者:

但由于控制台输出影响,所以运行比较慢,把生产者与消费者的窗口最小化,监控变为:

最后,大约15分钟后,在我切换查看生产者窗口和消费者窗口时,这两个窗口分别自动退出,最后服务器的截图如下:

注,截图中的 cpu 突然上升,是我做了把生产者与消费者的窗口最小化后出现的。

为了排除 终端控制台 的影响,我准备再次把代码改一下,取消控制台的输出,并输出运行完后的时间。

在下一个回复中,把结果呈现出来。

0
Tom-Lin
Tom-Lin

1、消费者的代码中,把控制台输出语句注释掉。

2、为了排除生产者的消息大小的影响,把消息的 body 设置为空字符串,同时把控制台输出语句去掉,输出结束 1百万 次运行后的时间。

3、重启服务器

4、运行消费者

5、打开监控台

6、打开jconsole 监控服务器与消费者

7、运行生产者,并监控:

253秒后,运行完:

8、这次,完美运行。每次调用时间大约是 0.25 毫秒。

9、为了了解后面的运行情况,在不重启服务器与消费者的情况下,再次运行生成者,并观察服务器的情况:

10、从上面的图中,可以得出初步答案,同步调用,没有问题。但在 myeclipse 的环境中运行,会导致出错。

11、接着再做了一次异步的检测,但异步测试没有完成。现在要出去,晚上回来再继续。

少帮主
少帮主
居然没提示我有回复:) 非常详细的测试,加入zbus群,这样的截图方便掉交流,如果有问题也好暴露给更多人
0
少帮主
少帮主

6.2.0 消息持久化了,里面尝试去压下10亿以上的消息

http://git.oschina.net/rushmore/zbus

不限制异步刷入JVM容易产生full GC

返回顶部
顶部