如果继续讨论餐厅服务能力的调整,这可能会成为餐饮博文。
不过,铮铮相信,在第一部分我们的讨论中,会发现有很多与服务器性能相似的概念。
正好,高大的大神
不仅开了开封料理餐厅,还经营着网站=_=!
该网站的典型事务请求链接如下。
请不要说。 和吃饭的流程很相似呢。
而且,就像多人吃饭的场景一样,这个网站也有多个用户要求:
当从客户端发起请求时,沿着上述线路传输并线性地完成。
精挑细选的大神发现,这个网站性能的关键在于APP应用服务器。 就像餐厅的服务能力,主要依赖于主厨的团队一样。
如果多个客户端同时发起请求,则服务器必须具有一定的“并行”功能。 否则,后续请求可能会排队并超时。
说起来,上图是我们画的
但是,一般来说,服务器的
有多处理器辅助超线程技术。
主流的编程语言有“多线程编程”的概念,其目的是合理地调度任务,充分利用CPU的所有处理器。
也就是说,这个APP被认为是服务本身有多位厨师在做饭。
根据处理器数量和多线程技术,可以线程化一些事务
像那样并行处理。
不过,精挑细选的大神对目前的服务器性能并不满意,与餐厅一样,精挑细选的大神也针对这种APP服务考虑了更多的调整方案。
厨师的数量真的够吗? 是否要继续增加人数(CPU核心数、服务器节点数-硬件调整)?
主厨的经验和技术足够吗? 是否雇用更资深的厨师(改变具有更高频率CPU的服务器)的硬件调整; 提高业务逻辑效率-逻辑调整?
改良受欢迎的饮食准备策略吗? (利用数据库索引、高速缓存等技术-逻辑调优)
我们强调的调谐重点、APP服务/厨师团队以外的部分也可能成为瓶颈,需要调谐解决。 例如:
餐厅的容量不能容纳排队的客人吗? (服务器容量、线程池大小、最大连接数、内存容量)
jjddp的点餐和烹饪速度是掣肘吗? (网络带宽、路由效率等。 在数据密集型服务器中,网络带宽很可能成为瓶颈。 )
等等
3 .接下来是性能测试环节
下面介绍了如何测试一组服务的性能。
线程数:
实现性能测试的必要条件之一是能够模拟高峰访问量。 这在普通的APP应用程序客户端中很难做到(例如,web APP客户端是浏览器)。 很难使用浏览器同时向服务器发送大量请求。)。
这里需要性能测试工具。 主要的性能测试工具例如
,
等同时通过在线程序运行,完成“在短时间内向服务器发送大量请求”的任务。
多线程并发测试工具xbdsc启动多个线程,每个线程独立地向服务器发出请求。
在描述性能测试过程时,此客户端的独立线程数可能表示为“并发计数”。
但是,这里的“并发”是指客户端的并发,很简单。 客户端可以提出很多请求,但服务器不一定能处理。
并行行数:
那么,服务器一次同时处理多少事务请求?
根据以前的讨论,在同一时间节点上同时处理的最大事务数是CPU处理器数量*服务器的超线程倍率。
例如,对于8核的非超线程CPU,在给定的时间节点上同时处理的事务量不会超过8个。 和8个厨师一样,同一时间点只能处理8顿饭。
超线程技术就像对厨师们进行了“左右为难”的训练,让每个人都能专心致志地处理两顿饭。
这里描述的“同时8个”事务是“并行/平行”的意思。
并发行数:
请注意,上面讨论的“并行数”不是“同时数”。 否则,直接查看CPU内核数量就可以确定并发次数。
同时数是指一定期间内的情况
的事务完成计数。 该切片“时间段”多取1秒或1分钟这样的整数进行换算。
假设一个厨师平均2分钟做完一个菜,那么8个厨师2分钟做完8个菜,换算下来就是4个/分钟。
如果以分钟为单位进行统计,这个数字就是最终的结果。
每秒的事务数(TPS ) :
典型的APP应用服务器的处理速度与主厨的烹饪不同,典型的事务请求在APP应用服务器上的处理时间是以毫秒为单位计算的。
因此,在测试性能时,经常使用“1秒”作为切片时间段。
关于每秒完成多少事务请求的数据是我们熟悉的“每秒事务数”。
将此指标翻译成英语为TPS - Transaction Per Seconds。 (有时也会用QPS - Query Per Seconds进行统计,但暂时不讨论其差异。)
每秒的事务数是衡量服务器性能的最重要和直观的指标。
每秒能完成的事务数越多,那么每分钟能完成的事务就越多,每天完成的事务数就越多 --
简单的小学数学。
那么他直接能影响到一个应用服务每天平均能承受的访问量/请求量,以及业务高峰期能承受的压力。
平均响应时间:
那么有哪些因素会影响到TPS数值?
有两个主要的维度:
单个事务响应速度
同一时间能并行执行的事务
第二点我们说了,它主要跟服务器资源配置,线程池容量,线程调度等相关。
第一点换一个说法就是:事务平均响应时间。单个事务平均下来完成的速度越快,那么单位时间内能完成的事务数就越多,TPS就越高 --
简单的小学数学。
所以在进行性能调优时,除了服务器容量资源,单个事务响应速度是另一个关注的重点。
要关注事务响应速度/时间,可以考虑在事务内部逻辑节点添加“耗时探针”的方式,来探测每个步骤分别花费的时间,从而找出可优化的部分。
吞吐量
吞吐量
是在性能探测过程中经常冒出来的名词,怎么理解他呢?
简单的结论就是,吞吐量是站在“量”的角度去度量,是一个参考指标。
但是光有“量”的数据有时候并无太大价值,一家餐厅1个小时卖出100份餐品和一个月才卖出100份餐品,单从“量”的维度衡量肯定不行,时间维度很重要!
所以,性能测试领域的吞吐量通常会结合上时间维度进行统计。
如果吞吐量的“量”以“事务”为统计单位的话,结合时间维度,转化以后可以很容换算成TPS。
4. 最后,关于性能测试的一些碎碎念
测试类型
由于测试目标的不同,性能测试可能存在很多种形式。
比如明确了解日访问量和巅峰访问量,测试服务器是否能够承受响应压力的测试。
比如用于探测系统负载极限和性能拐点的测试。
比如衡量系统在高负载情况下,长时间运行是否稳定的测试。
这许多种形式我们暂且不做讨论,不过所有以上测试的基础都是它 -- “并发测试”。
制造并发,是性能测试的基本实现办法。
进一步细化理解客户端线程数和并发量的关系
设服务器并发能力为每秒完成1个事务,即TPS=1/s。且服务器使用单核处理器,现用Jmeter启动5个线程循环进行并发测试,那么每个切片时间(每秒)都发生了什么?
我们可以用如下图表来分析:
其中,
为线程可执行(等待执行),
为线程正在执行,
表示线程执行完毕。
假设其他条件不变,增加服务器并行处理数为2(增加CPU核数为2,以及合理的线程调度机制)那么变为:
这里真实的并发数(服务器单位时间完成的事务数)就是图中每一秒钟完成的事务数。
而客户端启动的其他未处理的线程则在“排队等待”。
线程并发数量
那么制造多少并发,换言之,我应该用多少并发线程数去进行测试?
实际上客户端发起的线程数与服务器可达到的并发数并无直接关系,但你应该使用足够的线程数,让服务器达到事务饱和。
如何判断服务器是否达到饱和?这时我们可以采取阶梯增压
的方式,不断加大客户端线程数量,直到服务器处理不过来,事务频繁超时,这时就得到了服务器处理能力极限。
根据不同的测试类型,取这个极限数量的一定百分比作为客户端线程数。
比如说,负载测试中,通常取达到这个极限数值的70%。
客户端损耗
我们在讨论餐厅订单流程和服务器事务流程时,流程图里包括了顾客/客户端。
顾客点餐要不要花时间?当然要,如果他患上选择困难症,甚至有可能在下单的时候花去大量时间。
同理,客户端从启动线程到构造请求并发出,这一过程也有一定的时间损耗。
通常在测试服务器性能的时候,客户端性能是应该被剥离出去的,所以测试时应该尽量降低客户端时间损耗。
适当增加客户端线程循环次数 - 稀释这些线程启动的占用时间
当客户端线程数需要较大数量时(对jmeter而言,超过1000左右),客户机/测试机的资源占用会增大,整个客户端的请求构造时间会拉长。应该考虑分布式测试。
尽量减少客户端请求构造时间,比如beanshell请求加密,如果过程过于复杂也会耗去可观时间。极限测试情况下应考虑简化。
那么本文到这里告一段落。
希望能帮助理解性能测试领域的这些关键概念和原理
。