我想知道在特定场景中应该使用哪一个:有几个任务,通常需要处理400k个任务。大多数任务的处理时间不到4秒,但其中一些任务(300到500个任务(需要很长时间,通常在10到30分钟之间
目前,我们已经实现了大小为200的FixedThreadPool。我想知道我们是否可以用CachedThreadpool做得更好?还想知道对服务器的影响,因为只有一台服务器专门用于该任务。
所有任务只执行计算。无I/O操作
在您的情况下,线程池类型不会影响性能,因为线程管理的成本与每个任务的成本相比非常小(从4秒到30米(。
正在运行的并行线程的数量更为重要。如果每个任务都不执行任何I/O操作,那么并行线程的正确数量可能是硬件的核心数量。如果您的任务涉及网络或磁盘I/O,则更难确定正确的并行级别以最大限度地提高性能。
起点
以下是您的问题中最突出的内容:
- 大约有400000项任务需要处理
- 大多数任务(约399500或约99.875%(需要4秒或更短时间才能完成
- 一些任务(约500或约0.125%(通常需要10-30分钟才能完成
- 任务执行";没有I/O操作">
- 当前方法使用大小为200的FixedThreadPool
概述
假定任务执行";没有I/O操作";,这意味着:
- 没有磁盘I/O
- 无网络I/O
然后任务被CPU或内存绑定(限制(。第一步是了解两者中哪一个是限制器:CPU还是内存。
问题语句中没有任何内容听起来像是线程池的选择是一个因素。
受CPU限制
如果工作是CPU绑定的,通常情况下,将线程池大小增加到可用CPU核心的数量之外不会有任何改进。因此,如果您有32个可用的CPU内核,那么具有大量活动线程(例如:100(的线程池将由于上下文切换而产生开销(运行速度较慢(。事情不会"走得更快";如果底层争用资源是CPU,则具有更多线程。
对于CPU绑定的问题,我会首先将线程池设置为不高于机器上的CPU核心总数(可能更低(。因此,如果您的机器有32个内核,请尝试16个或20个线程池来启动。然后处理真实世界的数据,并对性能进行评估,可能会根据这些测试运行进行额外的更改。除了你自己的程序之外,任何计算机系统上都会运行其他东西,所以16(例如(不是一个既定的"数字";足够低"——这取决于系统上运行的其他内容。这就是进行测试运行的重要性——将其设置为16,寻找CPU争用的迹象,如果需要,可以将降低到16以下;或者可能有足够的空闲CPU可用16,所以增加更高的CPU是安全的/可以的。
受内存限制
如果工作是内存绑定的,那么线程池大小就不会像CPU核心那样直接绑定到争用资源。可能需要额外费用理解以决定是否或如何调整系统以避免内存争用。
与CPU绑定问题一样,您应该能够从固定大小(小于200的大小(开始,并使用真实世界的数据集进行观察。应该会出现一些模式,也许(例如(大约500个10-30分钟的任务比所有其他任务使用更多的内存。