在云服务上做接口压测心得总结

最近在某云服务上做了一次接口压测,发现了许多需要注意的点,整理一下,备忘。在下非专业测试人员,欢迎指正:

 

一、基准环境准备

准备一套知根知底基准的环境,用于和云服务上的虚机做对比,让自己可以做到心中有数。可以是虚机。注意两套环境尽量保持一样的基本配置,如cpu性能、内存大小。

 

二、测试工具准备

压测应该从基准测试开始,分三个维度展开。

硬件基准测试:主要包括CPU性能、内存读写性能、磁盘读写性能、网络读写性能和带宽,可选的工具如sysbench、fio等

中间件基准测试:如redis、kafka、mysql等,此类中间件网上基本可以通过关键字【中间件名 benchmark】搜到对应的工具

框架和业务程序压测:框架即所用到的研发框架,程序代码剥离了业务处理后的部分。这里我们主要是http方式访问的接口,用到的主要是jmeter、Apache Benchmark、wrk

其中前两个基准测试主要用来调整硬件环境,发现可能存在的环境问题;框架压测可以用来发现研发框架的一些潜在性能问题。

 

三、测试方法和注意事项

1、关注服务端:压测是为了找出瓶颈,这个瓶颈可以是cpu的性能(计算)、网络和磁盘(IO)性能等环境上的,也可以是程序的业务逻辑上的。不论如何,压测时一定要将服务端的硬件使用情况监控起来

2、关注客户端:压测时注意客户端的资源如cpu、带宽等是否已经到了上限,如果到了上限应该及时提升配置,或者做客户端集群(jmeter集群需要大量的带宽用来同步每个agent的压测结果,需要格外注意),最后,还要特别留意你的客户端脚本性能有没有问题。

3、关注程序业务逻辑:对于业务程序,首先需要梳理接口的整体逻辑,比如在什么情况下进行了几次IO

4.1、善用排除法为结论背书:排除法也是压测过程中一个重要的手段,如果基本推断到某个地方非常影响性能,可以通过一些手段跳过这个地方的执行,看看性能是否能上来,以此证明你的结论。

4.2、为你的想法背书,而非想当然

比如,对于网络——如果你认为你压测过程中使用的是HTTP长连接(keepalive),那么你关注服务端和客户端的各种状态的TCP连接数,确定真的是长连接;

比如,如果你认为硬件越多性能越高,那一定要通过压测证明一下,如,同时A压B,C压D,两个压测结果的和是不是单独A压B的两倍

另外,有一些东西是公论则可以不必去费功夫,因为已经有很多人在很多文章中为你背书了——比如kafka的磁盘顺序写等。

5、确保压测环境不被干扰:在云服务上压测,请确定你的服务器资源是独享型,否则压测基本没有什么意义。

6、压测报告务必详细:压测报告不只是给别人看的,更是你自己的工作证明,要详细的罗列用到的硬件,什么环境,压测过程中各个指标的状态,在各种参数情况下程序的吞吐量,压测报告直接反应了一个人的能力,因为你能力越强,你看到的关键参数越多。

打个比方,从前我只关心cpu和内存,所以我做的压测报告里会有这些数据;后来我了解了HTTP长短连接的区别、网络等知识,报告内容有所增加;再后来我发现磁盘也会成为某些程序的瓶颈,磁盘IO也成了压测报告中的内容……

 

四、一些主观观点

1、压测以及压测结果分析非常考验一个人的综合能力,包括知识面、分析问题的能力、对整体架构的掌握程度以及对用到的各个中间件的原理的掌握等,绝非简单跑个脚本就完事。

2、我相信在压测这个事上,不管一个人的能力多么强都是不够强的,知识多么多都是不够用的,一定要量力而为。

3、只要通过一定的努力,提高了程序的性能,那就是有效果的,如果追求完美那么时间多半是不够用的。

 

(实战内容有时间再补充吧,完毕)

 

补充,实践得出的真知:

一个系统的吞吐,取决于用到的所有中间件的基准测试得出的吞吐能力的最小值,并且不会达到这个最小值。

得出结论,一定要有证据支撑。

 

2020年10月23日补充

网络延迟在一些同步阻塞场景下,也会对性能造成比较大的影响,现象就是cpu、磁盘、带宽等 都没有达到瓶颈,但是性能却上不去,这种,只能提高并发数来提高利用率。

 

2020年10月24日

java,c和redis

客户端:对于一个连接java每秒能发的请求数量和c发请求的能力不一样

服务端:redis连接数越多性能越低

所以当客户端java向服务端redis发请求时,连接数存在一个最优值,高或者低性能都不是最高点

所以redis-benchmark和jedis压测结果不一致

 

posted @ 2020-10-09 13:53  剑握在手  阅读(81)  评论(0编辑  收藏  举报
返回顶部↑