2018.11.25更新
现在回头看看这篇文章,其实是有问题的。看看阅读量已经到了3000,感觉还是需要更正一下。
ActiveMQ的传统配置使用的BIO模式,也是Blocking IO模式,在这种模式下,ActiveMQ的每一个客户端所建立的连接,需要使用一个线程来承载,JVM的默认配置里Xss=1024,也就是每个线程需要1MB堆外内存,这样就导致了前期测试的时候发现堆外内存会影响连接数。
在高并发的情况下,使用BIO模式是很危险的。在我们的环境中已经出现了堆外内存溢出的情况。所以建议都使用NIO模式,NIO模式里不再使用线程来承载连接,而是使用连接池来承载请求。特别是连接数量上千的时候。
在AMQ的官网里有类似的描述
If you want to scale your broker to support thousands of connections to it, you need to first find the limits of number of threads JVM process is allowed to create. Then you can set these properties to some value below that (broker need more threads to operate normally). For more information on thread usage by destinations and how to limit those, please take a look at Scaling Queues or this configuration file. For example you can add the following
ACTIVEMQ_OPTS="$ACTIVEMQ_OPTS -Dorg.apache.activemq.transport.nio.SelectorManager.corePoolSize=2000 -Dorg.apache.activemq.transport.nio.SelectorManager.maximumPoolSize=2000 -Dorg.apache.activemq.transport.nio.SelectorManager.workQueueCapacity=1024"
to the startup script (${ACTIVEMQ_HOME}/bin/env
for example) to have a constant pool of 2000 threads handling connections. With the setting like this, the broker should be able to accept the number of connections up to the system limits. Of course, accepting connections is just one part of the story, so there are other limits to vertically scaling the broker.
也就是首先需要调整为NIO模式,而后对NIO模式进行核心线程池、最大线程池容量和线程池队列容量的配置。
原文
在项目前期对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。