CPU密集型
- 理论上:线程数量 = CPU 核数(逻辑)
- 实际上:线程数量 = CPU 核数(逻辑) + 1
为什么:实际线程数量=理论线程数量+1?
计算(CPU)密集型的线程恰好在某时因为发生一个页错误或者因其他原因而暂停,刚好有一个“额外”的线程,可以确保在这种情况下CPU周期不会中断工作。
IO密集型
- 最佳线程数 =
CPU核心数
*(1/CPU利用率)
=CPU核心数
*(1 + IO耗时/CPU耗时)
问题举例
问题1:假设要求一个系统的 TPS(Transaction Per Second 或者 Task Per Second)至少为20,然后假设每个Transaction由一个线程完成,继续假设平均每个线程处理一个Transaction的时间为4s,如何设计线程个数,使得可以在1s内处理完20个Transaction?
理论线程数量=20/(1/4) = 80
问题2:计算操作需要5ms,DB操作需要 100ms,对于一台 8个CPU的服务器,怎么设置线程数呢?
理论线程数量:8*(1+100/5) = 168
问题3:计算操作需要5ms,DB操作需要 100ms,对于一台 8个CPU的服务器,如果DB的 QPS(Query Per Second)上限是1000,此时这个线程数又该设置为多大呢?
168个线程每秒可处理任务=168*1000/105=1600(QPS)
QPS是1000,所以线程数要等比例减少=168*1000/1600=105
参考