http性能测试点滴(代码片段)

wetest wetest     2023-01-06     331

关键词:

WeTest 导读

在服务上线之前,性能测试必不可少。本文主要介绍性能测试的流程,需要关注的指标,性能测试工具apache bench的使用,以及常见的坑。

 


 

  • 什么是性能测试

 

性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可以结合进行。通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。压力测试是通过确定一个系统的瓶颈或者不能接受的性能点,来获得系统能提供的最大服务级别的测试。

 

  • 性能测试的目标是什么

性能测试最终的目的,是找到系统的瓶颈,一般来说,是找到服务单机最大TPS(每秒完成的事务数)。

需要注意的是,服务的TPS需要结合请求平均耗时来综合考虑。例如:服务TPS压到1000,平均请求耗时500ms,但是假如我们定的服务请求耗时不能超过200ms,那么这个1000的TPS是无效的。

很多场景下,服务都会设置超时时间,若平均耗时超过此超时时间,则可认为服务处于不可用状态。

  • 什么时候需要性能测试

1.功能测试完成之后,上线之前。

正常情况下,上线之前,都应该进行性能测试,尤其是请求量较大的接口,重点业务的核心接口,以及直接影响用户操作流程的接口。

2.各种大促,运营活动开始之前。

大促,运营活动,都会导致流量激增,因此上线之前做好压力测试,评估系统性能是否满足预估流量,提前做好准备。

举个反面例子:聚美优品,年年大促年年挂。

再来个正面的例子:每年双十一之前,阿里都会有全链路压测,各个业务自己也会有独立的压测,阿里在这块做得还是非常不错的。

  • 怎么做性能测试

常见的http性能测试工具

1. httpload

技术分享图片

2. wrk

技术分享图片

3. apache bench

技术分享图片

技术分享图片

技术分享图片

 

 

最终我们选择apache bench

 

看上去wrk才是最完美的,但是我们却选择了ab。我们验证过各种工具请求数据是否准确,压测的时候,通过后台日志记录,最终得出结论,ab的请求数误差在千分之二左右,而其他两个工具在千分之五左右。

不过不得不说,wrk的确是一款非常优秀的压测工具,采用异步IO模型,能压到非常高的TPS。曾经用空逻辑接口压到过7w的TPS,而相同接口,ab只能压到2w多。

  • apache bench的使用

前面已经给了一个简单的例子了,下面详细介绍下ab的使用。

如何安装?如果docker容器已经安装的apache,那么恭喜,ab是apache自带的一个组件,不用重新安装了。当然,也可以自己单独安装apache bench。

技术分享图片

ab 常用参数介绍

