后端开发都应该了解点接口的压力测试(Apache Bench版)

背景

小A:小B,最近调你的接口老是超时呀,8秒都还没返回结果,是不是有性能问题呀!

小B :我看看~~

类似这样的对话,在现实中是时有发生的,不是特别严重的话,往往大家也不会去重视这个事。

尤其是在一些测试资源并不完备的,开发人员对性能测试没有接触过的一些公司,遇到这些会显得更加力不从心。

本着对自己写出来的东西负责,上线之前,我们都应该对自己的接口进行一个简单的压力测试。

其实做这一步也是为了让我们心里有个度,有个底,不至于说连能承受多少量都不知道。如果什么都不知道,那很容易陷入一个无底深渊,这是一件很可怕的事情。

老黄平时用的比较多的是Apache Bench,当然,jmeter、wrk和vegeta也都是非常不错的。

说说用这个的原因吧,免安装,绿色版,开箱(解压)即用,说白了,老黄其实就是懒鬼~~

jmeter要装jdk,懒得弄。

wrk/wrk2 要自己编译,mac上面可以直接安装,但是我的mac配置不高,不折腾。

vegeta用起来感觉不是很顺手,后面再慢慢挖掘。

Apache Bench 介绍

Apache Bench 是Apache服务器自带的一个web压力测试工具,简称ab。

ab是一个命令行工具,对发起负载的本机要求很低,根据ab命令可以创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问,因此可以用来测试目标服务器的负载压力。总的来说ab工具小巧简单,上手学习较快,可以提供需要的基本性能指标,但是没有图形化结果,不能监控。

ab进行的测试的本质是基于HTTP协议,可以理解为对web服务器软件的黑盒性能测试,获得的一切数据和计算结果,都是可以通过HTTP来解释的。

Apache Bench 简单使用

下面的示例都是在CentOS上面的。

通过下面的命令安装,

yum -y install httpd-tools

装好之后,运行一下ab -V就可以看到版本信息。

ab -V

This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

运行一下ab -h就可以看到帮助信息。

帮助信息有很多,也比较详细,老黄把一些常用的参数都添加了注释,方便大家查看。

其中最常用的两个参数是 -c-n,当然如果是POST/PUT请求的话,还离不开 -T-p

说了不少废话,来看看怎么使用才是重点。

下面准备了两个简单的接口来进行演示

[ApiController]
[Route("test")]
public class TestController : ControllerBase
{
    [HttpGet]
    public string Get() => "GET";

    [HttpPost]
    public string Post([FromBody]string value) => value;
}

这个接口是跑在docker里面的(一台2c4g的活动云服务器),下面的图可以看到具体的信息,还有两个接口的访问详情。

先来压一下GET请求的接口, 200并发,5000个请求。

ab -c 200 -n 5000 localhost:9000/test

POST请求有点不一样,要先准备一下body的参数,这里在/tmp目录创建了一个post.json文件,里面就一个字符串。

cat /tmp/post.json
"Post"

在压测命令里面,指定Content-Typeapplication/json, 参数的数据文件路径是/tmp/post.json

同样也是200并发,5000个请求。

ab -c 200 -n 5000 -T "application/json" -p /tmp/post.json localhost:9000/test

到这里,大家对怎么压测,应该都不会太陌生了,比较陌生的应该是压测的结果要怎么看。

下面拿其中一个结果示例来说明各项指标的含义:

Server Software:        Kestrel  # 服务器软件名称
Server Hostname:        localhost  # 服务器主机名
Server Port:            9000  # 服务器端口

Document Path:          /test  # 测试的URL路径
Document Length:        3 bytes  # 文档大小

