gpt4 book ai didi

java - 多个用户同时访问的 Web 应用程序的 ExecutorService 线程池大小

转载 作者:行者123 更新时间:2023-12-02 11:57:26 24 4
gpt4 key购买 nike

我们在 tomcat 中部署了一个 Java Web 服务应用程序。该服务器是 3 核和 7GB RAM。它位于云中,支持最多 20 个实例的自动缩放。在任何给定时间点,至少 1000 个用户将同时访问此 Web 服务。

现在来看Web服务代码,它需要并行处理15个不同的方法(每个方法平均需要3秒),等待所有方法返回响应,处理所有响应并将输出返回给调用的客户端。我们使用带有固定线程池的 Java 执行器服务来实现同样的目的。

问题:

  1. 在 Servlet init() 方法中启动固定线程池执行器并在 servlet destroy 时将其关闭,这样线程池初始化一次并且应用程序使用该池中的线程,这是一个好主意吗?

  2. 固定线程池大小应该是多少?由于有多个客户端同时调用 Web 服务,它是否应该是 1k 或 2k 范围内的一个非常高的数字?或者应该是一个更小的数字?我们应该如何设计一个线程池大小,以便所有访问 Web 服务的 1000 个客户端都可以立即返回响应。

  3. 我们是否应该为我们的场景选择缓存线程池而不用担心池大小?

请帮忙。

最佳答案

Is it good idea to initiate the FixedThreadPool Executor at Servlet init() method and shut it down at servlet destroy so that thread pool is initialized once and application uses threads from this pool

您当然可以这样做,但更典型的做法是初始化全局线程池,然后让每个请求共享同一个池。如果您优化池中的线程数量(见下文),那么如果每个请求都有自己的池,那么将很难协调并行执行的请求。

也就是说,如果您需要 fork 多个线程然后等待它们完成,则每个请求使用一个池可能会更容易 – 特别是如果这些请求需要很长时间才能运行,这意味着池的创建是整体工作的一小部分。

What should be the Fixed Thread Pool size?

如果没有有关相关工作的更多信息,这是一个非常难以回答的问题。通常,如果请求非常受 IO 限制(例如等待网络连接),则需要增加线程数。 1-2k 线程可能可以工作,但如果目标是不排队任何作业,那么我当然会使用缓存线程池。

如果您的服务器 CPU 已达到极限,那么您应该减少线程数,因为您可能会同时运行太多作业,这可能会降低总体吞吐量。如果所有 15 个作业必须同时运行,还应该考虑到这一点。

How should we come up with a thread pool size so that all 1000 clients accessing the web service get back the response without delay or wait.

仅仅添加更多线程并不一定会让事情进展得更快。这是关于吞吐量的。如果可能,您应该对请求进行建模,或者尝试生产中的某些设置,然后比较每秒的请求数等,以确定哪些线程池设置会导致最高的总体吞吐量。

Should we go for a cached thread pool for our scenario and not worry about pool size?

您当然可以,但是您担心的是请求数量会增加,这会导致启动大量线程。同样,服务器中运行并处理请求的线程数量也有一个最佳值。过多的线程不会使作业更快完成,而且由于它们会占用资源并增加上下文切换频率,因此很容易降低整体吞吐量。

关于java - 多个用户同时访问的 Web 应用程序的 ExecutorService 线程池大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47501199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com