http接口性能测试

Posted 遇见程序

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了http接口性能测试相关的知识,希望对你有一定的参考价值。

 虽然话是说能开多一台机器就能解决的性能问题,那就不是性能问题。但是实际上,如果性能不达标,就算开再多的机器,它依然是个问题。因为你不知道它什么时候会爆发,在此同时,你还得承担多开一台机器带来的代价。


性能测试是有必要的,我经历过多家公司,都不重视性能测试这块,都觉得现在的云主机太便宜了。我觉得从事服务器相关的内容中,需要重视性能测试。


性能测试的用意是: 观察应用在特定的环境中的性能表现是否和预期的目标一致,通过这个过程来判断应用是否存在性能缺陷,识别性能瓶颈。


性能测试大概可以分为


基准测试:基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试(来源于百度百科)。框架级,主要是基准性能数据(后续会记录)

负载测试:对业务请求逐渐增长,以此来发现应用吞吐量。

压力测试:对单体应用,某一特定业务,持续高负载下,获取应用瓶颈,应用极限。

混合场景测试:主要针对的整个系统,混合不同的业务,受限的资源,验证整个系统稳定性。


性能测试指标



1. 时间特性

  1. 响应时间(Response Time: RT),一般以毫秒计,不同的业务可接受的响应时间不同,值越小越好。

  2. 时间窗口:整个性能测试过程的时间,不同的数据量时间不一样。


2. 系统处理能力

  1. 每秒系统处理事务数TPS(Transaction per Second)。

  2. 每秒查询数QPS(Query per Second)。


3. 资源利用率

  1. CPU

    CPU指标主要指的CPU使用率利用率,包括用户态(user)、系统态(sys)、等待态(wait)、空闲态(idle)。CPU 利用率要低于业界警戒值范围之内,即小于或者等于75%;CPU sys%小于或者等于30%, CPU wait%小于或者等于5%。单核CPU也需遵循上述指标要求。CPU Load要小于CPU 核数。

  2. Memery

    主内存不能占用过高,需要预留部分,还有就是需要额外光绪虚拟内存交换(swap)利用率,swap利用过高,太多虚拟内存交换也会引起系统性能低下。

  3. 磁盘吞吐量(Disk Throughput)

     磁盘指标主要有每秒读写多少兆,磁盘繁忙率,磁盘队列数,平均服务时间,平均等待时间,空间利用率。

  4. 网络吞吐量(Network Throughput)

    网络吞吐量是指在无网络故障的情况下单位时间内通过的网络的数据数量。单位为Byte/s。网络吞吐量指标用于衡量系统对于网络设备或链路传输能力的需求。

  5. 内核参数

    操作系统内核参数,一般是保持在预设的范围内即可。要优化这一步了整个系统性能也差不多哪去了。


4. 并发用户数(Virtual User: VU) 

    并发用户数指在同一时刻内,登录系统并进行业务操作的用户数量


5.服务可靠性

  1. 错误率

    指系统在负载情况下,失败事务的概率。错误率=(失败交易数/交易总数)*100%。稳定性较好的系统,其错误率应该由超时引起,即为超时率。

  2. 响应分布


6.Java 特有的


指标 单位 解释
GC频率 每秒多少次 java虚拟机垃圾部分回收频率
Full GC频率 每小时多少次 java虚拟机垃圾完全回收频率
Full GC平均时长 用于垃圾完全回收的平均时长
Full GC最大时长  秒 用于垃圾完全回收的最大时长
堆使用率 百分比  堆使用率

可以通过jvm参数采集GC信息。

  # jvm > 8   -Xlog:gc*:$LOG_DIR/gc_${APP_NAME}_%p.log:time,level,tags  -Xlog:gc+heap=trace:$LOG_DIR/heap_${APP_NAME}_%p.log    # jvm =8 -Xloggc:$LOG_DIR/gc_${APP_NAME}_%p.log  -XX:+PrintGCDetails -XX:+PrintGCTimeStamps  -XX:+PrintGCApplicationConcurrentTime   -XX:+PrintGCApplicationStoppedTime  -XX:+PrintHeapAtGC


gc日志分析工具很多,很容易能得到想要的结果。


测试工具选择


        在做性能测试的时候,主要关注时间特性,系统处理能力,并发用户数,和服务可靠性。至于资源利用率,就交给监控吧。

        根据我的喜好,压力测试选用工具wrk,负载测试和混合场景测试选用locust。选择这2个工具的主要是因为其简单,而且又能达到我想要的目的。

