线程数设置多少合适
Posted 一口Linux
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程数设置多少合适相关的知识,希望对你有一定的参考价值。
线程数设置多少合适
为什么要使用多线程
使用多线程本质上是提升性能,性能可能直接理解为快!快就完事了,但是这样的说法太笼统,那应该如何度量性能呢?
度量性能最常用的指标为吞吐量和延迟,延迟指一个请求从发送到收到响应这个过程的时间,延迟越短意味着程序处理得越快,性能就越好,而吞吐量指的是单位时间内能处理的请求数量,吞吐量越大表示性能越好,但是需要注意的是这两个指标属于不同维度(延迟是时间维度,吞吐量是空间维度)并不能互换。
所以使用多线程的目的就是降低延迟、提升吞吐量,那多线程如何去做呢?这就要从多线程的应用场景去谈。
多线程的应用场景
如何才能降低延迟和提升吞吐量呢?可以分为算法优化和尽可能地提升硬件性能,其中算法优化属于算法范畴而硬件性能提升就和并发编程有关,硬件分类一般有两种CPU和I/O,并发领域提升硬件性能的本质是提升硬件的利用率,也就是提升CPU利用率和I/O利用率。
这里需要注意的是操作系统已经解决硬件利用率,操作系统利用中断机制,避免了CPU轮询I/O状态,提升了CPU的性能,但是这个利用率指的是单一硬件的利用率,并发程序需要解决的是CPU和I/O设备的综合利用率,这是有所区别的。
而解决CPU和I/O设备的综合利用率操作系统无法做到完美解决,不过给编程人员提供了解决方案,这就是多线程。
多线程是如何解决CPU和I/O设备的综合利用率的呢?我们假设程序按照CPU计算和I/O计算交替执行,并且CPU执行时长和I/O执行时间是1:1
那么当单线程执行时,CPU计算和I/O计算如图所示。
线程A执行CPU操作时I/O操作等待,执行I/O操作时CPU操作等待,所以CPU利用率和I/O利用率都只有50%。
当两个线程执行时,线程A执行I/O操作,线程B执行CPU操作,线程A执行CPU操作,线程B执行I/O操作,这样CPU操作和I/O操作利用率都达到了100%。
在单核时代,多线程主要用来平衡CPU和I/O操作,如果程序只有CPU计算而没有I/O操作那么多线程反而会降低性能,因为多线程切换需要成本。
但是在多核时代,这种纯CPU计算,多线程下能够减低延迟,提升响应速度,如图,对于一个四核的CPU,需要对1+2+3+..........+1亿求和,线程存在四个线程,线程A计算[1,2500W),线程B计算[2500W,5000W),线程C计算[5000W,7500W),线程D计算[7500W,一亿],这样做的好处就是理论上每个线程从计算到响应的时间缩短为了原来的四分之一,如图所示。
线程数设置多少合适
对于我们的程序而言,大多数都是CPU和I/O操作交叉执行,对应的衍生出两种场景,CPU密集型和I/O密级型。
CPU密级型
定义
CPU密级型指消耗CPU资源,如圆周率的计算、对视频进行高清解码等等,全靠CPU的运算能力这种计算密级型任务虽然可以使用多任务完成,但是任务越多那么消耗在任务切换的时间就越多。
对于CPU密集型任务,一个四核CPU,每一个核对应一个线程,理论上四个线程就够了,如果线程数超过CPU核心数那么只会增大CPU切换线程的成本,所以对于一个CPU密级型任务来讲其线程数等于CPU的核心数最合适,不过从现实出发,线程数一般设置为CPU核心数+1如果有线程因为偶尔的内存页失效或者其它原因阻塞,那么额外线程还能顶上,保证CPU的利用率。
IO密级型
定义
IO密级型主要涉及到网络、硬盘的IO任务,这类任务消耗CPU操作很小,任务大部分时间都在等待IO操作的完成,对于IO密集型任务,任务越多CPU效率越高,但是存在一个限度,不可能无限的高,常见的IO密集型任务就是Web应用。
从前面的例子来讲,如果CPU计算耗时和IO计算耗时比例是1:1,那么两个线程最为合适,如果CPU计算耗时和IO计算耗时比例是1:2那么是多少线程合适呢?
是3个,示例图如下所示。
根据上诉可以得出,IO耗时和CPU耗时比能够影响IO密集型的线程数,所以推出如下公式
线程数 = 1+ (IO计算耗时/CPU计算耗时)
需要注意的是此公式是对于单核CPU而言那么多核CPU是如何处理呢?
线程数 = CPU核心数*(1+IO计算耗时/CPU计算耗时)
总结
不管是CPU密级型还是IO密级型其目的都是为了让硬件(CPU和IO)的利用率达到最佳,对于IO密级型来讲其公式核心是IO计算耗时/CPU计算耗时,但是这个比例是不确定的,所以在现实应用中需要不同场景的压测来估计,一定不要直接照搬公式,所有的理论都要以现实世界为基础,不能脱离现实谈技术。
原文链接:今日头条
以上是关于线程数设置多少合适的主要内容,如果未能解决你的问题,请参考以下文章