线程数设置理论
- CPU密集型:核心数 + 1
- I/O密集型:核心数 * 2
CPU利用率基础
- 单个CPU核心在单位时间内只能执行一个线程的指令。
实验验证
- 死循环测试:单线程可跑满一个核心利用率。
- 多线程测试:增加线程数,核心利用率上升,但超过核心数后,系统负载增加。
线程切换成本
- 切换线程涉及寄存器更新、内存页表更新等,频繁切换导致性能下降。
I/O操作对CPU利用率的影响
- I/O操作期间,CPU空闲,操作系统可调度执行其他线程,提高利用率。
线程数与CPU利用率关系
- 极端线程可占满核心,多核心CPU最多同时执行核心数的线程。
- 超过核心数的线程数导致频繁切换,增加系统负载。
线程数计算公式
- 来自《Java 并发编程实战》。
- 公式:[ \text{线程数} = \text{核心数} \times \text{利用率} \times (1 + \frac{\text{等待时间}}{\text{计算时间}}) ]
实际线程数规划
- 无固定答案,需根据预期目标(CPU利用率、负载、GC频率等)通过测试调整。
- 考虑主机其他进程、JVM进程中的线程干扰。
测试流程
- 分析主机和其他进程干扰。
- 分析JVM进程中的线程。
- 设定目标CPU利用率、GC频率/暂停时间、执行效率等。
推荐线程数
- 对于简单异步场景,推荐使用CPU核心数作为线程数。
总结
- 线程数设置需结合实际场景和目标,通过测试找到最合适的配置。
- 考虑主机和JVM进程中的其他线程对CPU资源的影响。
- 通过不断测试和调整,达到预期的CPU利用率和系统性能。
个人思考
- 线程数配置并非一成不变,需根据实际应用场景和性能要求进行调整。
- 理解CPU和线程的工作机制有助于更合理地配置线程池。
- 实际应用中,应避免过度依赖理论公式,重视实际测试和性能监控。