参数说明:
格式:ab [options] [http://]hostname[:port]/path

-n requests Number of requests to perform     //本次测试发起的总请求数
-c concurrency Number of multiple requests to make   //一次产生的请求数(或并发数)
-t timelimit Seconds to max. wait for responses    //测试所进行的最大秒数,默认没有时间限制。
-r Don‘t exit on socket receive errors.     // 抛出异常继续执行测试任务 
-p postfile File containing data to POST  //包含了需要POST的数据的文件,文件格式如“p1=1&p2=2”.使用方法是 -p 111.txt

-T content-type Content-type header for POSTing
//POST数据所使用的Content-type头信息,如 -T “application/x-www-form-urlencoded” 。 (配合-p)
-v verbosity How much troubleshooting info to print
//设置显示信息的详细程度 – 4或更大值会显示头信息, 3或更大值可以显示响应代码(404, 200等), 2或更大值可以显示警告和其他信息。 -V 显示版本号并退出。
-C attribute Add cookie, eg. -C “c1=1234,c2=2,c3=3” (repeatable)
//-C cookie-name=value 对请求附加一个Cookie:行。 其典型形式是name=value的一个参数对。此参数可以重复,用逗号分割。
提示:可以借助session实现原理传递 JSESSIONID参数, 实现保持会话的功能,如-C ” c1=1234,c2=2,c3=3, JSESSIONID=FF056CD16DA9D71CB131C1D56F0319F8″ 。
-w Print out results in HTML tables  //以HTML表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。
-i Use HEAD instead of GET
-x attributes String to insert as table attributes
-y attributes String to insert as tr attributes
-z attributes String to insert as td or th attributes
-H attribute Add Arbitrary header line, eg. ‘Accept-Encoding: gzip’ Inserted after all normal header lines. (repeatable)
-A attribute Add Basic WWW Authentication, the attributes
are a colon separated username and password.
-P attribute Add Basic Proxy Authentication, the attributes are a colon separated username and password.
-X proxy:port Proxyserver and port number to use
-V Print version number and exit
-k Use HTTP KeepAlive feature
-d Do not show percentiles served table.
-S Do not show confidence estimators and warnings.
-g filename Output collected data to gnuplot format file.
-e filename Output CSV file with percentages served
-h Display usage information (this message)

 

  • 性能测试报告

技术分享图片

 

测试报告应该包含以下内容。当然,根据场景不同,可以适当增减指标,例如有的业务要求关注cpu,内存,IO等指标,此时就应该加上相关指标。

技术分享图片

 

  • 常见的坑

1.AB发送的是http1.0请求。

2.-t可以指定时间,-n指定发送请求总数,同时使用时压测会在-t秒或者发送了-n个请求之后停止。但是-t一定要在-n之前(ab的bug,-n在-t之前最多只会跑5s)。

3.为了使测试结果更可靠,单次压测时间应在2分钟以上。

理论上,压测时间越长,结果误差越小。同时,可以在瓶颈附近进行长时间压测,例如一个小时或者一天,可以用来测试系统稳定性。许多系统的bug都是在持续压力下才会暴露出来。

4.小心压测客户端成为瓶颈。

例如上传,下载接口的压测,此时压测客户端的网络上行,下行速度都会有瓶颈,千万小心服务器还没到达瓶颈时,客户端先到了瓶颈。此时,可以利用多客户端同时压测。

5.ab可以将参数写入文件中,用此种方式可以测试上传文件的接口。

 需要配合-p -t 使用。

 

$ ab -n 10000 -c 8 -p post_image_1k.txt -T "multipart/form-data; boundary=1234567890" http://xxxxxxx

 

文件内容如下:

技术分享图片

技术分享图片

 

6.ab不支持动态构建请求参数,wrk可配合lua脚本支持动态构建请求参数,还是比较牛的。

package.path = ‘/root/wrk/?.lua;‘

local md5 = require "md5"
local body   = [[BI_login|userid145030|openid4-22761563|source|affiliate|creative|family|genus0|ip180.111.151.116|from_uid0|login_date2016-11-04|login_time10:40:13|extra|srcid1|snid1002|clientid1253|gameid2100012
BI_logout|userid184103|openid4-22784181|family|genus0|ip218.2.96.82|logout_date2016-11-04|logout_time10:40:42|extra|srcid1|snid1002|clientid1253|gameid2100012
BI_role_logout|roleid184103|userid184103|openid4-22784181|ip218.2.96.82|level100|money468|power1|exp252|lijin0|online_time0|mapid0|posx0|posy0|rolelogout_date2016-11-04|rolelogout_time10:40:42|extra0|srcid0|snid1002|clientid1253|gameid2100012
BI_logout|userid71084|openid4-20974629|family|genus0|ip117.136.8.76|logout_date2016-11-04|logout_time10:40:43|extra|srcid1|snid1002|clientid1253|gameid2100012]] 

--local body = "hello"
wrk.headers["Content-Type"] = "text/xml"

local i=0
request = function()
   i = i+1
   local path = "/v1/pub?gameid=510038&timestamp=%s&key=510038&type=basic&sign=%s"
   local time = os.time()*1000
   local v = "510038" .. time .. "basic98889999"
   local sign = md5.sumhexa(v)
   path = string.format(path, time, sign)
   --print(path)
   return wrk.format("POST", path, nil, body)
end

 

技术分享图片

 


 

腾讯WeTest推出的“压测大师”,一分钟完成用例配置,无需维护测试环境,支持http协议、API接口、网站等主流压测场景。

点击:https://wetest.qq.com/gaps 即可体验。

 

如果使用当中有任何疑问,欢迎联系腾讯WeTest企业QQ:2852350015。






















































测试沉思录21.如何用jmeter编写性能测试脚本?(代码片段)

...#xff1a;宋赟编辑:毕小烦ApacheJMeter应该是应用最广泛的性能测试工具。怎么用JMeter编写性能测试脚本?1.编写HTTP性能测试脚本STEP1.添加HTTP请求STEP2.了解配置信息HTTP请求各项信息说明(以JMeter5.1为例)。如下图所示&... 查看详情

测试沉思录21.如何用jmeter编写性能测试脚本?(代码片段)

...#xff1a;宋赟编辑:毕小烦ApacheJMeter应该是应用最广泛的性能测试工具。怎么用JMeter编写性能测试脚本?1.编写HTTP性能测试脚本STEP1.添加HTTP请求STEP2.了解配置信息HTTP请求各项信息说明(以JMeter5.1为例)。如下图所示&... 查看详情

测试沉思录21.如何用jmeter编写性能测试脚本?(代码片段)

...#xff1a;宋赟编辑:毕小烦ApacheJMeter应该是应用最广泛的性能测试工具。怎么用JMeter编写性能测试脚本?1.编写HTTP性能测试脚本STEP1.添加HTTP请求STEP2.了解配置信息HTTP请求各项信息说明(以JMeter5.1为例)。如下图所示&... 查看详情

性能测试-gatling(代码片段)

背景说明转自:http://www.infoq.com/cn/articles/new-generation-server-testing-tool-gatling/以前Jmeter用的多,如文档中所说,实际使用后发现Jmeter多用户时很容易并发并发不均匀,导致一些数据统计不准确。Jmeter&Gatling的QPS统计 因此我们... 查看详情

负载,性能测试工具-gatling(代码片段)

...能强大的负载测试工具,它为易于使用,高可维护性和高性能而设计。开箱即用,Gatling由于对HTTP协议的出色支持,使其成为负载测试任何HTTP服务器的首选工具。由于核心引擎实际上是协议不可知的,因此完全可以实现对其他协... 查看详情

转帖sysbench的安装和做性能测试(代码片段)

iMySQL|老叶茶馆sysbench的安装和做性能测试http://imysql.cn/node/312我仿照这个学的但是需要用更新的版本才可以。  Byyejron14六月2007作/译者:叶金荣(imysql#imysql.com>),来源:http://imysql.com,欢迎转载。sysbench是一个模块化的... 查看详情

http协议基础及报文抓包分析(代码片段)

从事性能测试必不可绕过的就是协议,对基本知识的了解,还是深入掌握协议的机制,都能让你在从事性能测试实施时显得更加顺手。下面我们就HTTP协议及性能测试过程必须掌握的一些分析工具来进行分享。重点分享性能测试... 查看详情

性能测试工具locust源码浅析(代码片段)

...:http://testqa.cn/article/detail/235近期由于有项目需要做性能评测,于是半道出家的我便从选择性能测试工具,开始了我的性能之旅。为什么要做工具评测作为性能测试的老司机们而言,要么对各大性能测试工具 查看详情

jmeter入门介绍(代码片段)

...试计划简述准备测试计划编写测试计划录制测试脚本执行性能测试单机测试分布式测试分析测试报告APDEX响应时间和吞吐量统计测试结果详细报表常用插件及扩展Q&A概述作为一名后端开发人员,熟练掌握一款性能测试工具非常... 查看详情

性能测试--siege(代码片段)

...,完全使用C语言实现,可以对HTTP和FTP服务器进行负载和性能测试。通过使用Siege提供的功能,可以很容易的制定测试计划:包括规定使用并发用户数、重复数量,从而可以模拟在服务器、网络或者其它对象上附加负载以测试他... 查看详情

webapi管理和性能测试工具webapibenchmarks(代码片段)

...多的了,Postman、Swagger等在管理和维护上都非常出色;在性能测试方面也有不少的工具如:wrk,bombardier,http_load和ab等等。不过这些工具都具有单一性,管理和维护好的在性能测试上比较低效,对于性能测试好的在管理和维护上不理... 查看详情

测试沉思录21.如何用jmeter编写性能测试脚本?(代码片段)

...#xff1a;宋赟编辑:毕小烦ApacheJMeter应该是应用最广泛的性能测试工具。怎么用JMeter编写性能测试脚本?1.编写HTTP性能测试脚本STEP1.添加HTTP请求STEP2.了解配置信息HTTP请求各项信息说明(以JMeter5.1为例)。如下图所示&... 查看详情

测试沉思录21.如何用jmeter编写性能测试脚本?(代码片段)

...#xff1a;宋赟编辑:毕小烦ApacheJMeter应该是应用最广泛的性能测试工具。怎么用JMeter编写性能测试脚本?1.编写HTTP性能测试脚本STEP1.添加HTTP请求STEP2.了解配置信息HTTP请求各项信息说明(以JMeter5.1为例)。如下图所示&... 查看详情

jdbc在性能测试中的应用(代码片段)

前言我们能否绕开http协议,直接测试数据库的性能?是否觉得从数据库中导出CSV文件来构造压测数据很麻烦?怎样在压测结束后做数据清理?能不能通过数据库中的插入(删除)记录对压测请求做断言ÿ... 查看详情

web性能压力测试工具——siege(代码片段)

  最近需要对Istio里的bookinfo进行分析,老是手去刷新太慢了,就找了个自动点的工具——Siege  Siege是一款开源的压力测试工具,设计用于评估WEB应用在压力下的承受能力。可以根据配置对一个WEB站点进行多用户的并发访问... 查看详情

evpp性能测试:与muduo进行吞吐量测试(代码片段)

Byzieckey简介muduo是最近几年中国开源界里产生的优秀作品。它是由业内大牛陈硕实现的。详细介绍,请参考其博客介绍http://blog.csdn.net/solstice/article/details/5848547。本次测试是参考陈硕的博客文章muduo与libevent2吞吐量对比,... 查看详情

rubyrails性能测试(代码片段)

查看详情

服务器性能测试工具----nmon(代码片段)

一、下载nmon根据CPU的类型选择下载相应的版本:http://nmon.sourceforge.net/pmwiki.php?n=Site.Downloadwget http://sourceforge.net/projects/nmon/files/download/nmon_x86_12a.zip方法1:1234[[email protected]~]#cd/opt[[email protected]opt]#mkdirnmon[[email protecte... 查看详情