【问题标题】:Optimizing thread pool size优化线程池大小
【发布时间】:2015-04-08 19:24:28
【问题描述】:

his famous concurrency book 中,Goetz 建议可以使用

计算池中的最佳线程数
N threads = N CPU * U CPU * (1 + W/C)

W/C 是等待计算比率。我想开发一个自定义Executor,它将使用ThreadPoolExecutor.setCorePoolSize() 调整工作线程数量,但我不知道如何计算WC-ratio。假设这个 ThreadPool 是我的应用程序使用的唯一一个,我该如何计算该比率?

有没有办法跟踪工作线程在等待/睡眠上花费了多少时间? 或者有没有解决这个问题的实现?

【问题讨论】:

  • 请注意,应用程序工作人员可能会改变他们的行为,例如开始等待 http 响应的时间更长或更短,我希望他们能够动态调整,从而随着时间的推移跟踪每个 W/C ......就像 jvisualvm 那样。 ..
  • 不是你需要的 Thread.getState() 吗?
  • 我知道 getState() 但我不知道如何使用它?我应该在某个预定时间查询所有工作线程还是有一种方法可以订阅状态更改...或者这些状态中的哪些处于 W 下我假设两个睡眠等待阻塞都是...因此我需要一些建议。 ..
  • 如果您在 visualvm 中看到它可以跟踪所有运行时间、等待时间停车时间等...不知道我是如何仅使用 getState 做到这一点...我认为这里涉及到 jmx.. .
  • 到目前为止,除了在循环中检查线程状态之外,我不知道任何其他方法。我会尝试研究它,因为它很有趣。

标签: java optimization concurrency


【解决方案1】:

http://docs.oracle.com/javase/7/docs/api/java/lang/management/ThreadInfo.html

这个类包含类似的方法

getBlockedCount()

返回与此 ThreadInfo 关联的线程阻止进入或重新进入监视器的总次数。

getBlockedTime()

返回自启用线程争用监控以来,与此 ThreadInfo 关联的线程已阻止进入或重新进入监控器的大致累计经过时间(以毫秒为单位)。

【讨论】:

  • 所以我需要获取 JMX bean 并开始监控我的线程?这就是答案吗?
  • 我理解这种情况的方式是,我需要运行一个单独的计划任务,它将使用线程 mxbean 收集线程信息并开始调整我的线程池
  • 把这个放在这里以便以后找到nadeausoftware.com/articles/2008/04/…
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 2013-10-22
  • 2012-08-06
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
相关资源
最近更新 更多