测试

测试是软件开发流程中的基本组成部分,是确保软件性能质量的关键,因此对于一个软件测试活动是软件开发中不容忽视的一个重要环节。

关于测试包括多个方面,代码层面的比如一个过程、一个方法的测试,服务整体的性能测试,例如 QPS、TPS 等也是我们衡量一个系统性能的参考指标。

快速导航

性能指标

什么是 QPS

QPS(Query Per Second)指每秒查询量,规定时间内所能处理的流量大小,通常 QPS 值越大服务器的吞吐量也就越大,相对的服务器负荷也会越高。

QPS = 并发量 / 平均响应时间并发量 = QPS * 平均响应时间

什么是 TPS

TPS(TransactionPerSecond)指每秒事物处理量,每秒钟系统所能处理的交易或事务的数量,用来形容系统的性能。

TPS 与 QPS 的区别?

例如一次下单请求,访问一次创建订单接口产生一次 TPS,对于服务器的请求可能会产生多次,比如查询用户地址信息、商品数据信息、商品报价信息,这些请求计入 QPS,也就是产生了 3 次 QPS。

系统扩容评估

根据二八法则来评估系统扩容需要多少台机器,二八法则即 20% 的时间承载 80% 的流量,我们把这 20% 时间称为峰值时间。

换算公式:

  1. (总 PV * 80%)/(每天描述 * 20%) = 峰值时间每秒请求数
  2. 峰值时间内每秒请求数 (QPS)/单台机器 QPS = 需要的机器

假设我们有 1000 万 PV,总共需要的 QPS 为多少?

  1. (10000000 * 0.8) / (24 * 60 * 60 * 0.2) = 463 (QPS)

假设每台机器支撑 100 QPS,则总共需要的机器为

  1. 463(总共 QPS)/ 100(单机 QPS)= 5(约需要 5 台机器)

Node.js中的测试框架

ab压力测试

ab 是 apachebench 命令的缩写,是 Apache 自带的压力测试工具。执行原理是创建多个并发访问线程,来模拟多用户对同一 URL 地址进行压力测试。

安装指南

  • CentOS yum install httpd-tools
  • Ubuntu apt-get install httpd-tools

ab请求参数详解

