最佳线程数计算
2020-06-23 本文已影响0人
Lucie_xxm
并发编程适用于什么场景?
根据应用场景
- CPU 密集型
- I/O密集型程序
CPU 密集型
一个完整请求,I/O操作可以在很短时间内完成, CPU还有很多运算要处理,也就是说 CPU 计算的比例占很大一部分
最佳线程= cpu核数(逻辑) +1
I/O密集型程序
与 CPU 密集型程序相对,一个完整请求,CPU运算操作完成之后还有很多 I/O 操作要做,也就是说 I/O 操作占比很大部分
单核:
最佳线程数 = (1/CPU利用率) = 1 + (I/O耗时/CPU耗时))
计算示例
多核:
最佳线程数 = CPU核心数 * (1/CPU利用率) = CPU核心数 * (1 + (I/O耗时/CPU耗时))
家里不是有矿,CPU核数一般都在16或者32
公式来源:并发编程实战-8.2章节
I/O耗时和CPU耗时和CPU利用率怎样获取
APM (Application Performance Manager)工具可以帮我们得到准确的数据
- SkyWalking
- zipkin
例子:
假设要求一个系统的 TPS(Transaction Per Second 或者 Task Per Second)至少为20,然后假设每个Transaction由一个线程完成,继续假设平均每个线程处理一个Transaction的时间为4s
如何设计线程个数,使得可以在1s内处理完20个Transaction?
计算操作需要5ms,DB操作需要 100ms,对于一台 8个CPU的服务器,怎么设置线程数呢?
线程数 = 8 * (1 + 100/5) = 168 (个)
- 那如果DB的 QPS(Query Per Second)上限是1000,此时这个线程数又该设置为多大呢?
题外话:增加 CPU 核数一定能解决问题吗?
这个结论告诉我们,假如我们的串行率是 5%,那么我们无论采用什么技术,最高也就只能提高 20 倍的性能。