最佳线程数计算

并发编程适用于什么场景?

根据应用场景

  • 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 倍的性能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。