wrk


        wrk 的一个很好的特性就是能用很少的线程压出很大的并发量. 原因是它使用了一些操作系统特定的高性能 io 机制。是做单点压力测试的理想工具,可以轻易的获取应用极限,但是它能做的远远不止于此,它可以通过lua扩展,基本上也算是可以做到随心所欲了。缺点就是目前只支持http协议,如果要做其它协议的负载测试,需要自己改源码实现。


注意wrk的线程不适宜太多,一般就CPU~2*CPU数量线程数。


gitee镜像:https://gitee.com/zhouho/wrk.git


sudo apt install lua5.3git clone https://github.com/wg/wrk.gitcd wrk/ && make -j8./wrk -c 200 -d 120 -t 8 --latency http://localhost# 使用200个连接,8条线程,运行压力测试120秒
# 参数说明# -c, --connections 打开的连接数 # -d, --duration    测试时长           # -t, --threads     使用的线程数                       # -s, --script      加载Lua脚本       # -H, --header      添加HTTP请求头      #     --latency     打印耗时统计(包含标准差)   #     --timeout     超时时间     # -v, --version     打印版本信息,并退出 
## 示例wrk -c 200 -d 30 -t 8 --latency http://www.baidu.comRunning 30s test @ http://www.baidu.com  8 threads and 200 connections  Thread Stats   Avg      Stdev     Max   +/- Stdev    Latency   244.58ms  245.06ms   1.99s    89.44%    Req/Sec   111.53     44.56   425.00     81.30%  Latency Distribution     50%  145.42ms     75%  349.59ms     90%  501.70ms     99%    1.21s  24411 requests in 30.06s, 363.78MB read  Socket errors: connect 0, read 27, write 0, timeout 204Requests/sec:    812.12Transfer/sec: 12.10MB




结果解析:


QPS:812.12

网络吞吐量: 12.10MB/s,总共363.78MB

错误率:0.8356%


统计值:


指标 均值 标准差 最大值 正负标准所在比例
RT  244.58ms 245.06ms  1.99s  89.44%
QPS 111.53  44.56 425.00 81.30% 


耗时分布:

  50%  145.42ms

  75%  349.59ms

  90%  501.70ms

  99%    1.21s


根据测试结果,很容易获取系统的的极限。(baidu 这个仅仅是个示例,并不能代表其极限)


 locust



        locust是一块python写的压力测试工具。可以用python代码定义用户行为,locust支持多台机器进行分布式负载测试。可以当做一个python库使用,扩展非http协议,相对wrk会简单很多。并且其带有一个简单的WebUI。熟悉python的会事半功倍。相对wrk较完善,但整体性能会稍微低点。用这工具的时候需要额外注意系统配置中的max_open_file,如果你虚拟用户比较多的情况下,需要将这个值调到大于你的虚拟用户数` ulimit -n`可以查看当前允许最大打开的文件数,临时设置` ulimit -n 102400`,永久设置,需要修改`/etc/sysctl.conf`


官方示例:


from locust import HttpUser, task, betweenclass QuickstartUser(HttpUser):    wait_time = between(1, 2)    def on_start(self):        self.client.post("/login", json={"username":"foo", "password":"bar"})    @task    def hello_world(self):        self.client.get("/hello")        self.client.get("/world")    @task(3)    def view_item(self):        for item_id in range(10): self.client.get(f"/item?id={item_id}", name="/item")


官方示例结果:



具体使用可以参考其文档。建议将其当做库使用。


    https://locust.io/

    https://github.com/locustio/locust.git

    https://gitee.com/zhouho/locust.git


gatling 



        Gatling是一款基于Scala 服务器性能测试工具,有脚本录制功能。目前为止还未深入了解,Gatling比较完善,应该是后期考虑集成的工具。


    https://gatling.io/

    https://github.com/gatling/gatling.git

    https://gitee.com/zhouho/gatling.git



其它性能测试工具


Perf:

        perf是一款Linux性能分析工具。不仅可以分析应用程序的性能,也可以分析内核的性能。


Apache JMeter(开源):


阿里云PTS(商业版):



更多的测试工具可以自行搜索。


性能测试的工具比较多,商业工具提供的功能比较齐全,报表也比较好看。别挑花了眼,根据自己的实际需求来挑测试工具。合适的才是最好的。

以上是关于http接口性能测试的主要内容,如果未能解决你的问题,请参考以下文章

Loadrunner测试http接口的性能

使用Jmeter进行http接口做功能性能测试

JMeter之Http协议接口性能测试

http接口性能测试

使用Jmeter进行http接口性能测试

参数为json格式的HTTP接口性能测试