执行 ab -help 查看参数

  1. $ ab -help
  2. Usage: ab [options] [http[s]://]hostname[:port]/path
  3. Options are:
  4. -n requests Number of requests to perform
  5. -c concurrency Number of multiple requests to make at a time
  6. -t timelimit Seconds to max. to spend on benchmarking
  7. This implies -n 50000
  8. -s timeout Seconds to max. wait for each response
  9. Default is 30 seconds
  10. -b windowsize Size of TCP send/receive buffer, in bytes
  11. -B address Address to bind to when making outgoing connections
  12. -p postfile File containing data to POST. Remember also to set -T
  13. -u putfile File containing data to PUT. Remember also to set -T
  14. -T content-type Content-type header to use for POST/PUT data, eg.
  15. 'application/x-www-form-urlencoded'
  16. Default is 'text/plain'
  17. -v verbosity How much troubleshooting info to print
  18. -w Print out results in HTML tables
  19. -i Use HEAD instead of GET
  20. -x attributes String to insert as table attributes
  21. -y attributes String to insert as tr attributes
  22. -z attributes String to insert as td or th attributes
  23. -C attribute Add cookie, eg. 'Apache=1234'. (repeatable)
  24. -H attribute Add Arbitrary header line, eg. 'Accept-Encoding: gzip'
  25. Inserted after all normal header lines. (repeatable)
  26. -A attribute Add Basic WWW Authentication, the attributes
  27. are a colon separated username and password.
  28. -P attribute Add Basic Proxy Authentication, the attributes
  29. are a colon separated username and password.
  30. -X proxy:port Proxyserver and port number to use
  31. -V Print version number and exit
  32. -k Use HTTP KeepAlive feature
  33. -d Do not show percentiles served table.
  34. -S Do not show confidence estimators and warnings.
  35. -q Do not show progress when doing more than 150 requests
  36. -l Accept variable document length (use this for dynamic pages)
  37. -g filename Output collected data to gnuplot format file.
  38. -e filename Output CSV file with percentages served
  39. -r Don't exit on socket receive errors.
  40. -m method Method name
  41. -h Display usage information (this message)
  42. -I Disable TLS Server Name Indication (SNI) extension
  43. -Z ciphersuite Specify SSL/TLS cipher suite (See openssl ciphers)
  44. -f protocol Specify SSL/TLS protocol
  45. (SSL3, TLS1, TLS1.1, TLS1.2 or ALL)
  • -n:总请求数
  • -c:每次执行的请求个数
  • -t:测试进行的最大时间,单位为秒
  • -p:POST 请求时的参数
  • -T:POST 请求信息的请求头 Content-Type 设置 “application/json”
  • -H:请求头 Headers 信息

ab应用实践

GET请求示例

我们对一个接口每次执行 10 个并发,总共完成 100 个请求

  1. $ ab -n 100 -c 10 -t 30 https://www.baidu.com/

POST请求示例

我们对一个接口每次执行 100 个并发,总共持续两分钟。

注意: 如果 POST 请求需要先将请求体保存为一个文件,例如 order.txt 通过 -p 参数加载

  1. $ ab -c 200 -t 120 -T 'application/json' -p order.txt http://192.168.6.128:3000/v1/order

POST 请求传递 Headers 示例

多个 header 参数使用多个 -H 传递,这块也是在使用过程中踩过的坑

  1. $ ab -c 200 -t 120 -T 'application/json' -H 'token: 123456' -H 'userId: 111' -p order.txt http://192.168.6.128:3000/v1/order

ab响应参数说明

  1. ab -c 200 -t 60 -T 'application/json' -p order.txt http://192.168.6.128:3000/v1/order
  2. This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
  3. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
  4. Licensed to The Apache Software Foundation, http://www.apache.org/
  5. Benchmarking 192.168.6.128 (be patient)
  6. Completed 5000 requests
  7. Completed 10000 requests
  8. Finished 11435 requests
  9. Server Software:
  10. Server Hostname: 192.168.6.128
  11. Server Port: 300
  12. Document Path: /?orderType=yongche
  13. Document Length: 473 bytes
  14. Concurrency Level: 100
  15. Time taken for tests: 60.037 seconds
  16. Complete requests: 11435
  17. Failed requests: 0
  18. Write errors: 0
  19. Total transferred: 7798670 bytes
  20. Total body sent: 18223720
  21. HTML transferred: 5408755 bytes
  22. Requests per second: 190.47 [#/sec] (mean)
  23. Time per request: 525.027 [ms] (mean)
  24. Time per request: 5.250 [ms] (mean, across all concurrent requests)
  25. Transfer rate: 126.85 [Kbytes/sec] received
  26. 296.43 kb/s sent
  27. 423.28 kb/s total
  28. Connection Times (ms)
  29. min mean[+/-sd] median max
  30. Connect: 0 1 2.3 0 33
  31. Processing: 43 515 231.0 485 1717
  32. Waiting: 43 515 231.0 485 1716
  33. Total: 43 516 231.0 486 1717
  34. Percentage of the requests served within a certain time (ms)
  35. 50% 486
  36. 66% 578
  37. 75% 638
  38. 80% 677
  39. 90% 781
  40. 95% 928
  41. 98% 1145
  42. 99% 1351
  43. 100% 1717 (longest request)
  • Server Software:表示被测试的软件服务器名称
  • Server Hostname:表示请求的 URL 主机名称
  • Server Port:表示请求的端口号
  • Document Path:请求的路径
  • Document Length:响应数据正文长度
  • Concurrency Level:表示并发用户数,也是我们设置的 -c 参数
  • Time taken for tests:请求处理完成所花费的时间
  • Complete requests:本次测试总请求数
  • Failed requests:失败的请求数量
  • Total transferred:所有请求的响应数据长度总和
  • HTML transferred:所有请求的响应中正文数据的总和,减去了一些 HTTP 头数据信息
  • Requests per second:吞吐率(QPS = Complete requests / Time taken for tests)这个是我们主要关注的性能指标
  • Time per request:用户请求平均等待时间(Time token for tests / (Complete requests / Concurrency Level))
  • Time per request (mean, across all concurrent requests):服务器完成一个请求所花费的时间(Time taken for tests / Complete requests)
  • Transfer rate:网络传输速度(Total trnasferred / Time taken for tests)

问题

最大连接数设置