咱们在beta阶段对于网站访问作了很多优化工做,所以打算在本阶段尾声时对网站作了一个简单的压力测试,进而估算一下网站如今的并发量及处理能力。所以,咱们对现有较流行的几种网络压力测试工具进行了简单调研并尝试部署使用。html
有一些网站提供了在线压力测试功能,例如腾讯提供的 wetest 压测大师, Nice tool, load impact, Post Json, PostMan等。咱们也尝试使用了其中的一些,就使用上来讲比较简单,可是在一些特殊极端状况下不是十分理想。python
通过咱们的尝试,咱们认为在线网站主要有如下优点linux
配置简单 使用在线网站不须要本身在本地搭载环境,编写代码,并有一个较完善的UI界面。nginx
功能多 以wetest为例,能够提供监控核心性能指标如TPS、响应时间CPU、内存、磁盘IO、网卡负载、压力机性能监测等(需求腾讯云)web
结果展现直观 上述大部分网站均可以直接以图表的形式显示结果,直观而且能够直接在展现中使用apache
并发限制 在线网站每每有最大并发限制,例如上述网站未登陆的状况下都限制最大并发10~50。wetest,nicetool能够经过注册的方式增长并发限制,然而注册过程较繁琐,须要提供证实材料。windows
可定制化较低 很容易理解,在线网站测试的可定制化程度必定比本身写代码要低。bash
连接速度问题 在作实际测试是,咱们固然但愿测试的是服务器的性能而不是网络质量。所以,使用网站的结果可能会没有直接在服务器上部署测试来的准确。服务器
这里咱们以nicetool为例,执行50并发,100请求的测试,结果以下:网络
Summary: Total: 1.3244 secs Slowest: 0.4565 secs Fastest: 0.1701 secs Average: 0.2889 secs Requests/sec: 151.0075 Response time histogram: 0.170 [1] | 0.199 [88] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 0.227 [3] |■ 0.256 [1] | 0.285 [0] | 0.313 [0] | 0.342 [36] |■■■■■■■■■■■■■■■■ 0.371 [21] |■■■■■■■■■■ 0.399 [0] | 0.428 [14] |■■■■■■ 0.456 [36] |■■■■■■■■■■■■■■■■ Latency distribution: 10% in 0.1722 secs 25% in 0.1751 secs 50% in 0.3367 secs 75% in 0.4204 secs 90% in 0.4365 secs 95% in 0.4415 secs 99% in 0.4536 secs Details (average, fastest, slowest): DNS+dialup: 0.0196 secs, 0.1701 secs, 0.4565 secs DNS-lookup: 0.0031 secs, 0.0000 secs, 0.0131 secs req write: 0.0001 secs, 0.0000 secs, 0.0027 secs resp wait: 0.2689 secs, 0.1699 secs, 0.3761 secs resp read: 0.0003 secs, 0.0001 secs, 0.0049 secs Status code distribution: [200] 200 responses
除了在线网站,咱们也调研并使用了一些其它工具,包括 ab, pylot, siege等。下面作一下简单介绍,基本按照推荐顺序。
ab 的全称是apache bench,是由Apache提供的一款简单高效的测试工具,支持windows和linux等。
首先须要下载Apache,对于windows,cmd进入安装目录的BIN文件夹下就能够执行ab了。对于Linux,通常能够经过安装Apache服务解决。
ab包括如下参数:
-n 执行的请求数量
-c 并发请求个数
-t 测试所进行的最大秒数
-p 包含了须要POST的数据的文件
-T POST数据所使用的Content-type头信息
-k 启用HTTP KeepAlive功能,即在一个HTTP会话中执行多个请求,默认时,不启用KeepAlive功能
一个简单的例子是
ab -n 100 -c 100 http://www.baidu.com/
咱们使用
ab -n 100 -c 100 https://ratemycourse.tk/
进行了测试,测试结果以下:
Server Software: cloudflare Server Hostname: ratemycourse.tk Server Port: 443 SSL/TLS Protocol: TLSv1.2,ECDHE-ECDSA-CHACHA20-POLY1305,256,256 TLS Server Name: ratemycourse.tk Document Path: / Document Length: 6856 bytes Concurrency Level: 100 Time taken for tests: 3.153 seconds Complete requests: 100 Failed requests: 0 Total transferred: 732100 bytes HTML transferred: 685600 bytes Requests per second: 31.72 [#/sec] (mean) Time per request: 3153.013 [ms] (mean) Time per request: 31.530 [ms] (mean, across all concurrent requests) Transfer rate: 226.75 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 489 632 130.8 611 1232 Processing: 167 412 359.8 347 2159 Waiting: 164 223 86.2 193 817 Total: 695 1044 405.5 927 3133 Percentage of the requests served within a certain time (ms) 50% 927 66% 1029 75% 1078 80% 1154 90% 1586 95% 1895 98% 2818 99% 3133 100% 3133 (longest request)
ab提供的测试结果内容较多,十分完整,包括链接成功数,响应时间等多种内容并作了简单分析,足够使用。主要缺点是不能监控,没有图形化结果。ab好像是单核的,所以高并发时可能形成测试瓶颈。另外我服务器上已经使用了Nginx做为webserver,再安装Apache等还须要处理一些冲突问题。
siege 是一个十分经常使用的开源的web服务压力测试工具,能够模拟数千并发的请求,并给出一个简单的统计。siege的安装使用很是简单,下以Ubuntu/Debian为例。
siege能够经过编译源码与apt两种方式安装,须要注意的是官网连接不是很稳定,虽然压缩包大小仅有511K可是依然须要代理访问,所以更推荐使用apt安装。
源码安装的方式以下:
wget http://download.joedog.org/siege/siege-latest.tar.gz tar -zxvf siege-latest.tar.gz cd siege-4.0.4/ ./configure make make install
sudo apt install siege
咱们摘录了这篇文章中介绍用法的部分。
-C,或–config 在屏幕上打印显示出当前的配置,配置是包括在他的配置文件$HOME/.siegerc中,能够编辑里面的参数,这样每次siege 都会按照它运行.
-v 运行时能看到详细的运行信息
-c n,或–concurrent=n 指定并发的用户个数,-c 200指定并发数200。模拟有n个用户在同时访问,n不要设得太大,由于越大,siege 消耗本地机器的资源越多
-i,–internet 随机访问urls.txt中的url列表项,以此模拟真实的访问状况(随机性),当urls.txt存在是有效。默认为urls.txt列表从上到下来压。
-d n,–delay=n hit每一个url之间的延迟,在0-n之间
-r n,–reps=n 重复运行测试n次,不能与-t同时存在
-t n,–time=n 持续时间。即测试持续时间。默认是分钟。例: -t10S,(10秒) -t5M,(5分钟) -t1H,(1小时)
-l 运行结束,将统计数据保存到日志文件中siege .log,通常位于/usr/local/var/siege .log中,也可在.siegerc中自定义
-R SIEGERC,–rc=SIEGERC 指定用特定的siege 配置文件来运行,默认的为$HOME/.siegerc
-f FILE, –file=FILE 指定用特定的urls文件运行siege ,默认为urls.txt,位于siege 安装目录下的etc/urls.txt
-u URL,–url=URL 测试指定的一个URL,对它进行”siege “,此选项会忽略有关urls文件的设定
-b 进行压力测试,不进行延时。
-A, --user-agent=“text” 设置请求的User-Agent
使用以上命令基本能够知足大部分测试需求了。以咱们的测试为例,咱们考察了1000并发下的网站工做状况,使用了以下命令:
siege -c 100 https://ratemycourse.tk -i -b
简单测试结果以下:
Lifting the server siege... Transactions: 100 hits Availability: 100.00 % Elapsed time: 2.30 secs Data transferred: 0.23 MB Response time: 1.29 secs Transaction rate: 45.65 trans/sec Throughput: 0.10 MB/sec Concurrency: 58.68 Successful transactions: 100 Failed transactions: 0 Longest transaction: 1.53 Shortest transaction: 1.04
siege安装方便,比起ab,不须要解决与nginx可能的冲突的问题。siege的测试速度直观上比ab更快。siege提供的信息要略少一些,不过对于简单分析依然足够。
另外siege有一个小坑:siege的最大并发连接默认值是255,须要手动到配置文件中修改。siege在WSL和部分macOS上启动会失败,建议使用虚拟机或完整的Linux环境。
pylot是一个python写的测试工具,支持命令行与图形界面,支持生成图表,配置简单易用。其实pylot是我最先尝试的工具,由于简介博客说它基于python,又能够画图。
然而简介老是美好的,现实老是残酷的。简单来讲,就目前请不要再试图使用或推荐pylot了。
首先是官网进不去。咱们在博客的介绍里找到了所谓的官网:www.pylot.org,然而实际上这个网站如今是emmm,在线发牌。
幸运的是,咱们还有web archive这个老朋友。emmm,然而看上去最后更新的版本2009/07/06的。另外它好像只支持python2,我也不知道有没有人在继续维护。
就结论来讲,我好像浪费了一小时试图搞定这个玩意。
总的来讲,这些测试工具比起网站能够本身部署,能够本身定制功能。直接部署到服务器上或者与服务器有较高链接速率的服务器上(例如同一局域网)能够最大限度避免网络质量致使的偏差。相较于在线测试网站,咱们也能够自定义更大的链接数,测试更高的并发。
除了使用上面的工具以外,咱们还可使用本身写的一些其余脚本实现更多功能。利用python的request库,简单的就能够模拟一个请求。本身写的脚本每每能够实现更多特殊的功能,可是他们一样也会面临一些问题,例如鲁棒性,异常处理完整性,测试的公平准确性等问题。例如,下面的测试代码模拟了连续25秒,每秒请求200次的压力测试。
import requests import threading import time class thread1(threading.Thread): count200=0 count502=0 count504=0 count500=0 countelse=0 def __init__(self, threadID, name): threading.Thread.__init__(self) self.threadID = threadID self.name = name def run(self): time.sleep(50) code = requests.get(YOUR_WEB_SITE).status_code if int(code)==200: thread1.count200+=1 elif int(code)==502: thread1.count502+=1 elif int(code)==504: thread1.count504+=1 elif int(code)==500: thread1.count500+=1 else: thread1.countelse+=1 if __name__=="__main__": threads=[] for i in range(5000): thread=thread1(i, "Thread-{}".format(i)) threads.append(thread) for i in threads: i.start() time.sleep(0.005) for i in threads: i.join() print(thread1.count200,thread1.count502,thread1.count504,thread1.count500,thread1.countelse)
在咱们实际使用中,咱们使用了siege辅以本身编写的脚本进行了测试,网站压力测试结果能够参考咱们的后续博客。实际上,咱们认为ab和siege都是十分优秀的解决方案。