合理设置工做线程数

最大工做线程数,后端服务通常也有个配置,工做线程池的线程数量,这个线程数的配置不一样的业务架构师有不一样的经验值,有些业务设置为CPU核数的2倍,有些业务设置为CPU核数的8倍,有些业务设置为CPU核数的32倍。html

 

一个典型的工做线程的处理过程,从开始处理start到结束处理end,该任务的处理共有7个步骤:数据库

  • 从工做队列里拿出任务,进行一些本地初始化计算,例如http协议分析、参数解析、参数校验等后端

  • 访问cache拿一些数据服务器

  • 拿到cache里的数据后,再进行一些本地计算,这些计算和业务逻辑相关多线程

  • 经过RPC调用下游service再拿一些数据,或者让下游service去处理一些相关的任务架构

  • RPC调用结束后,再进行一些本地计算,怎么计算和业务逻辑相关线程

  • 访问DB进行一些数据操做日志

  • 操做完数据库以后作一些收尾工做,一样这些收尾工做也是本地计算,和业务逻辑相关htm

分析整个处理的时间轴,会发现:排序

    线程进行本地业务逻辑计算时须要占用CPU

    访问cache、service、DB过程当中线程处于一个等待结果的状态,不须要占用CPU

 

经过量化分析,例如打日志进行统计,能够统计出整个Worker线程执行过程当中这两部分时间的比例,例如:

  • 执行计算,占用CPU的时间(粉色时间轴)是100ms

  • 等待时间,不占用CPU的时间(橙色时间轴)也是100ms

 

获得的结果是,这个线程计算和等待的时间是1:1,即有50%的时间在计算(占用CPU),50%的时间在等待(不占用CPU):

  • 假设此时是单核,则设置为2个工做线程就能够把CPU充分利用起来,让CPU跑到100%

  • 假设此时是N核,则设置为2N个工做现场就能够把CPU充分利用起来,让CPU跑到N*100%

 

结论

N核服务器,经过执行业务的单线程分析出本地计算时间为x,等待时间为y,则工做线程数(线程池线程数)设置为 N*(x+y)/x,能让CPU的利用率最大化。

 

经验

通常来讲,非CPU密集型的业务(加解密、压缩解压缩、搜索排序等业务是CPU密集型的业务),瓶颈都在后端数据库访问或者RPC调用,本地CPU计算的时间不多,因此设置几十或者几百个工做线程是可以提高吞吐量的。

 

6、总结

  • 线程数不是越多越好

  • sleep()不占用CPU

  • 单核设置多线程不但能使得代码清晰,还能提升吞吐量

  • 站点和服务最经常使用的线程模型是“IO线程与工做现场经过任务队列解耦”,此时设置多工做线程能够提高吞吐量

  • N核服务器,经过日志分析出任务执行过程当中,本地计算时间为x等待时间为y,则工做线程数(线程池线程数)设置为 N*(x+y)/x,能让CPU的利用率最大化

*************** http://www.importnew.com/17384.html

https://mp.weixin.qq.com/s/EPWwJShDNmnQQE24tAOanQ

相关文章
相关标签/搜索