介绍
在任何部署之前进行负载测试是一个好主意。 虽然这不是什么可以忽略的,但有时在运行更详细的测试之前快速建立一个项目的最佳情况是很好的。
ApacheBench 工具 (ab) 可以通过发送任意数量的并发请求来加载测试服务器。 尽管 ab 是为测试 Apache 安装而设计的,但它也可用于对任何 HTTP 服务器进行基准测试。
在本教程中,我们将看到具有不同服务器的 Ruby 解释器如何在负载下执行。 教程步骤假设一个全新的 Arch Linux x86_64 映像。 结果来自一个 512 MB 的液滴。
安装
刷新包数据库。
pacman -Sy
安装 apache 包以访问 ApacheBench。 或者,它包含在 AUR 的 apache-tools 包中。
pacman -S apache
有限特权用户
接下来,创建将管理 Ruby 的用户。 以 root 身份运行下一节中的某些命令不是一个好主意。
useradd -m -d /home/test test
切换到新用户。
su test
虚拟机
Ruby 版本管理器 可以轻松使用不同的 Ruby 环境。 它负责安装特定 Ruby 版本和隔离 gemset 的过程。 它目前是通过从他们的网站运行 bash 脚本来安装的。
\curl -L https://get.rvm.io | bash -s stable
为了使用 rvm 命令,您需要首先运行 rvm 脚本。
source ~/.rvm/scripts/rvm
接下来,安装 Ruby 2.0.0。 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 ~ vi 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: 0.0.0.0 Server Port: 4567 Document Path: / Document Length: 11 bytes Concurrency Level: 100 Time taken for tests: 2.950 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 288000 bytes HTML transferred: 11000 bytes Requests per second: 338.94 [#/sec] (mean) Time per request: 295.041 [ms] (mean) Time per request: 2.950 [ms] (mean, across all concurrent requests) Transfer rate: 95.33 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 1 2.8 0 15 Processing: 117 285 94.3 268 553 Waiting: 70 248 91.8 234 544 Total: 117 286 93.6 271 553 Percentage of the requests served within a certain time (ms) 50% 271 66% 327 75% 354 80% 361 90% 413 95% 468 98% 512 99% 539 100% 553 (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
现在,再次尝试负载测试。 这次应该会快一些。
注意:Thin 似乎不允许通过 localhost 连接 ApacheBench,但它允许 0.0.0.0 或 127.0.0.1。
ab -n 1000 -c 100 http://0.0.0.0:4567/ ... Concurrency Level: 100 Time taken for tests: 0.989 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 244000 bytes HTML transferred: 11000 bytes Requests per second: 1011.13 [#/sec] (mean) Time per request: 98.899 [ms] (mean) Time per request: 0.989 [ms] (mean, across all concurrent requests) Transfer rate: 240.93 [Kbytes/sec] received ...
至少在这种情况下,看起来 Thin 以超过 1000 个请求/秒的速度比 WEBrick 提供了一个明显更快的服务器(您可以尝试提高总请求数,但对我来说并没有提高多少)。 不错。
结论
显然,这些结果并不能反映实际的服务器性能。 HTTP 只是其中的一部分。 缓慢的模板引擎和/或数据库会显着降低这些数字。 尽管如此,它还是为您提供了一个快速的大致数字进行比较。
您可能感兴趣的其他性能工具: