上下文切换的过程是需要时间的;现在我们再来看一下上面的问题,我们小伙伴们再看一下是哪个方案快呢?是不是有些小伙伴们会说方案一,因为不需要线程切换。先不急,再往下看
为什么要多线程
按照上面的说法,有线程的上下文切换耗时,那么为什么需要多线程呢?小伙伴会不会感觉很乱,怎么回事?
小伙伴想想在我们真实业务中,我们是什么流程?
上图的流程:
1、先发起网络请求
2、web服务器解析请求
3、请求后端的数据库获取数据
4、获取数据后,进行处理
5、把处理结果放回给用户
这个是我们处理业务的时候,常规的请求流程;我们看一下整个过程涉及到什么计算机处理。
1、网络请求----->网络IO
2、解析请求----->CPU
3、请求数据库----->网络IO
4、mysql查询数据----->磁盘IO
5、mysql返回数据----->网络IO
6、数据处理----->CPU
7、返回数据给用户----->网络IO
小伙伴们是不是感觉又不乱了,在真实业务中我们不单单会涉及cpu计算,还有网络IO和磁盘IO处理,这些处理是非常耗时的。如果一个线程整个流程是上图的流程,真正涉及到CPU的只有2个节点,其他的节点都是IO处理,那么线程在做IO处理的时候,CPU就空闲出来了,CPU的利用率就不高。
小伙伴们现在知道多线程的用处了吧,对,就是为了提升CPU利用率。
提升QPS/TPS
衡量系统性能如何,主要指标系统的(QPS/TPS)。
QPS/TPS:每秒能够处理请求/事务的数量
并发数:系统同时处理的请求/事务的数量
响应时间:就是平均处理一个请求/事务需要时长
QPS/TPS = 并发数/响应时间
也就是并发数越大,QPS就越大;所以很多人就会以为调大线程池,并发数就会大,也会提升QPS,所以才会出现一开始前言所说的。其实QPS还跟响应时间成反比,响应时间越大,QPS就会越小。
虽然并发数调大了,就会提升QPS,但线程数也会影响响应时间,因为上面我们也提到了上下文切换的问题,那怎么设置线程数的呢?
如何设置线程数
那我们如何分配线程?我们提供一个公式:
最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目
备注这个公式也是前辈们分享的,当然老顾看了淘宝前台系统优化实践的文章,和上面的公式很类似,不过在CPU数目那边,他们更细化了,不过不管什么公式,最终还是在生产环境中运行后,再优化调整。
总结
在这里,由于面试中MySQL问的比较多,因此也就在此以MySQL为例为大家总结分享。但是你要学习的往往不止这一点,还有一些主流框架的使用,Spring源码的学习,Mybatis源码的学习等等都是需要掌握的,我也把这些知识点都整理起来了,有需要的朋友可以**【转发+关注】后点击这里免费领取!**
-p7)**
[外链图片转存中…(img-UTt0mM2C-1628234999476)]