2

WSO2 ESB 未加载所有代理(超过 20 个)。然后我们在启动脚本中增加了以下两个值并且它起作用了:

-Dsnd_t_core=120
-Dsnd_t_max=600

但后来我们遇到了 WSO2 ESB 的几个致命问题。多个 JMS 代理被阻止,不再使用消息。最糟糕的是:carbon.log 中没有错误!

此外,服务器上的 CPU 负载上升到 100%。

重新启动并没有解决问题,只有停用计划任务或代理才能解决问题。

我们现在发现,一个 VFS 代理正在创建正好 120 个线程 (JConsole)。对于每个 transport.PollInterval,它都会创建一个新线程。

您对 -Dsnd_t_core 和 max 使用哪些值?

为什么 VFS 代理会在每个 PollInterval 处创建一个新线程(请参阅 jconsole)?

4

1 回答 1

1

据我所知,WSO2 ESB 线程是基于 java.util.concurrent ThreadPool 的。

在此链接中,您可以了解一些 ThreadPool 特性,例如何时创建新线程、队列机制和拒绝任务策略。

您对 -Dsnd_t_core 和 max 使用哪些值?
-Dsnd_t_core 是 ThreadPool 中的最小线程数。因此 WSO2 ESB 将自动创建线程,就像您设置 -Dsnd_t_core 一样。默认值为 20。如果不指定 -Dsnd_t_core,WSO2 ESB 将创建 20 个 vfs-worker。
-Dsnd_t_max 是 ThreadPool 中的最大线程数。如果达到最大数量,WSO2 ESB 将停止创建新线程。

为什么 VFS 代理会在每个 PollInterval 处创建一个新线程(请参阅 jconsole)?
WSO2 ESB 将在这些条件下创建一个新线程:

  • 如果运行的线程少于 corePoolSize,则 Executor 总是更喜欢添加新线程而不是排队。
  • 如果 corePoolSize 或更多线程正在运行,Executor 总是更喜欢排队请求而不是添加新线程。
  • 如果请求无法排队,则会创建一个新线程,除非这将超过 maximumPoolSize,在这种情况下,该任务将被拒绝。

因此,只要您的队列已满且未达到最大线程数,WSO2 就会创建一个新线程来处理一个进程。PollInterval 设置为指定服务开始轮询源文件夹中的消息或文件之前的延迟。

您可以将 maxQueue 编号设置为未绑定 (-1),这样队列永远不会满,也永远不会创建新线程。

我还从 JConsole 中找到了一些东西。1 个服务/1 个代理服务将仅由 1 个线程处理。我仍然试图弄清楚这一点,并使 1 个服务/1 个代理服务由 2 个或更多线程(多线程)处理。

希望这将有助于回答您的问题:)

于 2013-04-09T07:55:57.710 回答