tomcat 中的应用程序线程 7
Application threads in tomcat 7
我有一个 web 服务,它依次调用其他 10 个 web 服务,它会产生更高的响应 times.So 我正在使用 ExecutorService 通过 spring servlet.xml 配置生成线程,如下所示
<bean id="executorService" class="org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean" scope="prototype">
<property name="corePoolSize" value="3" />
<property name="maxPoolSize" value="4" />
<property name="keepAliveSeconds" value="5" />
</bean>
我正在监视 JvisualVM 中的线程并注意到始终有 3 个 executorservices 线程。我试图了解这是否会为每个通过的请求旋转 3 个线程,或者所有请求都会尝试使用配置的相同 3 个 corePoolSize。
如果所有请求都将使用 3 个线程,则应增加核心池大小(如果是,增加到多少)?
还有,什么时候关闭executor服务?
我不熟悉这种旋转线程的方式,有人可以帮助我了解它是如何工作的吗?
默认情况下,Spring 中的 Bean 是单例,因此您只有一个 executorService
实例,它管理一个大小为 3-4 的线程池。
当创建池时,它会启动 3 个线程,然后空闲直到需要。如果需要更多线程,它将最多使用 4 个线程,因此只比最初创建的线程多 1 个。
这与有多少传入请求尝试使用该池无关。
正如@andreas 提到的,您将拥有一个 executorservice 实例,因为 bean 定义默认是单例的。
doc 表示,corePoolSize
- 保留在池中的线程数,即使它们处于空闲状态,除非设置了 allowCoreThreadTimeOut。因此,尽管它们还活着,但您始终会在池中拥有三个活着的线程。如果有更多请求,池大小将增加到 4,因为您已将 maxPoolSize
设置为 4。但是第四个线程(您不知道是哪一个)将在空闲 5 秒后离开池因为您已将 keepAliveTime
设置为 5.
要回答你问题的后半部分,你可以看看我对类似问题的回答here。这是一个性能调整问题,取决于您的应用程序如何处理 I/O、CPU 等
正如您所说的,您正在为一个传入请求调用 10 个其他 Web 服务,因此一个请求会分散到 10 个请求。他们是网络 I/O 绑定还是 CPU 绑定?你如何合并它们?合并 10 个下游服务的响应时有多少资源争用?
我有一个 web 服务,它依次调用其他 10 个 web 服务,它会产生更高的响应 times.So 我正在使用 ExecutorService 通过 spring servlet.xml 配置生成线程,如下所示
<bean id="executorService" class="org.springframework.scheduling.concurrent.ThreadPoolExecutorFactoryBean" scope="prototype">
<property name="corePoolSize" value="3" />
<property name="maxPoolSize" value="4" />
<property name="keepAliveSeconds" value="5" />
</bean>
我正在监视 JvisualVM 中的线程并注意到始终有 3 个 executorservices 线程。我试图了解这是否会为每个通过的请求旋转 3 个线程,或者所有请求都会尝试使用配置的相同 3 个 corePoolSize。
如果所有请求都将使用 3 个线程,则应增加核心池大小(如果是,增加到多少)?
还有,什么时候关闭executor服务?
我不熟悉这种旋转线程的方式,有人可以帮助我了解它是如何工作的吗?
默认情况下,Spring 中的 Bean 是单例,因此您只有一个 executorService
实例,它管理一个大小为 3-4 的线程池。
当创建池时,它会启动 3 个线程,然后空闲直到需要。如果需要更多线程,它将最多使用 4 个线程,因此只比最初创建的线程多 1 个。
这与有多少传入请求尝试使用该池无关。
正如@andreas 提到的,您将拥有一个 executorservice 实例,因为 bean 定义默认是单例的。
doc 表示,corePoolSize
- 保留在池中的线程数,即使它们处于空闲状态,除非设置了 allowCoreThreadTimeOut。因此,尽管它们还活着,但您始终会在池中拥有三个活着的线程。如果有更多请求,池大小将增加到 4,因为您已将 maxPoolSize
设置为 4。但是第四个线程(您不知道是哪一个)将在空闲 5 秒后离开池因为您已将 keepAliveTime
设置为 5.
要回答你问题的后半部分,你可以看看我对类似问题的回答here。这是一个性能调整问题,取决于您的应用程序如何处理 I/O、CPU 等
正如您所说的,您正在为一个传入请求调用 10 个其他 Web 服务,因此一个请求会分散到 10 个请求。他们是网络 I/O 绑定还是 CPU 绑定?你如何合并它们?合并 10 个下游服务的响应时有多少资源争用?