美文网首页Android知识程序员
如何合理地估算线程池大小?

如何合理地估算线程池大小?

作者: 静默加载 | 来源:发表于2017-09-21 11:31 被阅读709次

个人博客地址 http://dandanlove.com/

线程池的长度取决于未来提交的任务类型和所部署的系统特征。

概述

制定线程池的长度并不是一门精密的科学,需要做的仅仅是避免“过大”和“过小”者两个极端情况。如果一个线程池过大,那么线程对稀缺的CPU和内存资源的竞争,会导致内存的高使用量,还可能耗尽资源。如果过小,由于存在很多可用的处理器资源却未在工作,会对吞吐量造成损失。

为了正确地制定线程池的长度,需要理解当前的计算环境、资源预算和任务的自身特性。部署系统中安装了多少个CUP?多少内存?任务主要执行的是计算、I/O还是一些混合操作?它们知否需要像JDBCConnection这样的稀缺资源?如果有不同类别的任务,它们拥有差别很大很为,那么可以考虑使用多个线程池,这样每个线程池可以根据不同任务的工作负载进行调节。

估算

一般说来,大家认为线程池的大小经验值应该这样设置:(其中N为CPU的个数)

  • 如果是CPU密集型应用,则线程池大小设置为N+1
  • 如果是IO密集型应用,则线程池大小设置为2N+1

如果一台服务器上只部署这一个应用并且只有这一个线程池,那么这种估算或许合理,具体还需自行测试验证。
但是,IO优化中,这样的估算公式可能更适合:

  • 最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目

因为很显然,线程等待时间所占比例越高,需要越多线程。线程CPU时间所占比例越高,需要越少线程。

下面举个例子:比如平均每个线程CPU运行时间为0.5s,而线程等待时间(非CPU运行时间,比如IO)为1.5s,CPU核心数为8,那么根据上面这个公式估算得到:((0.5+1.5)/0.5)*8=32。这个公式进一步转化为:

  • 最佳线程数目 = (线程等待时间与线程CPU时间之比 + 1)* CPU数目

刚刚说到的线程池大小的经验值,其实是这种公式的一种估算值。

参考 如何合理地估算线程池大小?

文章到这里就全部讲述完啦,若有其他需要交流的可以留言哦

想阅读作者的更多文章,可以查看我 个人博客 和公共号:

振兴书城

相关文章

  • Executors.newFixedThreadPool(NTH

    并发编程中线程池 是跑不了的, 用过线程池的朋友 都会遇到这样的一个问题: 如何合理地估算线程池大小? 怎么样设置...

  • (搬运)如何合理地估算线程池大小?

    如何合理地估算线程池大小? 先来一个天真的估算方法:假设要求一个系统的TPS(Transaction Per Se...

  • 如何合理地估算线程池大小?

    个人博客地址 http://dandanlove.com/ 线程池的长度取决于未来提交的任务类型和所部署的系统特征...

  • 如何合理地估算线程池大小?

    蒋小强http://ifeve.com/how-to-calculate-threadpool-size/ 如何合...

  • 如何合理地估算线程池大小?

    这个问题虽然看起来很小,却并不那么容易回答。 大家如果有更好的方法欢迎赐教,先来一个天真的估算方法: 假设要求一个...

  • JAVA并发梳理(五)线程池

    关于线程池的实现,各自的特点等稍后再补充。现在先总结下如何合理地设置线程池的大小。 线程池中线程的数目是跟线程池所...

  • 合理的估算Java线程池大小的方法

    网上有给出简单的线程池大小估算方法 如果是CPU密集型应用,则线程池大小设置为N+1如果是IO密集型应用,则线程池...

  • java----线程池

    什么是线程池 为什么要使用线程池 线程池的处理逻辑 如何使用线程池 如何合理配置线程池的大小 结语 什么是线程池 ...

  • java多线程面试笔记

    cpu 核心数和线程数: 估算线程池大小的公式: Nthreads=NcpuUcpu(1+w/c),其中 Ncpu...

  • 如何设置线程池大小

    如何设置线程池大小 线程池的线程数量设置过多会导致线程竞争激烈,如果线程数量设置过少的话,还会导致系统无法充分利用...

网友评论

    本文标题:如何合理地估算线程池大小?

    本文链接:https://www.haomeiwen.com/subject/fbuujxtx.html