【问题标题】:Number of threads in thread pool for good perfomance线程池中的线程数以获得良好的性能
【发布时间】:2014-02-27 08:45:45
【问题描述】:

我有一个Executor 线程池,其核心大小和最大大小都保持在 40,每个线程将使用来自 Apache HTTP 客户端的PoolingClientConnectionManager 的 HTTP 连接,每个主机路由有 40 个连接。我可以看到,如果负载减少,性能也会降低……你们能帮帮我吗?

【问题讨论】:

  • 我不知道怎么做。你的能力和你的要求只有你自己知道。尝试增加和减少一些东西,直到你得到你需要的东西。
  • 实验是最好的方法,因为每个应用程序的配置文件都不同。典型起点是处理器核心数+2

标签: java multithreading threadpool connection-pooling apache-httpclient-4.x


【解决方案1】:

使用如下内容:

ExecutorService service = Executors.newCachedThreadPool();

service.execute(someRunnable);

在这种情况下,您不必担心正在运行的线程数。 系统会自动为你增减线程数。

这是文档:

公共静态ExecutorService newCachedThreadPool()

创建一个线程池,根据需要创建新线程,但会 当它们可用时重用以前构造的线程。这些 池通常会提高执行程序的性能 许多短暂的异步任务。调用执行将重用 以前构造的线程(如果可用)。如果没有现有线程 可用时,将创建一个新线程并将其添加到池中。线程 六十秒内未使用的将被终止并删除 从缓存中。因此,一个闲置时间足够长的池将 不消耗任何资源。请注意,具有相似属性但 可以创建不同的细节(例如,超时参数) 使用 ThreadPoolExecutor 构造函数。

返回:新创建的线程池

希望对你有帮助。

【讨论】:

    【解决方案2】:

    这完全取决于您在运行 JVM 的主机中拥有多少内核,以及您希望每个线程使用多少 CPU。

    假设一个 8 核主机,除了您的 JVM,nothing else 正在运行,您执行的每个任务都纯粹受 CPU 限制,那么您可能希望线程池大小为 7(离开一个内核免费用于 JVM 活动,如垃圾收集和其他操作系统任务)。

    但是,系统从来都不是那么可预测的,因此最好在预期负载下进行一些分析,看看什么效果最好。

    【讨论】:

    • 非阻塞 i/o 就是这种情况,但是阻塞连接通常会在 i/o 操作中被阻塞,从而有效地不使用 CPU,因此通常使用阻塞 i/o需要比 CPU 内核更多的工作线程
    • 这就是我提到“纯 CPU 受限”的原因。我想我应该明确说明应该如何增加非纯 CPU 限制的任务的线程数。
    猜你喜欢
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多