JBoss EAP 6 中的 EJB 池 - 为 max-pool-size 设置一个非常大的值是否有任何缺点?
EJB pooling in JBoss EAP 6 - Are there any downsides to just setting a really large value for max-pool-size?
我们有一个大型知识管理应用程序,我们正在从 JBoss EAP 4.3 迁移到 EAP 6.4。我们遇到了一些问题,并行 MDB 驱动的进程失败(错误消息在 this question 中引用),可追溯到 SLSB 池耗尽。 MDB 线程正在请求一个特定的无状态会话 bean 三层深度(以打开新事务),因此 10 个并发进程足以耗尽池并导致死锁,默认值 max-pool-size
为 20。
解决方案是将该特定 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-pool
和 mdb-strict-max-pool
一些
任意大的值?我认识到这可能会增加峰值
应用程序在实例化时使用的内存分配
很多 EJB 实例,但由于 EJB 只是按需实例化并添加到池中,这与不使用池的替代方案有何不同? (对于上下文,我进行了快速审核并在我们的应用程序中计算了 34 个 MDB 和 775 个 SLSB。)
- 最好使我的 EJB 池的
max-pool-size
与应用程序所需的 EJB 实例的预期数量紧密匹配,还是我可以只对所有内容设置一个大的 max-pool-size
值然后离开在那?
至于20的max-poo-size
,真的很难想出一个默认值。如果将其设置为 100,则单核系统上的用户可以轻松压倒 CPU。它归结为有多少个内核可用、MDB 工作负载是什么样的以及应用程序中还有多少其他内容。
如果您有 32 个内核可用,应用程序中没有其他任何事情发生,并且在 MDB 处理期间完成的工作非常小,那么 20 个内核可能太小了。
MDB 将始终被池化,无状态会话 bean 也是如此。
您可以将池最大值设置为较高的值,这不会造成任何伤害。请记住,对于 MDB,激活需要 JMS 会话。默认会话数为 15。因此对于 MDB,您需要匹配会话数和实例池大小以获得所需数量的激活 MDB。会话数在 MDB 激活部署规范中配置。
我们有一个大型知识管理应用程序,我们正在从 JBoss EAP 4.3 迁移到 EAP 6.4。我们遇到了一些问题,并行 MDB 驱动的进程失败(错误消息在 this question 中引用),可追溯到 SLSB 池耗尽。 MDB 线程正在请求一个特定的无状态会话 bean 三层深度(以打开新事务),因此 10 个并发进程足以耗尽池并导致死锁,默认值 max-pool-size
为 20。
解决方案是将该特定 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-pool
和mdb-strict-max-pool
一些 任意大的值?我认识到这可能会增加峰值 应用程序在实例化时使用的内存分配 很多 EJB 实例,但由于 EJB 只是按需实例化并添加到池中,这与不使用池的替代方案有何不同? (对于上下文,我进行了快速审核并在我们的应用程序中计算了 34 个 MDB 和 775 个 SLSB。) - 最好使我的 EJB 池的
max-pool-size
与应用程序所需的 EJB 实例的预期数量紧密匹配,还是我可以只对所有内容设置一个大的max-pool-size
值然后离开在那?
至于20的max-poo-size
,真的很难想出一个默认值。如果将其设置为 100,则单核系统上的用户可以轻松压倒 CPU。它归结为有多少个内核可用、MDB 工作负载是什么样的以及应用程序中还有多少其他内容。
如果您有 32 个内核可用,应用程序中没有其他任何事情发生,并且在 MDB 处理期间完成的工作非常小,那么 20 个内核可能太小了。
MDB 将始终被池化,无状态会话 bean 也是如此。
您可以将池最大值设置为较高的值,这不会造成任何伤害。请记住,对于 MDB,激活需要 JMS 会话。默认会话数为 15。因此对于 MDB,您需要匹配会话数和实例池大小以获得所需数量的激活 MDB。会话数在 MDB 激活部署规范中配置。