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 常用参数介绍

  1. 参数说明:
    格式:ab [options] [http://]hostname[:port]/path
  2. -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
  3. -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 使用。

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

文件内容如下:

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

  1. package.path = '/root/wrk/?.lua;'
  2. local md5 = require "md5"
    local body   = [[BI_login|userid{145030}|openid{4-22761563}|source{}|affiliate{}|creative{}|family{}|genus{0}|ip{180.111.151.116}|from_uid{0}|login_date{2016-11-04}|login_time{10:40:13}|extra{}|srcid{1}|snid{1002}|clientid{1253}|gameid{2100012}
    BI_logout|userid{184103}|openid{4-22784181}|family{}|genus{0}|ip{218.2.96.82}|logout_date{2016-11-04}|logout_time{10:40:42}|extra{}|srcid{1}|snid{1002}|clientid{1253}|gameid{2100012}
    BI_role_logout|roleid{184103}|userid{184103}|openid{4-22784181}|ip{218.2.96.82}|level{100}|money{468}|power{1}|exp{252}|lijin{0}|online_time{0}|mapid{0}|posx{0}|posy{0}|rolelogout_date{2016-11-04}|rolelogout_time{10:40:42}|extra{0}|srcid{0}|snid{1002}|clientid{1253}|gameid{2100012}
    BI_logout|userid{71084}|openid{4-20974629}|family{}|genus{0}|ip{117.136.8.76}|logout_date{2016-11-04}|logout_time{10:40:43}|extra{}|srcid{1}|snid{1002}|clientid{1253}|gameid{2100012}]] 
  3. --local body = "hello"
    wrk.headers["Content-Type"] = "text/xml"
  4. 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。

http性能测试点滴的更多相关文章

  1. SQL点滴10—使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比

    原文:SQL点滴10-使用with语句来写一个稍微复杂sql语句,附加和子查询的性能对比 今天偶尔看到sql中也有with关键字,好歹也写了几年的sql语句,居然第一次接触,无知啊.看了一位博主的文章 ...

  2. Ignite性能测试以及对redis的对比

    测试方法 为了对Ignite做一个基本了解,做了一个性能测试,测试方法也比较简单主要是针对client模式,因为这种方法和使用redis的方式特别像.测试方法很简单主要是下面几点: 不作参数优化,默认 ...

  3. 性能测试工具 wrk 安装与使用

    介绍 今天给大家介绍一款开源的性能测试工具 wrk,简单易用,没有Load Runner那么复杂,他和 apache benchmark(ab)同属于性能测试工具,但是比 ab 功能更加强大,并且可以 ...

  4. .NET Core性能测试组件BenchmarkDotNet 支持.NET Framework Mono

    .NET Core 超强性能测试组件BenchmarkDotNet 支持Full .NET Framework, .NET Core (RTM), Mono. BenchmarkDotNet支持 C# ...

  5. C#中实现并发的几种方法的性能测试

    C#中实现并发的几种方法的性能测试 0x00 起因 去年写的一个程序因为需要在局域网发送消息支持一些命令和简单数据的传输,所以写了一个C/S的通信模块.当时的做法很简单,服务端等待链接,有用户接入后开 ...

  6. 「视频直播技术详解」系列之七:直播云 SDK 性能测试模型

    ​关于直播的技术文章不少,成体系的不多.我们将用七篇文章,更系统化地介绍当下大热的视频直播各环节的关键技术,帮助视频直播创业者们更全面.深入地了解视频直播技术,更好地技术选型. 本系列文章大纲如下: ...

  7. PostgreSql性能测试

    # PostgreSql性能测试 ## 1. 环境+ 版本:9.4.9+ 系统:OS X 10.11.5+ CPU:Core i5 2.7G+ 内存:16G+ 硬盘:256G SSD ## 2. 测试 ...

  8. Web系统性能测试术语简介

    并发用户 并发一般分为两种情况.一种是严格意义上的并发,即所有的用户在同一时刻做同一件事情或者操作.这种操作一般指做同一类型的业务,比如在信用卡审批业务中,一定数目的用户在同一时刻对已经完成的审批业务 ...

  9. Web前端性能测试-性能测试知多少---深入分析前端站点的性能

    针对目前接手的web前端的性能,一时间不知道从什么地方入手,然后经过查找资料,发现其实还是蛮简单的. 前端性能测试对象: HTML.CSS.JS.AJAX等前端技术开发的Web页面 影响用户浏览网页速 ...

随机推荐

  1. MyBatis框架(6)动态sql

    本次全部学习内容:MyBatisLearning   什么是动态sql:     mybatis的核心,对sql进行灵活的操作,通过对表达式的判断,对sql灵活的拼接 在之前小案例的基础上我们先进行简 ...

  2. Spring IoC 中的(Singleton)单例对象创建过程探索

    前言 之前将spring framework 源码导入了idea,后来折腾调试了一下,于是研究了一下最简单的singleton对象在spring中是如何创建的.这里所谓的简单,就是指无属性注入,无复杂 ...

  3. 从源码看String,StringBuffer,StringBuilder的区别

    前言 看了一篇文章,大概是讲面试中的java基础的,有如题这么个面试题.我又翻了一些文章看了下,然后去看源码.看一下源码大概能更加了解一些. String String类是final的,表示不可被继承 ...

  4. Visual C++中MFC消息的分类

    Visual C++中MFC消息的分为三类:标准(窗口)消息.命令消息.控件消息. 1.标准(窗口)消息:窗口消息一般与窗口内部运作有关,如创建窗口,绘制窗口,销毁窗口,通常,消息是从系统发到窗口,或 ...

  5. git上传下载代码操作

    提交代码实质上都要走这样的操作 " 本地代码 --> 本地服务器"  "本地服务器 --> 远程服务器" 其实小伙伴就记住两个词就好了. Commi ...

  6. The Android ION memory allocator

    http://lwn.net/Articles/480055/ Back in December 2011, LWN reviewed the list of Android kernel patch ...

  7. 使你的ActiveX控件执行时不弹出安全性提示(转载)

    我们编写一个ActiveX控件在IE中运行,一般会弹出一个安全提示,如何避免这种情况?下面是我在参考前人的文章后,总结出“在浏览器中执行时不弹出警告的ActiveX控件”的两种编写方法,予以备忘.注意 ...

  8. 微信小程序,搜索结果关键词高亮 wxml不能动态识别html标签

    wxml中使用rich-text标签放置动态html标签 js:

  9. Knowledge Point 20180305 详解精度问题

    1.1 精度与基本数据类型运算的深度解析 我们在探讨Java基本数据类型时多次提到过精度的问题,那么计算机中的精度究竟是什么样的,为什么我们有时候的计算和我们预期的不同呢?下面我们通过精度来了解: 1 ...

  10. BZOJ 3771: Triple(生成函数 FFT)

    Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 911  Solved: 528[Submit][Status][Discuss] Description ...