热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

服务器API压力测试ab工具

最近对服务器的某些api进行性能测试,我们关注的主要指标就是系统吞吐量。第三节看看就好,很久前写的。文章目录1系统吞吐量的简单介绍2测试方法2.1客户端测试工具2.1

最近对服务器的某些api进行性能测试,我们关注的主要指标就是系统吞吐量。 第三节看看就好,很久前写的。

文章目录

  • 1 系统吞吐量的简单介绍
  • 2 测试方法
    • 2.1 客户端测试工具
      • 2.1.1 GET方法
      • 2.1.2 POST方法
      • 2.1.3 测试结果解读
    • 2.2服务器端检测方法
  • 3 实际测试
    • 3.1 shell脚本
    • 3.2 C++提取程序:使用了libxl.h
  • 4 测试中遇到一些问题


1 系统吞吐量的简单介绍

一个系统的吞度量(承压能力)与request对CPU的消耗、外部接口、IO等等紧密关联。
单个reqeust 对CPU消耗越高,外部系统接口、IO影响速度越慢,系统吞吐能力越低,反之越高。

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

  • 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.cnblogs.com/gumuzi/p/5617232.html

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/oauth2/token

-H:可以设置响应header
-T: Post http header类型 默认为text/plain
-P:Post body内容, ab要求写在文件中,-p后跟文件目录,文件内容如name=hello&password=1234

2.1.3 测试结果解读

来份ab的测试输出:
在这里插入图片描述
ab -n 10 -c 2 上图结果为总请求10 并发为2的结果

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

  • Concurrency Level: 10 //并发级别,也就是并发数,请求中-c参数指定的数量
  • Time taken for tests: 1.093 seconds //本次测试总共花费的时间
  • Complete requests: 100 //本次测试总共发起的请求数量
  • Failed requests: 0 //失败的请求数量。因网络原因或服务器性能原因,发起的请求并不一定全部成功,通过该数值和Complete requests相除可以计算请求的失败率,作为测试结果的重要参考。
  • Total transferred: 103314 bytes //总共传输的数据量,指的是ab从被测服务器接收到的总数据量,包括index.html的文本内容和请求头信息。
  • Requests per second: 91.50 [#/sec] (mean) //平均(mean)每秒完成的请求数:QPS,这是一个平均值,等于Complete requests/Time taken for tests=100/1.093=91.50
  • Time per request: 109.287 [ms] (mean) //从用户角度看,完成一个请求所需要的时间(因用户数量不止一个,服务器完成10个请求,平均每个用户才接收到一个完整的返回,所以该值是下一项数值的10倍。)
  • Time per request: 10.929 [ms] (mean, across all concurrent requests)// 服务器完成一个请求的时间。
  • Transfer rate: 92.32 [Kbytes/sec] received  //网络传输速度。对于大文件的请求测试,这个值很容易成为系统瓶颈所在。要确定该值是不是瓶颈,需要了解客户端和被测服务器之间的网络情况,包括网络带宽和网卡速度等信息。

其中我们最为关注的为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=$1
fiif [ -z "$2"]
thenparam="deviceid=XXX&bindingplatform=XXX&bindingid=XXX"
elseparam=$2
fifilename=${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}done
done
sed -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
#include
#include
#include "libxl.h"
using namespace std;
using namespace libxl;
int main(int agrc, char *argc[])
{//cout <<"helloworld" <setKey(......);//如果购买了该库&#xff0c;则设置相应的key&#xff0c;若没有购买&#xff0c;则不用这行if (book)//是否创建实例成功{Sheet* sheet &#61; book->addSheet("Sheet1");//添加一个工作表for(i&#61;0;i<30;i&#43;&#43;){for(j&#61;0;j<10;j&#43;&#43;){sheet->setCol(i, j, 20);//设置列宽&#xff0c;格式等}}i&#61;0;j&#61;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&#43;&#43;;while (getline(ifile, temp)){if (temp[0] &#61;&#61; &#39;/&#39;){f <writeStr(j, i, temp.c_str());}else if (temp.find(&#39;[&#39;) !&#61; string::npos){f <writeStr(j, i, temp.substr(0, temp.find(&#39;[&#39;) - 1).c_str());}else if (temp.find(&#39;b&#39;) !&#61; string::npos){f <writeStr(j, i, temp.substr(0, temp.find(&#39;b&#39;) - 1).c_str());}else if (temp.find(&#39;s&#39;) !&#61; string::npos){sheet->writeStr(j, i, temp.substr(0, temp.find(&#39;s&#39;) - 1).c_str());f <writeStr(j, i, temp.c_str());f <save(argc[2]))//保存到example.xls{//.....}else{std::cout <errorMessage() <release();}return 0;
}

3.3测试结果xls截图&#xff1a;

4 测试中遇到一些问题

在用云主机时要注意一下云主机带宽的问题&#xff0c;小水管很可能成为瓶颈。
ab软件中Total transferred 与端口流量有差距。端口流量大于Total transferred&#xff0c;猜测是有封包的因素。所以不能把Total transferred作为服务器消耗的流量来处理&#xff0c;用于计算云上某些按流量消耗的服务。

git&#xff1a;https://github.com/CollapsarLi/server_apachebench_shell.git


推荐阅读
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 在Ubuntu系统中安装Android SDK的详细步骤及解决“Failed to fetch URL https://dlssl.google.com/”错误的方法
    在Ubuntu 11.10 x64系统中安装Android SDK的详细步骤,包括配置环境变量和解决“Failed to fetch URL https://dlssl.google.com/”错误的方法。本文详细介绍了如何在该系统上顺利安装并配置Android SDK,确保开发环境的稳定性和高效性。此外,还提供了解决网络连接问题的实用技巧,帮助用户克服常见的安装障碍。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 基于Linux系统的Kickstart自动化服务器部署方案
    本文针对企业需求,提出了一种基于Linux系统的Kickstart自动化服务器部署方案。该方案旨在通过无盘批量安装操作系统,提高企业IT基础设施的部署效率。Kickstart是一种利用Anaconda工具实现服务器自动化安装的技术,能够显著简化和加速操作系统的安装过程。通过详细的实施规划,本文介绍了Kickstart的工作原理及其在实际部署中的应用,为企业提供了高效的自动化部署解决方案。 ... [详细]
  • 性能测试中的关键监控指标与深入分析
    在软件性能测试中,关键监控指标的选取至关重要。主要目的包括:1. 评估系统的当前性能,确保其符合预期的性能标准;2. 发现软件性能瓶颈,定位潜在问题;3. 优化系统性能,提高用户体验。通过综合分析这些指标,可以全面了解系统的运行状态,为后续的性能改进提供科学依据。 ... [详细]
  • 本文深入解析了Django框架中的MVT(Model-View-Template)设计模式,详细阐述了其工作原理和应用流程。通过分析URL模式、视图、模型和模板等关键组件,读者将全面理解Django应用程序的架构体系,掌握如何高效地构建和管理Web应用。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 在 Ubuntu 22.04 LTS 系统中安装 HPLIP 的详细步骤与注意事项
    HPLIP 是 HP 官方提供的软件套件,旨在支持多种 HP 打印机型号,如 Deskjet、Officejet、Photosmart、PSC、Business Inkjet 和 LaserJet 等。本文详细介绍了在 Ubuntu 22.04 LTS 系统中安装 HPLIP 的步骤,并提供了重要的注意事项,确保用户能够顺利配置和使用 HP 打印设备。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • 在重新安装Ubuntu并配置Django和PyCharm后,忘记测试MySQL连接,导致在后续配置过程中遇到错误:ERROR 2003 (HY000) - 无法连接到本地服务器 ‘127.0.0.1’ (111)。本文将详细介绍该错误的原因及解决步骤,帮助用户快速恢复MySQL服务的正常运行。我们将从检查网络配置、验证MySQL服务状态、配置防火墙规则等方面入手,提供全面的故障排除指南。 ... [详细]
  • 在 CentOS 7 中,为了扩展可用软件包的数量,通常需要配置多个第三方软件源。这些第三方源包括 EPEL、Nux Dextop 和 ELRepo 等,它们提供了大量官方源中未包含的软件包,从而增强了系统的功能性和灵活性。通过正确配置这些源,用户可以轻松安装和管理更多种类的软件,满足不同的需求。 ... [详细]
  • 在 Ubuntu 系统中安装 Python pip 时遇到错误的解决方案 ... [详细]
  • MySQL数据库安装图文教程
    本文详细介绍了MySQL数据库的安装步骤。首先,用户需要打开已下载的MySQL安装文件,例如 `mysql-5.5.40-win32.msi`,并双击运行。接下来,在安装向导中选择安装类型,通常推荐选择“典型”安装选项,以确保大多数常用功能都能被正确安装。此外,文章还提供了详细的图文说明,帮助用户顺利完成整个安装过程,确保数据库系统能够稳定运行。 ... [详细]
  • 在Ubuntu系统中配置Python环境变量是确保项目顺利运行的关键步骤。本文介绍了如何将Windows上的Django项目迁移到Ubuntu,并解决因虚拟环境导致的模块缺失问题。通过详细的操作指南,帮助读者正确配置虚拟环境,确保所有第三方库都能被正确识别和使用。此外,还提供了一些实用的技巧,如如何检查环境变量配置是否正确,以及如何在多个虚拟环境之间切换。 ... [详细]
  • 如何在Mac上构建高效的本地服务器环境
    在Mac上构建高效的本地服务器环境,首先需要了解基本步骤:1. 配置目录基础;2. 启动Apache服务;3. 添加自定义文档至本地服务器;4. 查看自定义效果。此外,还可以通过手机或其他电脑访问本机服务器,以确保跨设备的兼容性和调试效果。Mac系统自带的Apache服务为本地开发提供了便捷的工具,本文将详细介绍每个步骤的具体操作方法。 ... [详细]
author-avatar
zwjy2018
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有