【问题标题】:ThreadPoolExecutor parameter configurationThreadPoolExecutor 参数配置
【发布时间】:2014-08-14 23:11:46
【问题描述】:

我正在使用需要从 Rest API 请求数据的客户端应用程序。其中许多请求是独立的,因此可以异步调用它们。我正在使用 ThreadPoolExecutor 来执行此操作,并且我已经看到它可以使用多个参数进行配置:

  • corePoolSize
  • maxPoolSize
  • 队列容量

我阅读了this article 并了解以下内容:

  • corePoolSize 是执行器添加新线程而不是排队的值
  • maxPoolSize 是上面哪个执行器排队请求的值
  • 如果实际线程数在 corePoolSize 和 maxPoolSize 之间,则请求排队。

但我有一些问题:

  • 我一直在测试,corePoolSize越高,我得到的结果就越好。在有很多客户向这个 Rest API 提出请求的生产环境中(可能每天数百万),corePoolSize 应该多高?
  • 我应该如何获得“最佳”参数?仅通过测试?
  • (每个参数的)高/低值可能导致哪些问题?

提前谢谢你

更新

我目前的价值观是:

  • corePoolSize = 5
  • maxPoolSize = 20
  • queueCapacity = 100

【问题讨论】:

  • 你的理解是错误的(我在链接的文章中找不到任何会导致它的东西)。请注意,从您所说的 maxPoolSize 是多余的,因为当线程数高于和低于它时,您都会对请求进行排队。
  • 注意:如果可以将任务添加到队列中,则池大小不会增长。您可能会发现,即使您没有填满队列,拥有更多线程也会有所帮助。

标签: java asynchronous threadpoolexecutor


【解决方案1】:
  • corePoolSize保留在池中的线​​程数,即使它们处于空闲状态,除非设置了 {@code allowCoreThreadTimeOut}
  • maximumPoolSize池中允许的最大线程数

corePoolSize 是您希望永远等待的线程数,即使没有人请求它们。 maximumPoolSize 是您将启动的 Rest API 的最大线程数和并发请求数。

  • 每秒有多少个请求? (平均/每秒最大值)。
  • 一个请求需要多长时间?
  • 用户可接受的最长等待时间是多长时间?

corePoolSize >= requests per second * seconds per request

maximumPoolSize >= maximum requests per second * seconds per request

queueCapacity <= maximumPoolSize * maxWaitTime / timePerRequest(您应该对此进行监控,以便知道何时必须采取行动。)

您必须记住,Rest API 或您自己的应用程序/服务器/带宽可能会对并发连接数施加一些限制,并且许多并发请求可能会增加每个请求的时间。

我宁愿保持corePoolSize 低,keepAliveTime 相当高。

您必须记住,每个线程都会为并行 HTTP 请求增加相当多的开销,应该有一个 NIO 变体可以在没有大量线程的情况下执行此操作。也许你可以试试Apache MINA

【讨论】:

  • 非常感谢您的回答
猜你喜欢
  • 1970-01-01
  • 2018-10-18
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 2011-11-25
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多