2016-09-16 43 views
1

我们有一个很大的知识管理应用程序,我们正在从JBoss EAP 4.3迁移到EAP 6.4。我们遇到了并行MDB驱动的进程失败的一些问题(错误消息参考文献this question),这可以追溯到SLSB池的耗尽。 MDB线程正在请求一个特定的无状态会话Bean三级(打开新的事务),因此10个并发进程足以耗尽池并导致死锁,其默认值为max-pool-size为20.JBoss EAP 6中的EJB池 - 是否有任何缺点为最大池大小设置一个非常大的值?

解决方案是分配那个特定的SLSB到它自己的池中并且确保max-pool-size被设置得足够大以便总是有足够的bean实例可用(在我们的例子中为75,因为肇事者MDB进程本身限于25个实例)。我们无疑会在我们的应用程序中发现许多其他可能需要或至少从设置类似的自定义池大小中受益的情况。

的一点是,在JBoss的EAP的MDB和SLSB最大池大小的默认值 - 每个bean的20个实例 - 似乎非常低的水平。我想做一些分析,看看在典型的应用程序使用过程中我们有多少EJB实例,所以我可以知道我们需要允许的池大小。

  • 缺省值max-pool-size值20的基本原理是什么?
  • 刚刚设置的max-pool-size的 默认slsb-strict-max-poolmdb-strict-max-pool到某些 任意大的值会有什么危害吗?我认识到如果应用程序使用 实例化很多EJB实例,则可能会增加应用程序使用的内存分配高峰,但由于EJB只是根据需要实例化并添加到池中,因此它与不使用池的替代方法有何区别? (关于上下文,我做了一个快速审计,并在我们的应用程序中计算了34个MDB和775个SLSB。)
  • 最好是将我的EJB池的max-pool-size与应用程序需要的EJB实例的预期数量紧密匹配,我只是设置了一个很大的值,然后离开呢?

回答

1

至于20的max-poo-size,真的很难提出一个默认值。如果设置为100,那么单个核心系统上的用户可能轻易压倒CPU。这取决于可用的内核数量,MDB工作负载的外观以及应用程序中的其他内容。

如果你有提供给你32个内核,没有什么别的应用程序中的事情,和MDB处理过程中所做的工作是非常小的,则20的池可能太小了。

MDB将始终合并,无状态会话bean也将合并。

您可以将pool max设置为高值,这不会伤害任何东西。请记住,对于MDB,激活需要JMS会话。默认的会话数量是15.因此对于MDB,您需要匹配会话数量和实例池大小才能获得所需数量的激活的MDB。会话数量在MDB激活部署规范中配置。

+0

嘿,谢谢你的回答。关于MDB,我也发现了15个会话的默认限制,因此为我们之前为25个实例配置的一个MDB创建了一个特殊池。想知道我可能需要多少独特的池覆盖我们所有的800+豆的使用要求(我是否应该集中精力使大小不同的几个综合池,或者只是embiggen默认池)是什么引发了问题。 –

+0

我们首先关心的是应用程序应该像旧平台一样工作。我们的第二个就是我们希望没有任何更糟已经去了EAP 6.我理解池是一个表现手法 - 通过交易EJB实例从不重新实例他们所有的地方保存计算消耗的内存。但是,您的答案似乎意味着选择一个小的默认值的一个担心是限制正在工作的EJB实例的数量(并且意外的限制是我现在关心的应用程序)。那么,这是关于更快还是更慢? –

+2

MDB实例和池大小的数量是高度应用程序和部署特定的。如果MDB是轻量级的,并且您拥有800线程的硬件,那么通过一切手段去实现它。我个人的经历是,我经常看到有人试图创造大量的线程并淹没处理器。请注意。实际上,知道并测试什么时候增加线程数是反生产力的。 –