在项目前期对amq的测试过程中,我们摸索出一台4C8G的amq可以支持的最大连接数约为6000个。最近和其它的项目合作,他们进行了一次连接数的测试,得到9000个连接才会导致mq宕机的结果。3000个连接的差异意味着我的测试中一定有什么不对。所以这两天研究了一下mq的连接机制,也进行了几次测试,现在需要总结一下。
2C4G的amq,env的配置里Jvm的配置我配置成了Xms4G Xmx6G。
嗯,基本上就是我一开始以为这台机器是4C8G,配错了……
使用客户端测试,连接池Poolconnection的方式,能支持的连接数:
Xms4G Xmx6G:2823
Xms256m Xmx1G:8160
这里连接数的测试是测试到mq直接被压垮为止,也就是说在8160个连接的时候,Amq的日志显示报错并且amq进程停止。
也就是说jvm的内存设置并不是越大越好的。
接着测试了一下,6000个连接的时候,2C4G的amq仍然可以正常跑。
结论:AMQ的JVM堆内存设置不是越大越好的。
究其原因,每个往AMQ的连接,AMQ都会建立一个线程与之对应,而后定时发送心跳,因此连接数量其实就是单个进程能建立的线程数,每个线程建立时会使用jvm堆内存外的内存,所以jvm内存设置小,反而连接数多
百度了一下,相关说明
影响线程数量的因素有下面几个:
- -Xms: intial java heap size
- -Xmx: maximum java heap size
- -Xss: the stack size for each thread
- 系统限制: 系统最大可开线程数
增大堆内存(-Xms,-Xmx)会减少可创建的线程数量,增大线程栈内存(-Xss,32位系统中此参数值最小为60K)也会减少可创建的线程数量。
系统限制:
/proc/sys/kernel/pid_max,
/proc/sys/kernel/thread-max,
max_user_process(ulimit -u),
/proc/sys/vm/max_map_count。
网友评论
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=5000&wireFormat.maxFrameSize=104857600/>