Concurrency Level:      200  # 并发数
Time taken for tests:   2.386 seconds  # 消耗的总时间
Complete requests:      5000  # 总次数
Failed requests:        0  # 失败的请求数
Write errors:           0  # 网络连接写入错误数
Total transferred:      680000 bytes  # 传输的总数据量
HTML transferred:       15000 bytes  # HTML文档的总数据量
Requests per second:    2095.43 [#/sec] (mean)  # (平均每秒的请求数) 这个是非常重要的参数数值,服务器的吞吐量
Time per request:       95.446 [ms] (mean)  # (所有并发用户都请求一次的平均时间)
Time per request:       0.477 [ms] (mean, across all concurrent requests)  # (单个用户请求一次的平均时间)
Transfer rate:          278.30 [Kbytes/sec] received   # 每秒获取的数据长度 (传输速率,单位:KB/s)

# 网络上消耗的时间的分解
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    3   3.7      2      20
Processing:    12   68 120.0     53    1057
Waiting:        1   67 120.1     52    1050
Total:         15   71 119.8     55    1058

# 整个场景中所有请求的响应情况
Percentage of the requests served within a certain time (ms)
  50%     55
  66%     63
  75%     68
  80%     71
  90%     77
  95%     88
  98%    105
  99%   1012
 100%   1058 (longest request)

这么多的指标,我们可以重点关注下面几个

  1. Requests per second
  2. Failed requests
  3. 90%,95%和98%的响应时间

第一个是吞吐量,这个上不去,其实是挺尴尬的。

第二个是失败的请求数,这个数要尽可能的低,最好是0,没有失败的。设想一下,100个请求,80个都是失败的,这个结果还能有意义不。

第三个是响应时间,这个可以看到大部分请求的速度如何。

进行压测时的一些小建议:

  • 压测尽可能让并发数从低往高慢慢递增,避免一开始就设的太大,一个比较好的参考依据是现在阶段线上环境的并发数
  • 压测的持续时间可以持续久一点,这样可以看到更多可能出现的情况,可以考虑5分钟,8分钟,15分钟等
  • 有条件的,压测和被压测的机器要独立,因为压测的时候也会有资源占用,可能会影响被压测的接口
  • 不要只看压测的结果数据,还要留意被压测机的cpu,内存等指标在压测时是否正常
  • 内网压测的效果达到预期后,再考虑外网的,网络因素,可控性不强

分布式压测和全链路压测,暂时不用想了,留给更专业的人去做吧~~

原文地址:https://www.cnblogs.com/catcher1994/p/12550056.html

时间: 2024-11-10 13:32:18

后端开发都应该了解点接口的压力测试(Apache Bench版)的相关文章

前端开发和后端开发都是干什么的?有哪些区别?

前端开发和后端开发都是干什么的?有哪些区别?通俗地讲,前端干的工作是用户可以直接看得见的,而后端开发的工作主要在服务端,用户不太能直接看到.虽然前端开发和后端开发的工作有巨大的区别,但是他们的工作都是相辅相成的,都是为了更好的用户体验. 1.前端开发: 网站的“前端”是与用户直接交互的部分,包括你在浏览网页时接触的所有视觉内容--从字体到颜色,以及下拉菜单和侧边栏.这些视觉内容,都是由浏览器解析.处理.渲染相关HTML.CSS.Java 文件后呈现而来.前端开发,就是要创造上面提到的网站面向用户

关于url请求和json数据的响应的理解和接口的压力测试

原来,请求只是个地址,一般用GET获取,并没有发送json包过去, 是服务器返回json包回来,然后开发接收之后,把json包解析, ("请求了一个json包"这句话真的让我误会了好久), 实际上BS或者CS架构的东西,就是一个来回,request和response, 一般来说,接口(包含参数+地址等)就是一个request, 而正确的request之后,服务器会返回一堆数据包,这个过程叫response, 数据包一般都是json包,把json包解析加上前端各种标签的排列, 就可以看到

LoadRunner 如何进行接口的压力测试

主要压测的时候需要开发提供相关接口文档,或者自己录制.左侧的Name都是开发提供的接口参数名称,Value是相应的参数值.Action为开发给的测试地址.PS:注意在测试的时候设置Controller的Run time seting  Pacing的值为With a fixed delay of X seconds.还要注意在压测的时候观察服务器的CPU利用率已经内存使用情况. web_submit_data("insert",                "Action=

使用COSBench工具对ceph s3接口进行压力测试

一.COSBench安装 COSBench是Intel团队基于java开发,对云存储的测试工具,全称是Cloud object Storage Bench 吐槽下,貌似这套工具是intel上海团队开发的,竟然没有中文的相关资料. 同所有的性能测试工具一样,COSBench也分控制台和发起请求的driver,且driver可以分布式部署.可以支持swift.s3.Openstack等接口 1. 下载COSBench工具 下载地址为:https://github.com/intel-cloud/co

Jmter接口网站压力测试工具使用记录

1.首先下载Jmeter 官方地址:http://jmeter.apache.org/ 2.安装Jmeter 把下载的文件进行解压,产生如下目录: 打开bin文件夹下的jmeter.bat文件及进入程序的主界面窗体jmeter.log是日志文件. 主意:需要配置java环境. 3.jmter创建一个基本的测试 首先选中测试计划=>右键=>添加=>Threades(user)=>线程组,如图: 选中之后会出现线程的设置界面,设置名字,线程数,启动时间,循环此说等. 4.创建请求 创建

【性能测试】针对部分接口进行压力测试

转自:https://www.cnblogs.com/haochuang/p/7753334.html JMeter中的部分配置如下: 参考:http://blog.csdn.net/zhujianing1993/article/details/51445912 Apache Jmeter发送post请求:http://blog.csdn.net/u010786672/article/details/25370447 Jmeter测试并发https请求:http://blog.csdn.net/

使用Loadrunner进行http接口压力测试

业务描述: 在业务系统里进行查询操作,查询的结果是通过请求http接口,从系统中处理并将结果以json字符串返回. 本文就讲述使用Loadrunner对此类接口进行压力测试并记录相关的性能指标数据: 一.安装Loadrunner 本次测试过程使用Loadrunner 11.0版本. 二.部署环境 1.接口服务器一台; 2.用于运行Loadrunner的压力测试机1台或N台 ,在条件允许下,尽可能提供高配置的CPU 和内存. 3.接口服务器和压力测试机建议应部署于同一个局域网内,否则测试过程和结果

记一次接口压力测试与性能调优

〇.经验总结 1.如果总的CPU占用率偏高,且基本都被业务线程占用时,CPU占用率过高的原因跟JVM参数大小没有直接关系,而跟具体的业务逻辑有关.2.当设置JVM堆内存偏小时,GC频繁会导致业务线程停顿增多,TPS下降,最后CPU占用率也低了:3.当设置JVM堆内存偏大时,GC次数下降,TPS上升,CPU占用率立刻上升.4.Dom4J 这个xml解析工具性能很强大,但在处理节点和层级都较多的xml文本时,整体解析效率依然会成为业务处理瓶颈. 一.背景说明 最近新项目上线,需要对项目中的一个HTT

Postman接口&amp;压力测试

Postman接口与压力测试实例 Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件.它提供功能强大的 Web API & HTTP 请求调试. 1.环境变量和全局变量设置 环境变量可以使用在以下地方: URL URL params Header values form-data/url-encoded values Raw body content Helper fields 先设置好变量名及数值后,接下来就可以调用环境变量名,例如: key对应的values,填写