2018年(273)
分类: 大数据
2018-06-28 15:51:56
“性能优化“相信是每个程序员都关心的问题,在实际工作中也常会对系统做优化。关于性能优化有两个问题很值得探讨:
至于WHAT,我认为是不言而喻的,性能优化的终极目标只有两点:QPS和RT,可以说所有优化最终都是为了这两个指标。
本文讨论的核心内容是几个与性能相关的公式,比如QPS公式、RT公式、线程数公式等。熟悉这几个公式能让我们抓住系统性能的底层逻辑,有助于在实践过程中对症下药。这些公式在一些性能相关的书籍里都有出现,公式提供了很好的理论支持,但关于如何实践的文章并不多。
本文先对公式进行简单推导和验证,熟悉的同学可以跳过这部分。
PS:个人水平有限,难免出现纰漏,欢迎指正。
本小节对几个核心公式进行简单推导,帮助尚不太了解的同学弄清来龙去脉。
前文提到,QPS和RT是性能优化的终极目标。其中QPS(Query per second)描述了单位时间内系统的吞吐量,而RT长短则反应了接口响应速度。提升QPS能帮助我们利用更少的机器资源扛住更多的流量,而降低RT能提升用户体验。
在单线程下,这个公式永远正确。而我们的系统都是多线程的,所以我们需要知道多线程的QPS如何计算。
很简单,就是单线程的QPS * 线程数:
可以看到,多线程下的QPS和两个因素相关:RT和线程数,接下里分别讨论下RT和线程数。
RT一般可分为客户端RT和服务端RT,客户端RT包含浏览器发出请求—》服务器处理—》请求报文返回三个阶段。
两者关系如下:
客户端RT = 服务端RT + 2*网络耗时
网络耗时可以通过CDN、专线等方式减小,我们重点关注下服务端RT。
一个请求打到服务器上,会由一个线程来承载,同步模型下,而线程从创建到退出的过程,就是一次请求的处理过程。而线程从创建到退出的状态流转,涉及到多线程的调度,这里简单说明下线程的调度。
线程调度
在Linux/Windows上,从JDK1.2开始,JVM线程直接绑定一个内核线程(1:1模型),由系统内核的调度器来调度,在内核看来,内核线程和进程没有区别。对于java这类非实时进程,Linux的调度策略是基于优先级的抢占式调度