线程池大小选择:针对 I/O 密集型场景和 CPU 密集型场景
I/O 密集型场景
I/O 密集型场景指的是系统的磁盘以及内存的性能要高于CPU 性能,因此系统在这种场景下,大部分时间消耗在磁盘/内存的读写,CPU 的利用率不高。比如一些包含网络传输的场景。通常我们不会希望 CPU 成为瓶颈,因为 CPU 毕竟是计算机中很昂贵的部分,我们希望 CPU 可以做更多的工作,因为我们会通过调整线程池大小来转移业务瓶颈,这将在下文提到。
CPU密集型场景
CPU 密集型则相反,指的是 CPU 的性能高于磁盘和内存,这时 CPU 的利用率为 100%,I/O 只需要很短的时间就可以完成。比如当使用 CPU 时(而不是 GPU),神经网络的前向和反向计算就是典型的 CPU 密集型场景,因为这其中涉及了大量的卷积和数值运算。
线程池大小选择
线程池在 I/O 密集型场景的必要性
在这两种场景下,线程池大小的选择也是不同的。在 I/O 密集型场景中,我们需要增大线程池的大小以通过 overlap 消除 CPU 等待 I/O 的时间。这样讲很抽象,可以参考下图,首先我们假设这是一个任务,红色部分表示 I/O 时间,白色部分表示 CPU 处理时间
当线程池大小为1,也就是串行执行时,可以看到中间会有很多等待 I/O 的时间,CPU 被白白浪费: