如何使用ApacheBench在Ubuntu13.10VPS上进行负载测试
介绍
在任何部署之前进行负载测试是一个好主意。 在运行更详细的测试之前快速为项目建立最佳案例场景是很好的。
ApacheBench 工具 (ab) 可以通过发送任意数量的并发请求来加载测试服务器。 尽管 ab 是为测试 Apache 安装而设计的,但它也可用于对任何 HTTP 服务器进行基准测试。
在本教程中,我们将看到具有不同服务器的 Ruby 解释器如何在负载下执行。 教程步骤假定一个新的 Ubuntu 13.10 x32 映像。 结果来自一个 512 MB 的液滴。
安装
刷新包数据库。
apt-get update
安装 apache2-utils 包以访问 ApacheBench。
apt-get install apache2-utils
有限特权用户
接下来,创建将管理 Ruby 的用户。 以 root 身份运行下一节中的某些命令不是一个好主意。
useradd -m -d /home/test -s /bin/bash -g sudo test
这个命令完成了什么:
- useradd - 创建一个新用户
- -m - 创建主目录
- -d /home/test - 将用户的主目录设置为 /home/test
- -s /bin/bash - 使用户的默认shell bash(Ubuntu默认使用破折号)
- -g sudo - 将用户添加到 sudo 组(用于使用 sudo 运行命令)
- test - 新用户的名字
设置新用户的密码。
passwd test
切换到新用户。
su test
虚拟机
Ruby 版本管理器使使用不同的 Ruby 环境变得容易。 它负责安装特定 Ruby 版本和隔离 gemset 的过程。 它目前是通过从他们的网站运行 bash 脚本来安装的。
\curl -L https://get.rvm.io | bash -s stable
为了使用 rvm 命令,您需要首先运行 rvm 脚本。
source ~/.rvm/scripts/rvm
如果你愿意,你可以把它放在你的 .bashrc 中,这样 rvm 在你以用户身份登录的任何时候都可用。
echo "source ~/.rvm/scripts/rvm" >> ~./bashrc
您可以通过检查类型的头部来验证是否正在使用 rvm 脚本。 它应该是一个函数而不是散列。
type rvm | head -1 rvm is a function
接下来,安装 Ruby 2.0.0。 RVM 将询问用户的密码,因为它需要安装各种依赖项才能生成 Ruby。 由于 RVM 从源代码构建 Ruby,因此此步骤可能需要一段时间。
rvm install 2.0.0
切换到新的 Ruby。 这可能会在安装后默认发生,但检查并没有什么坏处。
rvm use 2.0.0
测试
现在已经安装了 Ruby,您可以创建一个简单的站点并查看它可以处理多少请求。
安装 Sinatra。 它是用于创建 Ruby Web 应用程序的微框架/DSL。 --no-* 标志跳过文档。
gem install sinatra --no-rdoc --no-ri
创建示例 sinatra 应用程序,它只是回显“hello world”。
cd ~ vim app.rb # app.rb require 'sinatra' get '/' do 'hello world' end
运行服务器。
ruby app.rb
随着服务器终于启动,您可以开始负载测试。 对 ab 的调用如下所示:
ab -n <num_requests> -c <concurrency> <addr>:<port><path>
打开另一个终端并再次 ssh 进入服务器。 使用 ApacheBench 运行测试。 我使用了 1000 个请求,并发性为 100。 不要忘记路径的最后一个“/”。
ab -n 1000 -c 100 http://localhost:4567/ Server Software: WEBrick/1.3.1 Server Hostname: localhost Server Port: 4567 Document Path: / Document Length: 11 bytes Concurrency Level: 100 Time taken for tests: 3.410 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 288000 bytes HTML transferred: 11000 bytes Requests per second: 293.23 [#/sec] (mean) Time per request: 341.034 [ms] (mean) Time per request: 3.410 [ms] (mean, across all concurrent requests) Transfer rate: 82.47 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 1 2.0 0 11 Processing: 185 332 90.3 311 578 Waiting: 28 280 83.2 267 574 Total: 193 333 89.7 311 578 Percentage of the requests served within a certain time (ms) 50% 311 66% 357 75% 423 80% 446 90% 467 95% 480 98% 490 99% 501 100% 578 (longest request)
我的结果收敛于大约 300 个请求/秒。 WEBrick 并不以速度着称。 继续使用 Ctrl-c 中断服务器。
安装薄
Thin 是一个流行的 ruby Web 服务器,它使用 Mongrel 进行解析,使用 EventMachine 进行非阻塞 IO。 安装 Thin 并再次运行服务器。 Sinatra 应该会自动加载 Thin 并让您知道(“…with backup from Thin”)。
gem install thin ruby app.rb
现在,再次尝试负载测试。 这次应该会快一些。
Server Software: thin Server Hostname: localhost Server Port: 4567 Document Path: / Document Length: 11 bytes Concurrency Level: 100 Time taken for tests: 1.339 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 244000 bytes HTML transferred: 11000 bytes Requests per second: 747.00 [#/sec] (mean) Time per request: 133.870 [ms] (mean) Time per request: 1.339 [ms] (mean, across all concurrent requests) Transfer rate: 178.00 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 1 1.8 0 8 Processing: 55 128 19.9 132 155 Waiting: 42 116 19.7 121 144 Total: 62 129 18.5 132 156 Percentage of the requests served within a certain time (ms) 50% 132 66% 135 75% 137 80% 139 90% 144 95% 149 98% 152 99% 155 100% 156 (longest request)
至少在这种情况下,看起来 Thin 以超过 700 个请求/秒的速度比 WEBrick 提供了一个明显更快的服务器(您可以尝试提高总请求数,但对我来说并没有提高多少)。
注意:我能够在 Arch Linux 小程序上获得 1000 个请求/秒。
结论
显然,这些结果并不能反映实际的服务器性能。 HTTP 只是其中的一部分。 缓慢的模板引擎和/或数据库会显着降低这些数字。 尽管如此,它还是为您提供了一个快速的大致数字进行比较。
您可能感兴趣的其他性能工具: