文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何使用ab工具对服务器进行API压力测试

2023-06-22 00:39

关注

本篇文章为大家展示了如何使用ab工具对服务器进行API压力测试,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

1 系统吞吐量的简单介绍

一个系统的吞度量(承压能力)与request对CPU的消耗、外部接口、IO等等紧密关联。

单个reqeust 对CPU消耗越高,外部系统接口、IO影响速度越慢,系统吞吐能力越低,反之越高。

系统吞吐量几个重要参数:TPS、并发数、响应时间

TPS= 并发量/平均响应时间

这里因为说的事务如果是单一接口请求,我们也可以认为TPS即为QPS。

下面举例说明:

比如3000个用户(并发量)同时访问待测试接口,在用户端统计,3000个用户平均得到响应的时间为1188.538ms。所以TPS=3000/1.188538s= 2524.11 q/s。

我们就可以这样描述本次测试,在3000个并发量的情况下,TPS为2524.11,平均响应事件为1188.538ms

Tps:在实际测试中表现为:

一个系统吞吐量通常由TPS、并发数两个因素决定,每套系统这两个值都有一个相对极限值,在应用场景访问压力下,只要某一项达 到系统最高值,系统的吞吐量就上不去了,如果压力继续增大,系统的吞吐量反而会下降,原因是系统超负荷工作,上下文切换、内存等等其它消耗导致系统性能下降。

实际表现为tps即先上升后下降,我们需要找到性能拐点。并得到限制瓶颈。

2 测试方法

参考文献(详细输出说明):

https://www.yisu.com/article/231492.htm

2.1 客户端测试工具

我们采用apacheBench 工具进行测试。

ubuntu安装ab:

sudo apt-get install apache2-utils

linux默认登录端口只能打开1024个文件,因为在linux一切皆文件,所以ab并发数受到整个打开文件数的限制,需要使用ulimit -n 10000(打开文件数)进行修改后才能支持较大的并发。本人测试修改到15000。

2.1.1 GET方法

ab -n 100 -c 100 https://www.baidu.com/index.html

-n:请求 总数

-c:并发用户数.

-url:待测api。

当测试发起请求数量较少,完成较快,无中间过程显示。在请求数量很多时会分行显示当前完成数量。

2.1.2 POST方法
ab -n 10 -c 1 -T 'application/x-www-form-urlencoded'  -H "Authorization:Bearer 2393d8db9b9d7f4b9d1570cc8776bca69b421b62"  -p ./post http://172.28.28.17:3017/oauth3/token
2.1.3 测试结果解读

来份ab的测试输出:

如何使用ab工具对服务器进行API压力测试

ab -n 10 -c 2 上图结果为总请求10 并发为2的结果

我们主要关注的输出信息为:

其中我们最为关注的为Requests per second: 即tps。我们将它最为服务器性能最为重要的指标。

2.2服务器端检测方法

可以通过 iftop命令和nethogs -d 对服务器网络情况进行检测。

可以通过iptables命令监控服务器端口流量。

可以通过 top | grep “node” 对内存和cpu进行判断。

对云上测试 可以使用云主机后台,但后台参数是分钟级后的平均值。

感觉好像这样测优点蠢

3 实际测试

使用apacheBench 可以使用编写shell脚本进行多次测试。可以将待测api 放入api数组并修改循环数量,实现一次测试多个api并生成关键参数xls文件。现在看来还是原来太天真才会有这种想法。

3.1 shell脚本

使用说明:a 是请求总数 ,b是并发用户数一一对应,即a[0]对应b[0],传入参数第一个是待测api服务器地址,第二个是api所需参数。api设置在api数组中。添加多个api 或同意api多组测试请修改循环计数。

