文章目录
为什么使用多线程?
最大化CPU使用率
如何最大化CPU密集型任务CPU使用率?
什么是CPU密集型任务?
计算占大部分,数据传输(IO)占小部分
如何最大化利用率?
核心是减少线程之间上下文切换带来的开销
如何确定合适的线程数?
线程数=CPU核数(逻辑)+1
“+1
”是为了确保在意外情况出现中断时,仍然有一个线程任务使得CPU不空闲下来。
如何最大化IO密集型任务CPU使用率?
什么是IO密集型任务?
计算占小部分,数据传输(IO)占大部分
如何最大化利用率?
核心是在IO的过程中,减少CPU的空闲状态时间,增加线程执行任务填充CPU空闲时间
如何确定合适的线程数?
线程数=CPU核数×(1/CPU利用率)=CPU核数×[1+(IO耗时/CPU耗时)]
- “
+1
”同样是备用。 - (
IO耗时/CPU耗时
)耗时即为在IO期间,看看需要多少线程可以填充CPU的空闲期。 - 具体的耗时,需要根据实际业务测试得出。
实际运用
- Q1: 每个Transaction由3个线程完成,每个Transaction处理时间为0.5s,如何设计线程数保证系统TPS为100?
- A1:
每个线程每秒可以处理的Transaction数:
1/3/0.5=2/3;
TPS=100需要的线程数:
100/(2/3)=150
一般服务器的CPU核数为16~32,线程数量过于多带来的上下文切换开销也要实际考虑。
- Q2:某个任务,CPU计算需要10ms,数据传输需要100ms,对于16h核数的服务器,如何设置线程数?
- A2:
数据传输时间远大于CPU计算时间,所以是IO密集型任务。
线程数=16×[1+(100/10)]=176
- Q3:在上一问的基础上,如果数据库QPS为1000,线程数该作何修改?
- A3:
不考虑数据库QPS时,系统的QPS为:
QPS=线程数*[1000/(IO耗时+CPU耗时)]=176×[1000/(100+10)]=1600
根据数据库QPS按比例减少线程数:
线程数=176×1000/1600=110