`
annan211
  • 浏览: 445388 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java 高性能运算--量化线程池的大小

 
阅读更多

   线程池合理的长度取决于将要提交的任务类型和所部署系统的特征。
     为了正确的定制线程池的长度,你需要理解你的计算环境、资源预算和任务的自身特性。部署系统中安装了多少个CPU?多少内存?任务主要执行的是计算、I/O还是一些混合操作?它们是否需要像JDBC Connection这样的稀缺资源?如果你有不同类别的任务,它们拥有差别很大的行为,那么应该考虑使用多个不同的线程池,这样每个线程池可以根据不同任务的工作负载进行调节。
      对于计算密集型的任务,一个有Ncpu 个处理器的系统通常通过使用一个Ncpu +1个线程的线程池来获得最优的利用率(计算密集型的线程恰好在某时因为发生一个页错误或者因为其他原因而暂停,刚好有一个“额外”的线程,可以确保在这样的情况下CPU周期不会中断工作)。对于包含了I/O和其他阻塞操作的任务,不是所有的线程都会在所有的时间被调度,因此你需要一个更大的池。为了正确地设置线程池的长度,你必须估算出任务花在等待的时间与用来计算的时间的比率;这个估算值不必十分精确,而且可以通过一些监控工具获得。你还可以选择另一种方法来调节线程池的大小,在一个基准负载下,使用不同大小的线程池运行你的应用程序,并观察CPU利用率的水平。

  线程池大小 对于系统运行效率来说至关重要,我们可以给出一个估算线程池大小的经验公式。


   Ncpu = CPU的数量
   Ucpu = 目标CPU的使用率(0<=Ucpu<=1)
   W/C = 等待时间与计算时间的比率

   为保持处理器达到期望的使用率,最优的线程池的大小等于
   
    NThreads = Ncpu * Ucpu *(1+W/C)

   可以通过 Runtime.getRuntime().availableProcessors(); 获取CPU的数量。
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics