PS:自己在公司的一个分享总结,贴到blog里。

   先说说一些理论的公式:

   最佳线程数:

   很多资料上有讲N+1,或者N-1,这两种情况在保证线程持续运行的情况,也许可

以适用;但是在时间的应用场景中,一个业务的处理,线程不可能一直处理运行状

态,比如当调用外部WS,或者DB操作时,都有可能存在IO阻塞,在这段时间线程是没

有运行的,因此如果只是按照核数确定线程数,不太合理。

   

   请求响应时间(线程执行总时间):

   一个请求开始到结束的总时间,也就是一个线程执行的总时间,包括线程在CPU上

运行的时间+线程阻塞等待的时间。

 

   资源占用时间:

   首先要搞明白,何为资源?很多人第一个想到的肯定是CPU,性能优化的核心问题

是:哪里有性能问题?那些资源有性能问题。并发情况下,资源的抢占是影响性能的

主要原因。

   在某些业务场景,CPU是主要的瓶颈资源,业务执行,占用了大量的CPU运

算时间,并发请求主要在等待CPU的调度执行,因此,此时,CPU为瓶颈资源,资源占

用时间=业务在CPU上运行的时间。

   还有的场景,在等待稀有的共享资源,比如数据库连接,或者数据库锁。比如锁

为昂贵的稀缺资源,锁具有互斥排他性,一个线程占据锁,其他线程必须阻塞等待,

此时并发性能受到严重的影响。因此,此时,锁为瓶颈资源,资源占用时间=业务在

锁独占时间。

   还有的场景,调用外围时,外围的响应时间较长,这种情况也造成QPS较低,外围

响应时间较长,如果没有很好的超时机制,会带来比较严重的后果。单纯的增加线程

池数量,或者等待队列的长度,可以提高应用的吞吐量,但是可能有很大的负载压

力。

 

   资源并行数:

   同一个时间点,可以并发执行的请求数。比如CPU场景下,并行数=CPU核数;锁独

占的情况下,如果共享资源一个,那么并行数=1。

 

   最佳线程数 = 线程执行总时间 / 资源占用时间 * 资源并行数

   QPS = 最佳线程数  * 1000 / 线程执行总时间

   QPS = 1000 / 资源占用时间 * 资源并行数

 

   性能优化远没有PPT中说的那么简单,这里只是想说明下QPS相关的一些影响要

素。QPS的计算公式也只是理论上的,在实际的案例中肯定是低于理论值:比如一个

应用,如果user cpu使用率已经到了80%左右,sys cpu已经15%左右,一般此时已经

就到达应用的瓶颈,在增加流量,就可能造成应用出现QPS不增反降的情况,甚至造

成崩溃。

   有的应用,通过增加压力,QPS不上升,CPU占用也不高,说明性能瓶颈不在CPU上

单纯的增加CPU是无效的。

闲谈性能优化之QPS_性能优化

闲谈性能优化之QPS_性能优化_02

闲谈性能优化之QPS_性能优化_03

闲谈性能优化之QPS_性能优化_04

闲谈性能优化之QPS_QPS_05

闲谈性能优化之QPS_QPS_06