【发布时间】:2017-06-16 11:08:11
【问题描述】:
我正在构建 Docker 容器,它在 Jetty 上运行了一个 war 文件,我一直在交替设置一些设置以查看性能是否有所提高,但到目前为止还没有。每个容器已经达到 7 tps。
设置是
<bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="MQConnectionFactory" />
<property name="sessionCacheSize" value="10"/>
</bean>
<bean id="requestQueue" class="com.ibm.mq.jms.MQQueue">
<constructor-arg index="0" value="${queuemanager}"/>
<constructor-arg index="1" value="${incoming.queue}"/>
</bean>
<integration:poller id="poller" default="true" fixed-delay="1000" error-channel="errorChannel"/>
如何提高这里处理的线程数?
另外,我的连接工厂详情如下图
@Bean(name="DefaultJmsListenerContainerFactory")
public DefaultJmsListenerContainerFactory provideJmsListenerContainerFactory(PlatformTransactionManager transactionManager) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setTransactionManager(transactionManager);
factory.setConcurrency(jmsConcurrency);
factory.setCacheLevel(jmsCacheLevel);
factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
factory.setSessionTransacted(true);
return factory;
}
@Bean(name = "txManager")
public PlatformTransactionManager provideTransactionManager() {
return new JmsTransactionManager(connectionFactory());
}
@Bean(name = "JmsTemplate")
public JmsTemplate provideJmsTemplate() {
JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory());
jmsTemplate.setReceiveTimeout(Long.parseLong(env.getRequiredProperty(RECEIVE_TIMEOUT)));
return jmsTemplate;
}
@Bean(name="MQConnectionFactory")
public ConnectionFactory connectionFactory() {
if (factory == null) {
factory = new MQXAConnectionFactory();
try {
factory.setHostName(env.getRequiredProperty(HOST));
factory.setPort(Integer.parseInt(env.getRequiredProperty(PORT)));
factory.setQueueManager(env.getRequiredProperty(QUEUE_MANAGER));
factory.setChannel(env.getRequiredProperty(CHANNEL));
factory.setTransportType(WMQConstants.WMQ_CM_CLIENT);
} catch (JMSException e) {
throw new RuntimeException(e);
}
}
return factory;
}
并发的初始设置是“1-2”,我将其更改为“10-15”。不影响性能。
jmsCache 设置为 3 (Consumer cache),但也没有任何变化。
非常感谢任何帮助。
干杯 克里斯
【问题讨论】:
-
您能告诉我们一些关于您系统的其他信息吗?你有多少个推杆?发送消息的速率是多少?你有多少并发的吸气剂?是否有并发消息供他们处理,或者一个吸气剂能否跟上推杆?每项事务还需要做什么才能全面了解您的系统性能?
-
此时推杆由 NFT 团队使用 LoadRunner 以 100 tps 进行模拟。我有 2 个容器实例正在运行,这意味着我们达到了 15 tps。我认为通过在 DefaultJmsListenerContainerFactory 中将并发设置为“10-15”,这实际上将允许这么多线程并行处理。应用程序的另一部分将 json 消息从 1 格式转换为另一种格式,并向 Api 发送 HTTP 请求,该 API 在 DB 中执行插入操作。
-
这也是我对 setConcurrency 的理解。你看到有多少个 getter 在你的队列中运行?试试 MQSC 命令
DISPLAY QSTATUS(q-name) IPPROCS -
我会尽快提供一些更新。看起来问题实际上出在数据库连接池上。数据库中有数千个会话,我们预计会有几个。