知识卡片
按任务类型配线程
内容
线程数应服务于瓶颈位置,而非套固定数字:IO 密集型任务 CPU 利用率低,常开到核数两倍(如 Netty Reactor 默认值),用等待期切别的线程换吞吐;CPU 密集型任务线程数接近核心数即可,超出会增加上下文切换开销;混合型任务可用”(等待时间+CPU时间)/CPU时间×核数”估算,仅作调优起点。按瓶颈类型判断比死记公式可靠。
参考来源
- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第1章《多线程原理与实战》1.7.2节《为IO密集型任务确定线程数》、1.7.3节《为CPU密集型任务确定线程数》(源文件:_epub-src/OEBPS/Text/chapter45.xhtml、chapter46.xhtml)
- 结论依据:原文以 Netty Reactor 的 IO 线程数默认设为 CPU 核数两倍为例,说明 IO 密集型任务应多开线程弥补等待期间的空闲;又指出 CPU 密集型任务并行数超过核心数会增加任务切换开销,因此线程数应等于核心数,两者共同支撑“线程数服务于瓶颈类型”的结论。
- 原始内容:由于IO密集型任务的CPU使用率较低,导致线程空余时间很多,因此通常需要开CPU核心数两倍的线程……CPU密集型任务……并行的任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低……对于CPU密集型的任务来说,线程数等于CPU数就行。