美文网首页
线程池中线程数量如何设定

线程池中线程数量如何设定

作者: LandHu | 来源:发表于2020-05-08 16:50 被阅读0次

    一般说来,大家认为线程池的大小经验值应该这样设置:(其中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数目

    同理,数据库连接池也不是越大越好

    IO密集型  
    Nthreads = NCPU * UCPU * (1 + W/C)
    NCPU是处理器的核的数目,可以通过Runtime.getRuntime().availableProcessors()得到
    UCPU是期望的CPU利用率(该值应该介于0和1之间)
    W/C是等待时间与计算时间的比率
    
    无IO操作
    Nthreads=NCPU+1
    

    技术讨论 & 疑问建议 & 个人博客

    版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议,转载请注明出处!

    相关文章

      网友评论

          本文标题:线程池中线程数量如何设定

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