欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

如何优雅的设置线程池的大小?

程序员文章站 2022-04-15 09:15:49
假如线程池的大小设置过大,线程上线文切换过于频繁,造成大量资源开销,反而会使性能降低;假如设置的太小,存在很多可用的处理器资源却未在工作,会造成资源的浪费和对吞吐量造成损失。如何优雅的设置线程池的大小呢? ......

线程池需要设置合适的大小,假如设置的太大,线程上线文切换过于频繁,造成大量资源开销,反而会使性能降低。假如设置的太小,存在很多可用的处理器资源却未在工作,会造成资源的浪费和对吞吐量造成损失。

为了充分利用处理器资源,创建的线程数至少要等于处理器核心数。如果所有的任务都是计算密集型的,那么线程数等于可用的处理器核心数就可以了。不过,如果所有的任务都是io密集型,那么处理器大部分时间是空闲的,所有要适当的增加线程数。线程等待时间所占比例越高,需要越多线程。线程运算时间所占比例越高,需要越少线程。于是可以使用下面的公式进行估算:

最佳线程数 = (1 + 线程等待时间/线程计算时间)* 目标cpu的使用率 * 处理器核心数

例如:平均每个线程计算运行时间为0.5s,而线程等待时间(非计算时间,比如io)为1.5s,目标cpu的使用率是90%,cpu核心数为8,那么根据上面这个公式估算得到:(1 + 1.5/0.5) * 90% * 8 = 28.8。

即使有上面的简单估算方法,也许看似合理,但实际上也未必合理,都需要结合系统真实情况(比如是io密集型或者是cpu密集型或者是纯内存操作)和硬件环境(cpu、内存、硬盘读写速度、网络状况等)来不断尝试达到一个符合实际的合理估算值,也可以尝试dark magic的估算方法