echo "you maybe use this sh like:"$0" serverIP userParam"a=(1000 2000 4000 6000 7000)#待测请求总数b=(50 100 200 300 400)#并发用户数runTime=$(date +%Y%m%d%H%M%S)if [ -z "$1"]thenserverip="http://127.0.0.1"elseserverip=$1fiif [ -z "$2"]thenparam="deviceid=XXX&bindingplatform=XXX&bindingid=XXX"elseparam=$2fifilename=${runTime}"-test.log"touch filename#api=('XXX'${param} 'XXX'${param} '/users/account')api=('XXX'${param})echo "********webserver test info*************"echo "testTime :"$(date) echo "LogName  :"${filename}echo "serverIP :"${serverip}echo "userparam:"${param}echo "********webserver test info*************" #echo ${filename}for j in {0..0}#待测api个数 即api数组数doecho "API test:"${serverip}${api[j]}for i in {0..4}#待测api测试次数 5次也就是对应a b数组有个五个值doab -r -k -n ${a[i]} -c ${b[i]} -C ${param} ${serverip}${api[j]} | grep -e"Document Path:" -e "Complete requests:" -e "Concurrency Level:" -e"Failed requests:" -e"Time taken for tests:" -e "Requests per second:" -e "Time per request" -e"Total transferred: " >> ${filename}donedonesed -i 's/^.\{24\}//g' ${filename}# 按照时间生成txt文件 并按上面的参数进行提取。export LD_LIBRARY_PATH=./change ${filename} ${runTime}"report.xls"#chang 函数功能是将txt中关键数据变成xls文件。rm ${filename}

3.2 C++提取程序:使用了libxl.h

#include <iostream>#include <fstream>#include <string>#include "libxl.h"using namespace std;using namespace libxl;int main(int agrc, char *argc[]){//cout << "helloworld" << endl;fstream f;ifstream ifile(argc[1]);string temp;int i = 0, j=1, k = 0;Book* book = xlCreateBook();//创建一个二进制格式的XLS(Execl97-03)的实例,在使用前必须先调用这个函数创建操作excel的对象//book->setKey(......);//如果购买了该库,则设置相应的key,若没有购买,则不用这行if (book)//是否创建实例成功{Sheet* sheet = book->addSheet("Sheet1");//添加一个工作表for(i=0;i<30;i++){for(j=0;j<10;j++){sheet->setCol(i, j, 20);//设置列宽,格式等}}i=0;j=1;if (sheet){sheet->writeStr(j, 0, "API");sheet->writeStr(j, 1, "Concurrency Level");sheet->writeStr(j, 2, "Time taken for tests");sheet->writeStr(j, 3, "Complete requests");sheet->writeStr(j, 4, "Failed requests");sheet->writeStr(j, 5, "Total transferred");sheet->writeStr(j, 6, "Requests per second");sheet->writeStr(j, 7, "Time per reques(user)");sheet->writeStr(j, 8, "Time per reques(server)");j++;while (getline(ifile, temp)){if (temp[0] == '/'){f << temp << " ";sheet->writeStr(j, i, temp.c_str());}else if (temp.find('[') != string::npos){f << temp.substr(0, temp.find('[') - 1) << " ";sheet->writeStr(j, i, temp.substr(0, temp.find('[') - 1).c_str());}else if (temp.find('b') != string::npos){f << temp.substr(0, temp.find('b') - 1) << " ";sheet->writeStr(j, i, temp.substr(0, temp.find('b') - 1).c_str());}else if (temp.find('s') != string::npos){sheet->writeStr(j, i, temp.substr(0, temp.find('s') - 1).c_str());f << temp.substr(0, temp.find('s') - 1) << " ";}else{sheet->writeStr(j, i, temp.c_str());f << temp << " ";}i++;if (i == 9){f << " " << endl;i = 0;j++;}}ifile.close();}if (book->save(argc[2]))//保存到example.xls{//.....}else{std::cout << book->errorMessage() << std::endl;}book->release();}return 0;}

4 测试中遇到一些问题

在用云主机时要注意一下云主机带宽的问题,小水管很可能成为瓶颈。

ab软件中Total transferred 与端口流量有差距。端口流量大于Total transferred,猜测是有封包的因素。所以不能把Total transferred作为服务器消耗的流量来处理,用于计算云上某些按流量消耗的服务。

上述内容就是如何使用ab工具对服务器进行API压力测试,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-服务器
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