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是无效的。