线程数设置和CPU数的关系

一般说来,大家认为线程池的大小经验值应该这样设置:(其中 N 为 CPU 的个数)
如果是 CPU 密集型应用,则线程池大小设置为 N +1
如果是 IO 密集型应用,则线程池大小设置为 2N+1(因为 io 读数据或者缓存的时候,线程等待,此时如果多开线程,能有效提高 cpu 利用率)
如果一台服务器上只部署这一个应用并且只有这一个线程池,那么这种估算或许合理,具体还需自行测试验证。
但是,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 数目

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

http://ifeve.com/how-to-calculate-threadpool-size/