Siege是一种可配置的基准测试和测试工具,适用于通过发出网页请求来测试Web服务器的网站。Siege请求的每秒页数可以设置为从每秒几页到网站可以处理的最大数量。
通过突出显示首先耗尽哪个服务器资源以及流量级别,可以发现性能瓶颈。有了这些信息,您可以在实际站点出现故障之前更改服务器的配置或升级服务器的硬件。此外,可以在模拟负载下测试常见的系统管理过程(如备份),以确定它们对网站性能的影响。
在本指南中,我们将安装和配置Siege以在基准测试和浏览模式下运行。基准测试模式产生与Web服务器一样多的请求,浏览模式模拟可配置网站访问者的数量。
因为使用Firefox配置通过代理服务器运行的Internet连接特别简单,我们将使用它通过Sproxy代理服务器连接到Internet。Sproxy是专门为Siege工作而创建的,它记录了通过它传递给文件的每个请求的URL。我们将使用该文件告诉Siege要测试哪些URL。
在本教程的第一部分中,我们将安装Sproxy并配置Firefox以通过它连接到Internet。我们将生成一个URL列表以进行Siege测试,最后,我们将检查测试结果并确定性能瓶颈。
警告:在某些国家/地区,对未经授权的网站使用Siege可能会被视为犯罪。
准备
要完成本教程,您需要:
8080
。这是Sproxy默认侦听的端口。Sproxy不作为预打包二进制文件提供,因此您必须从其官方网站下载它,然后从源代码构建它。
由于Sproxy的构建过程依赖于默认情况下未安装在Ubuntu上的工具,因此您需要安装一些其他软件包。
首先,更新您的包列表,以确保您获得每个附加包的最新版本。
$ sudo apt-get update
然后,安装包。
$ sudo apt-get install build-essential libnet-ssleay-perl liburi-perl libwww-perl
build-essential
提供了通用库和需要建立在基于Debian的Linux发行版的软件工具,同时libnet-ssleay-perl
,liburi-perl
和libwww-perl
是SPROXY所依赖的Perl编程语言的库,其可以通过SSL连接,操纵URI字符串,并与World Wide Web交互。
现在,切换到您的主目录并从其官方网站下载Sproxy源代码存档。
$ cd ~
$ curl -O http://download.joedog.org/sproxy/sproxy-latest.tar.gz
然后,创建一个名为sproxy
的目录,并将源代码存档解压缩到新目录中。
$ mkdir sproxy
$ tar -zxf sproxy-latest.tar.gz --strip-components=1 --directory="sproxy"
这里,该-zxf
选项告诉tar包使用gunzip
并提取sproxy-latest.tar.gz
文件的内容。该--strip-components=1
选项从每个文件名中删除第一个前导组件。这会将存档解压缩到sproxy目录中,其由--directory
选项指定而不是sproxy-1.02/sproxy/
。
现在,使用configure
和make
命令切换到要构建和安装Sproxy 的sproxy
目录。
$ cd sproxy
$ ./configure
$ make
$ sudo make install
./configure
命令检查系统上是否存在所有必需的程序依赖项和构建工具。然后make命令构建程序二进制文件。最后,make install
命令将新二进制文件复制到服务器上的正确位置。由于Sproxy在其中创建新目录/usr/local/lib/sproxy/JoeDog
,因此您需要以make install
root权限运行。
最后,返回主目录使用-v
选项以详细模式启动Sproxy,测试Sproxy是否正常工作。
$ cd ~
$ sproxy -v
输出会告诉您Sproxy正在侦听的端口,Sproxy正在写入输出的文件的位置,以及Sproxy等待来自远程主机的回复的秒数。
SPROXY v1.02 listening on port 9001
...appending HTTP requests to: /user/urls.txt
...default connection timeout: 120 seconds
如果Sproxy无法启动,请查看终端中的消息,以获取有关出错的信息。
一旦你确认一切正常,请使用CTRL+C
停止Sproxy。
Sproxy现在可以使用了,所以让我们修改Firefox以通过Sproxy连接到Internet,以便创建一个用于与Siege进行基准测试的URL列表。
我们现在将更改Firefox的网络配置,以通过Sproxy发送所有Web请求,生成Siege所需的基准测试目标列表。
因为我们希望Sproxy记录我们访问的每个URL,所以我们还将清除Firefox的本地Web缓存。Web缓存是来自Firefox已访问过的网站的图像和其他静态内容的本地存储。默认情况下,Firefox不会重新请求已缓存的网站资产。
首先,在Firefox的主“首选项”屏幕上的“ 常规”选项卡下更改“网络代理”设置。
在此面板中,将Firefox配置为通过您在步骤1中安装的Sproxy服务器传递其所有请求。
您现在已将Firefox配置为使用Sproxy HTTP代理服务器,因此您可以清除本地缓存。
Firefox将本地缓存称为脱机Web内容。它位于Firefox的“首选项”屏幕的“隐私和安全”部分。
您的Web缓存现在为空,因此Firefox遇到的每个基于HTTP的网站的地址都将传递给Sproxy,直到重新缓存该地址为止。
Firefox现在配置为通过Sproxy路由所有基于HTTP的请求,但是在步骤1结束时您停止了Sproxy。因此,如果您现在尝试通过HTTP连接访问网站,您将看到错误页面。
如果您没有看到此错误消息,请验证您的Firefox设置是否与之前的屏幕截图相匹配,并仔细检查您是否未通过HTTPS连接到网站。
现在我们已经将Firefox配置为通过Sproxy连接到Internet,我们可以通过启动Sproxy并使用Firefox浏览目标网站来创建URL列表。
在此步骤中,我们将启动Sproxy服务器并使用Firefox浏览目标网站。Sproxy将记录Firefox请求的每个基于HTTP的URL到稍后我们将在Siege中使用的文件。
首先,切换到您的主目录并启动Sproxy。
$ cd ~
$ sproxy -v -t 180 -p 8080 -o mixed-urls.txt your_server_ip
-v
将请求的URL打印到终端。-t
是Sproxy等待远程主机响应的秒数。-p
是Sproxy将会收听的端口。-o
是Sproxy将URL写入的文件。your_server_ip
是Sproxy将绑定到的IP地址。输出会立即告诉您正在运行的Sproxy的版本,Sproxy正在侦听的端口,Sproxy正在写入URL的文件,以及Sproxy等待远程主机响应的时间。一旦开始浏览测试网站,输出还将包括Sproxy正在录制的网页的URL。
SPROXY v1.02 listening on port 8080
...appending HTTP requests to: mixed-urls.txt
...default connection timeout: 180 seconds
http://www.example.com/
http://www.example.com/index.html
http://www.example.com/about.html
注意: Sproxy不支持HTTPS连接,因此您必须通过HTTP浏览测试站点才能生成URL列表。但是,Siege确实支持HTTPS,并且在步骤5中,我们将修改仅HTTP URL列表以通过HTTP和HTTPS测试您的网站。
启动Sproxy后,返回Firefox并开始浏览目标站点。Sproxy会将Firefox请求的每个URL写入mixed-urls.txt
文件,同时将URL打印到终端。
一旦您访问了计划测试的所有网页,请停止Sproxy。
现在,您在测试网站上遇到的每个基于HTTP的URL的mixed-urls.txt
文件中都有一个列表。下一步是删除任何无法解析到您网站的URL,以确保您只对授权域使用Siege。
现代网站通常在多个位置托管内容。此内容可以是托管在内容分发网络(CDN)上的图像,也可以是托管在第三方服务(如Google)上的字体。当我们运行Siege时,我们希望确保我们仅对我们有权测试的域进行基准测试。因此,我们必须删除mixed-urls.txt
文件中未指向目标网站的URL。
使用grep(一种用于根据用户指定的正则表达式搜索纯文本输入的程序),仅查找与您的测试域匹配的URL,并将结果重定向到名为urls.txt
的新文件。
$ grep -a "^http://www.example.com" mixed-urls.txt > urls.txt
该-a
标志告诉grep将二进制文件视为文本文件。这是必要的,因为浏览器有时会发出包含二进制数据的POST请求,然后Sproxy会写入mixed-urls.txt
。如果mixed-urls.txt
存在二进制数据,没有-a
标志的grep将会失败。
在正则表达式术语中,^
字符表示字符串必须以http://www.example.com
匹配为开头。
此命令在终端中不会产生任何输出,但会创建一个名为urls.txt
的新文件。
现在,打开urls.txt
以确保每行都以测试网站的域名开头,并删除任何不符合条件的行。
$ nano urls.txt
完成编辑后,保存更改并关闭文件。
您的URL列表现在只包含您有权测试的URL,因此我们已准备好安装Siege。如果您还想通过HTTPS对您的网站进行基准测试,请按照步骤5中的可选说明创建包含您URL的HTTPS版本的第二个URL文件。
许多网站都通过HTTP和HTTPS运行,甚至只通过HTTPS运行,因此您也可以通过HTTPS对您的网站进行基准测试。Siege可以做到。您只需要提供一个以https开头的网址列表。
首先,使用cat
命令打开urls.txt
并将其内容传递给sed,这是一个用于解析和转换文本的程序。sed将替换所有http的实例为https并在终端中显示结果。
$ cat urls.txt | sed 's|http|https|'
输出将与urls.txt
文件中已有的URL列表相同,但每个输出的URL都将以https开头。
https://www.example.com/
https://www.example.com/index.html
https://www.example.com/about.html
验证输出后,重新运行该命令,这次将输出写入一个名为urls-https.txt
的新文件。
$ cat urls.txt | sed 's|http|https|' > urls-https.txt
此命令不会向终端产生任何输出,因为它已全部重定向到urls-https.txt
。
现在我们已经有了新的URL列表,我们已准备好安装Siege并开始测试。
在开始测试网站之前,必须先安装Siege。
Siege可以从标准的Ubuntu软件包存储库中获得,因此请用apt-get
安装它。
$ sudo apt-get install siege
Siege有两种操作模式:互联网模式和基准模式。Internet模式模拟浏览目标网站的访问者,而基准模式可以像Web服务器一样快速地处理请求。我们将首先在互联网模式下运行Siege。
Internet模式适用于通过增加同时访问者的数量来缓慢增加服务器上的负载。此模式还可以长时间创建持续负载,如果您需要了解在创建备份等操作期间网站的性能,这将非常有用。
切换到您的主目录并以Internet模式启动Siege。如果您想针对仅HTTP地址进行测试,请替换urls_file
为urls.txt
。如果您按照步骤5进行测试并希望针对HTTPS地址进行测试,请替换urls_file
为urls-https.txt
。
$ cd ~
$ siege --internet --concurrent=5 --time=30S --log="siege-internet.log" --file="urls_file"
--internet
将Siege设置为internet模式。--concurrent
是要模拟的访问者数量。在这个例子中,我们告诉Siege模拟5个并发用户来生成一些流量而不会拖垮服务器。随着您越来越熟悉服务器的功能,您可以根据需要增加此数量。--time
是围攻将运行多长时间。此值可以设置S秒,M分钟和H小时。在这个例子中,我们告诉Siege再次运行30秒,以产生一些流量而不会压垮服务器。将来,您可以尝试不同的时间长度来查看服务器如何响应持续的流量负载。--log
是您希望Siege将其测试结果写入的位置路径。默认情况下,此位置是/var/log/siege.log
并且需要sudo权限。--file
是包含Siege将用于测试的URL的文件路径。首次启动Siege
时,它会报告您正在使用的版本号以及它正在模拟的并发用户数。然后,它告诉您测试已经开始。
** SIEGE 3.0.8
** Preparing 5 concurrent users for battle.
The server is now under siege...
一旦Siege完成运行或终止,它还将显示测试结果以及结果日志文件的位置。
...
Lifting the server siege... done.
Transactions: 157 hits
Availability: 100.00 %
Elapsed time: 29.72 secs
Data transferred: 0.15 MB
Response time: 0.49 secs
Transaction rate: 5.28 trans/sec
Throughput: 0.01 MB/sec
Concurrency: 2.59
Successful transactions: 161
Failed transactions: 0
Longest transaction: 0.74
Shortest transaction: 0.27
FILE: siege-internet.log
You can disable this annoying message by editing
the .siegerc file in your home directory; change
the directive 'show-logfile' to false.
由于输出中包含的统计数据很复杂,我们将在第7步中深入探讨它们。
现在,让我们以基准模式运行Siege,以发现网站一次能够提供的最大页面请求数。这可以尝试确定哪些其他技术可以改善您网站的性能。此外,基准模式可以突出显示资源瓶颈,您将在步骤8中更仔细地检查此模式时看到。
再次启动Siege,这次是在基准模式下,使用--benchmark
而不是--internet
。
$ siege --benchmark --time=30S --log="siege-benchmark.log" --file="urls_file"
输出遵循与以前相同的格式,但这次结果不同,因为模式不同。
** SIEGE 3.0.8
** Preparing 5 concurrent users for battle.
The server is now under siege...
Lifting the server siege... done.
Transactions: 444 hits
Availability: 100.00 %
Elapsed time: 29.72 secs
Data transferred: 18.16 MB
Response time: 0.49 secs
Transaction rate: 105.28 trans/sec
Throughput: 4.41 MB/sec
Concurrency: 14.14
Successful transactions: 421
Failed transactions: 0
Longest transaction: 0.74
Shortest transaction: 0.27
FILE: siege-benchmark.log
You can disable this annoying message by editing
the .siegerc file in your home directory; change
the directive 'show-logfile' to false.
与internet模式的统计数据一样,基准模式的统计数据很复杂。我们将在第7步和第8步深入探讨它们。
现在我们已经使用Siege对您的站点进行了测试和基准测试,我们可以更详细地探索输出并实际使用统计信息。
在了解您的网站性能,识别瓶颈以及决定升级工作重点的位置时,Siege可以成为强大的工具。它提供的统计数据涵盖了一系列指标,可以让您深入了解您的网站的整体健康状况。
正如我们在第6步中看到的,Siege的输出通常如下所示:
...
Transactions: 904 hits
Availability: 97.41 %
Elapsed time: 4.59 secs
Data transferred: 4.37 MB
Response time: 0.07 secs
Transaction rate: 196.95 trans/sec
Throughput: 0.95 MB/sec
Concurrency: 12.86
Successful transactions: 904
Failed transactions: 24
Longest transaction: 1.95
Shortest transaction: 0.00
...
具体来说,这些指标意味着
Transactions
是Siege发出的请求总数。Availability
是Web服务器响应的请求的百分比,包括4xx和 5xx级HTTP错误代码。Elapsed time
测试运行了多长时间。Data transferred
是Siege用于测试网站的带宽总量。Response time
是Web服务器响应请求所花费的平均时间。Transaction rate
是Web服务器每秒平均的事务数。Throughput
是Web服务器每秒服务的数据量。Concurrency
是打开的同时连接的平均数。Successful transactions
是HTTP状态代码小于400时响应的事务总数。Failed transactions
是HTTP状态代码大于400时响应的事务总数。Longest transaction
是最长请求完成的时间。Shortest transaction
是最短请求完成的时间。Transaction rate
和Failed transactions
为您的Web服务器的整体运行状况提供指标。
该Transaction rate
代表你的网站的速度,因为它是每秒你的Web服务器可以服务的页面数量。此数字越高,您的网站可以处理的访问者越多,访问者每页收到的访问者就越快。如果您使用Siege来提高网站的一般响应能力,那么这就是您想要增加的数字。
该Failed transactions
值指的是来自Web服务器的包含错误代码的任何响应,例如503 Service Unavailable
。这些错误通常指向诸如无法处理正在接收的请求数量的数据库或用尽RAM的Web服务器之类的问题。如果此数字不是零,您应该查看Web服务器的日志文件,以确切了解发生了哪些错误,并获得有关如何解决问题的指导。
当您进行更改以增加Transaction rate
和缩短Failed transactions
时间时,还要记住查看每次运行Siege时创建的日志文件,因为它包含您在终端中看到的所有相同统计信息以及测试日期和时间。这将有助于您跟踪工作的总体轨迹。
现在我们已经检查了Siege的输出以确定您的Web服务器的速度和稳健性,现在是时候看看我们如何使用相同的信息来识别和消除性能瓶颈。
在基准模式下,Siege每秒可以提供与Web服务器能够服务的数量一样多的请求。当服务器达到它可以服务的最大页数时,它已达到资源限制。
最有可能受影响的四种资源是:
为了充分利用基准测试模式,您需要在Siege的同时运行几个额外的工具,以便在Siege增加测试负载时监控系统中发生的情况。
您可以使用top(一种提供动态,实时的系统资源视图)的工具来监控前三种资源(RAM,CPU和磁盘使用情况)。
Ubuntu默认配置top,因此您无需安装它。只需运行top命令即可。
顶部显示的信息分为两部分。
top - 21:02:32 up 50 min, 1 user, load average: 0.07, 0.02, 0.00
Tasks: 102 total, 1 running, 101 sleeping, 0 stopped, 0 zombie
%Cpu(s): 37.3 us, 7.3 sy, 0.0 ni, 99.3 id, 8.3 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1015200 total, 63536 free, 431456 used, 520208 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 512308 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3249 www-data 20 0 469592 92276 33488 D 24.6 9.1 0:05.01 apache2
3239 www-data 20 0 442836 75080 41896 S 5.6 7.4 1:31.97 apache2
3572 www-data 20 0 424372 35272 21164 S 4.0 3.5 0:02.69 apache2
上部由前五行输出组成,显示当前系统使用情况的摘要。
下半部分显示了当前在系统上运行的各个服务器进程的列表,以及每个进程的标识号,所有者,优先级,nice值,虚拟内存使用,物理内存使用,共享内存使用,状态,CPU使用百分比,内存使用百分比,活动总时间和名称。
虽然top是管理流程和监控CPU使用的有用工具,但在这种情况下,我们希望在Siege基准测试下看到它可以显示关于我们系统的内容。
CPU使用率读取%Cpu(s): 37.3 us, 7.3 sy,
。这些值告诉我们,用户进程消耗了37.3%的CPU,系统进程消耗了7.3%。如果将这两个值相加,则将获得总CPU使用率。
如果您的服务器以100%或接近100%的CPU使用率运行,请检查进程列表中的顶部条目,以查看是否有一个或多个进程正在消耗异常大量的CPU。如果是这样,请考虑重新配置或微调进程以使用更少的CPU。如果不行的话,您可能需要升级服务器上的CPU。
现在,我们来看看内存使用情况。
top - 21:02:32 up 51 min, 1 user, load average: 0.21, 0.47, 0.80
Tasks: 102 total, 1 running, 101 sleeping, 0 stopped, 0 zombie
%Cpu(s): 17.4 us, 3.4 sy, 0.0 ni, 79.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 991.406 total, 223.914 free, 395.621 used, 371.871 buff/cache
MiB Swap: 0.000 total, 0.000 free, 0.000 used. 526.156 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3249 www-data 20 0 469592 92276 33488 D 24.6 9.1 0:05.01 apache2
3239 www-data 20 0 442836 75080 41896 S 5.6 7.4 1:31.97 apache2
3572 www-data 20 0 424372 35272 21164 S 4.0 3.5 0:02.69 apache2
默认情况下,RAM使用情况在第四行显示为千字节。在前面的示例输出中,我们将值转换为兆字节以使数字更易于使用。再按SHIFT+E
一次将值转换为千兆字节,然后继续按此SHIFT+E
键以回到默认的千字节显示。
该total值是服务器上可用的内存总量。请记住,内核在启动时会保留一些内存,因此1024
MB的计算机将在此处显示991 MB的内存。
avail Mem
显示系统上的剩余存储量。随着使用更多RAM,此数字将变小,最终将达到零。
与CPU使用情况一样,如果avail Mem
运行时接近零,请检查消耗异常大量内存的进程。如果可能的话,请重新配置或微调这些进程以使用更少的内存或升级服务器上的RAM大小。
最后,我们来看看磁盘使用情况。
top - 21:02:32 up 51 min, 1 user, load average: 0.21, 0.47, 0.80
Tasks: 102 total, 1 running, 101 sleeping, 0 stopped, 0 zombie
%Cpu(s): 17.4 us, 3.4 sy, 0.0 ni, 79.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 991.406 total, 223.914 free, 395.621 used, 371.871 buff/cache
MiB Swap: 0.000 total, 0.000 free, 0.000 used. 526.156 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3249 www-data 20 0 469592 92276 33488 D 24.6 9.1 0:05.01 apache2
3239 www-data 20 0 442836 75080 41896 S 5.6 7.4 1:31.97 apache2
3572 www-data 20 0 424372 35272 21164 S 4.0 3.5 0:02.69 apache2
我们感兴趣的磁盘使用情况是I /O等待,不是可用的磁盘空间有多少,而是有多少磁盘访问量减慢了服务器的速度。磁盘访问(特别是在使用机械硬盘的服务器上)非常慢时,每当服务器访问磁盘,CPU必须等待检索信息。
Top将此信息报告为wa
值。它表示CPU等待磁盘数据的空闲时间百分比。该数字应尽可能接近0.0。
在前面的示例中,wa值为31.6。这意味着CPU花费三分之一的时间等待来自磁盘的数据。这是一个大量的时间,它将严重影响网站性能。
I /O等待通常是访问磁盘以查找文件或重复调用本地数据库的结果。如果wa大于0.0,请考虑将静态资源移动到远程位置(如内容传送网络(CDN)),或研究减少应用程序对其相关本地数据库的跳闸次数的方法。
按Q退出。
我们将看到的最终资源是网络使用情况。为了监控这一点,我们将使用Bandwidth Monitor New Generation
工具。
使用apt-get
安装此工具,然后使用命令bwm-ng
运行它。
$ sudo apt-get install bwm-ng
$ bwm-ng
输出的顶部显示带宽监视器新一代的版本号,数据更新的频率(默认情况下每0.5秒),用于确定可用网络接口的输入源(在Linux上默认情况/proc/net/dev
)和statstic正在显示(rate
默认情况下使用数据)。
输出的底部包括一个表,该表报告每个网络接口的传入数据(Rx),传出数据(Tx)和总数据(Total)的数量。
最后一行显示所有网络接口的总值。
bwm-ng v0.6.1 (probing every 0.500s), press 'h' for help
input: /proc/net/dev type: rate
- iface Rx Tx Total
==============================================================================
lo: 0.00 KB/s 0.00 KB/s 0.00 KB/s
eth0: 30.99 KB/s 499.11 KB/s 530.11 KB/s
------------------------------------------------------------------------------
total: 30.99 KB/s 499.11 KB/s 530.11 KB/s
当网络带宽导致瓶颈时,通常是因为Tx
已经达到最大值。要解决此问题,请从托管服务提供商处获取服务器的连接速度,并将其与bwm-ng
显示的速度进行比较。如果bwm-ng
显示的速度始终等于或接近服务器可用的最大带宽,则您需要考虑升级主机方案或完全转移到其他提供商。
完成测试后,按CTRL+C
退出程序。
在本指南中,我们使用Siege基准测试工具和Sproxy代理服务器在Web服务器上生成可配置的负载,并将其推至最大吞吐量。这些工具对于任何网站部署都非常有用,因为它们有助于查明性能问题并规划升级。
有关减少磁盘I / O和内存瓶颈的另一种方法,请查看Varnish HTTP Cache。Varnish是一个易于使用的反向代理,可存储静态网站资产,减少RAM使用和磁盘I/O。
除了Siege测试工具之外,还有其他的Web性能测试工具,关于更多的Web测试的教程欢迎访问腾讯云+社区学习更多知识。
参考文献:《How to Benchmark a Website with Firefox, Siege, and Sproxy On Ubuntu 16.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。