线程池配置Java应用服务器

问题描述 投票:2回答:1

我正在维护一个几乎没有作为SOAP Web服务公开的服务的应用程序。我最近遇到了一些扩展问题,因为应用程序已经接收到比正常情况更多的负载。

关于少数池配置,我想知道我的理解是否正确,1。我们有如下的线程池配置,

<thread-pools>
    <thread-pool name="admin-thread-pool" max-thread-pool-size="50" max-queue-size="1024"></thread-pool>
    <thread-pool name="http-thread-pool" max-thread-pool-size="250"></thread-pool>
    <thread-pool name="http-thread-pool-internal" max-thread-pool-size="50"></thread-pool>
    <thread-pool name="thread-pool-1" max-thread-pool-size="200"></thread-pool>
</thread-pools>

<transports>
    <transport name="tcp" acceptor-threads="8"></transport>
</transports>

2. EJB池配置如下,

<ejb-container steady-pool-size="0" max-pool-size="50"  pool-resize-quantity="10">

所以现在问题。

  1. 如果http线程池收到需要同步执行的任务,并且池中没有足够的EJB bean实例(最大配置为50),会发生什么情况,因为所有EJB实例都在为其他http请求提供服务?注意:我们正在进行JNDI查找而不使用@EJB注释。
  2. 增加EJB实例(max)的数量是否等于http-threadpool值是否有意义?

在进行一些分析后,发现查找EJB实例的代码需要很长时间才能返回。这是否意味着没有可用的EJB实例,并且请求必须等到其他正在运行的线程释放实例?

java glassfish ejb threadpool
1个回答
5
投票

如果http线程池收到需要同步执行的任务,并且池中没有足够的EJB bean实例(最大配置为50),会发生什么情况,因为所有EJB实例都在为其他http请求提供服务?

EJB池不是JEE规范的一部分,因此,池化行为取决于供应商。根据Glassfish documentation(可能这可能因版本而异)如果池大小小于steady-pool-size,当新请求到达时,Container将创建X个新的ejb实例,其中X由pool-resize-quantity值确定。因此,你不应该耗尽合并的ejb。 max-pool-size不是固定限制。

增加EJB实例(max)的数量是否等于http-threadpool值是否有意义?

它可能是正确的,但请注意,如果在高负载期间需要更多ejb,Container将自动增加池大小。我会将steady-pool-size更改为大于0的值。

在进行一些分析后,发现查找EJB实例的代码需要很长时间才能返回。这是否意味着没有可用的EJB实例,并且请求必须等到其他正在运行的线程释放实例?

如果(可能是一个错误的配置池)服务器耗尽了可用的ejb,它会更多地创建一个新实例,而不是序列化客户端请求。这就是规范(ejb 3.1)所说的:

4.7无状态会话Bean ...如果需要处理客户端工作负载的增加,容器会创建另一个无状态会话Bean实例...

创建一个新的ejb实例不应该太昂贵,除非你的bean必须在初始化时执行特定的业务逻辑(例如@PostConstruct注释方法的逻辑)。

请记住,在高负载下,还有其他更多相关问题,而不是需要监视的池配置,如CPU和内存服务器使用情况。

© www.soinside.com 2019 - 2024. All rights reserved.