享学课堂特邀做者:老顾
“很差了,线上服务器超时严重,请求很是慢,好像报链接数too many了,怎么办?“小伙伴们在反馈。通常咱们的技术老大的处理方式,把链接数和线程池调大点,重启,在观察。
每每这个方式是应急措施,治标不治本,由于不知道问题的缘由。
有个严重误区,觉得线程池设置过小了,调大点请求就会快了。
今天老顾就带着小伙伴们沟通一下,线程池的大小应该如何合理的设置其大小?mysql
若是有两个任务须要处理,一个任务A,一个任务Bnginx
方案一:一个线程执行任务A和B,A执行完后,执行B
方案二:两个线程A和B去执行任务A 和 B,同时进行
复制代码
哪一个方案会快点?应该不少人会回答,确定是方案二啊,多线程并行去处理任务A和B,确定快啊。是这样吗?回答这个问题以前,先带着你们去回顾梳理一下。web
多线程的执行,是由CPU进行调度的,一个CPU在同一时刻只会执行一个线程,咱们看上去的线程A 和 线程B并发执行,为了让用户感受这些任务正在同时进行,操做系统利用了时间片轮转的方式,CPU给每一个任务都服务必定的时间,而后把当前任务的状态保存下来,在加载下一任务的状态后,继续服务下一任务。任务的状态保存及再加载,这段过程就叫作上下文切换。redis
上下文切换的过程是须要时间的;如今咱们再来看一下上面的问题,咱们小伙伴们再看一下是哪一个方案快呢?是否是有些小伙伴们会说方案一,由于不须要线程切换。先不急,再往下看sql
按照上面的说法,有线程的上下文切换耗时,那么为何须要多线程呢?小伙伴会不会感受很乱,怎么回事?
小伙伴想一想在咱们真实业务中,咱们是什么流程?
数据库
上图的流程:后端
一、先发起网络请求
二、web服务器解析请求
三、请求后端的数据库获取数据
四、获取数据后,进行处理
五、把处理结果放回给用户服务器
这个是咱们处理业务的时候,常规的请求流程;咱们看一下整个过程涉及到什么计算机处理。网络
一、网络请求----->网络IO
二、解析请求----->CPU
三、请求数据库----->网络IO
四、mysql查询数据----->磁盘IO
五、mysql返回数据----->网络IO
六、数据处理----->CPU
七、返回数据给用户----->网络IO多线程
小伙伴们是否是感受又不乱了,在真实业务中咱们不仅仅会涉及cpu计算,还有网络IO和磁盘IO处理,这些处理是很是耗时的。若是一个线程整个流程是上图的流程,真正涉及到CPU的只有2个节点,其余的节点都是IO处理,那么线程在作IO处理的时候,CPU就空闲出来了,CPU的利用率就不高。
小伙伴们如今知道多线程的用处了吧,对,就是为了提高CPU利用率。
衡量系统性能如何,主要指标系统的(QPS/TPS)。
QPS/TPS:每秒可以处理请求/事务的数量
并发数:系统同时处理的请求/事务的数量
响应时间:就是平均处理一个请求/事务须要时长
QPS/TPS = 并发数/响应时间
复制代码
也就是并发数越大,QPS就越大;因此不少人就会觉得调大线程池,并发数就会大,也会提高QPS,因此才会出现一开始前言所说的。其实QPS还跟响应时间成反比,响应时间越大,QPS就会越小。
虽然并发数调大了,就会提高QPS,但线程数也会影响响应时间,由于上面咱们也提到了上下文切换的问题,那怎么设置线程数的呢?
那咱们如何分配线程?咱们提供一个公式:
最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目
复制代码
备注这个公式也是前辈们分享的,固然老顾看了淘宝前台系统优化实践的文章,和上面的公式很相似,不过在CPU数目那边,他们更细化了,不过无论什么公式,最终仍是在生产环境中运行后,再优化调整。
咱们继续上面的任务,咱们的服务器CPU核数为4核,一个任务线程cpu耗时为20ms,线程等待(网络IO、磁盘IO)耗时80ms,那最佳线程数目:( 80 + 20 )/20 * 4 = 20。也就是设置20个线程数最佳。
从这个公式上面咱们就得出,线程的等待时间越大,线程数就要设置越大,这个正好符合咱们上面的分析,充分利用cpu利用率。那从另外一个角度上面说,线程数设置多大,是根据咱们自身的业务的,须要本身去压力测试,设置一个合理的数值。
那咱们小伙伴们会问,由于不少业务集中到一个线程池中,不像上面的案例比较简单,事实上业务太多,怎么设置呢?这个就是要去压力测试去调整。不过咱们的前辈已经帮咱们总结了一个基础的值(最终仍是要看运行状况自行调整)
CPU密集型:操做内存处理的业务,通常线程数设置为:CPU数 + 1或者 CPU数*2。核数为4的话,通常设置 5 或 8
IO密集型:文件操做,网络操做,数据库操做,通常线程设置为:cpu数 / (1-0.9),数为4的话,通常设置 40
今天介绍了线程数大小的设置,一些小伙伴们的误区。讲到这里咱们小伙伴们是否是对线程有了更新的理解,不像以前那么粗暴,应该要去分析为何这么慢,系统的瓶颈出如今什么地方,减小瓶颈的耗时。
老顾能够推荐小伙伴们再去看一下redis、nginx;为何他们会那么快呢?其实和这篇文章的知识点有共同的地方。谢谢阅读!!!
欢迎你们在下面评论留言,后面还会持续更新更多精选文章分享,同时能够关注下官方公众号,天天都会有许多精选分享及不按期福利学习资料免费领取!