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数目那边,他们更细化了,不过不管什么公式,最终还是在生产环境中运行后,再优化调整。
我们继续上面的任务,我们的服务器CPU核数为4核,一个任务线程cpu耗时为20ms,线程等待(网络IO、磁盘IO)耗时80ms,那最佳线程数目:( 80 + 20 )/20 * 4 = 20。也就是设置20个线程数最佳。
从这个公式上面我们就得出,线程的等待时间越大,线程数就要设置越大,这个正好符合我们上面的分析,充分利用cpu利用率。那从另一个角度上面说,线程数设置多大,是根据我们自身的业务的,需要自己去压力测试,设置一个合理的数值。
基础常规标准
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
领取!(备注Java)**
[外链图片转存中…(img-rJjAwI1S-1710926869068)]