Apache Bench - 环境设置



在本章中,我们将指导您如何在 VPS 上为 Apache Bench 设置环境。

系统需求

  • 内存 − 128 MB

  • 磁盘空间 − 无最低要求

  • 操作系统 − 无最低要求

安装 Apache Bench

Apache Bench 是一个独立的应用程序,并且不依赖于 Apache Web 服务器的安装。以下是安装 Apache Bench 的两步过程。

步骤 1 − 更新软件包数据库。

# apt-get update

请注意,终端命令前的符号 # 表示 root 用户正在发出该命令。

步骤 2 − 安装 apache2 utils 软件包以访问 Apache Bench。

# apt-get install apache2-utils

Apache Bench 现在已安装。如果您想测试托管在同一 VPS 上的 Web 应用程序,则只需安装 Apache Web 服务器即可 -

# apt-get install apache2

作为 Apache 实用程序,Apache Bench 在安装 Apache Web 服务器时会自动安装。

验证 Apache Bench 安装

现在让我们看看如何验证 Apache Bench 安装。以下代码将帮助验证安装 -

# ab -V

输出

This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, https://apache.org/

当您看到上述终端输出时,表示您已成功安装 Apache Bench。

创建特权 Sudo 用户

从安全角度来看,建议系统管理员创建 sudo 用户而不是以 root 身份工作。我们将创建一个名为 test 的测试用户,用于此目的 -

# useradd -m -d /home/test -g sudo test

让我们为新用户设置密码 -

# passwd test

系统将提示您为用户 test 输入新密码。您可以输入一个简单的密码,因为我们只是在测试,而不是部署到生产服务器。通常,sudo 命令会提示您提供 sudo 用户密码;建议不要使用复杂密码,因为此过程会变得麻烦。

输出

Enter new UNIX password:
Retype new UNIX password:   
passwd: password updated successfully

测试 Apache.org 网站

在本节中,我们将测试 Apache.org 网站。让我们首先切换到 sudo 用户 test -

# su test

首先,我们将测试 Apache 组织的网站,https://apache.org/。我们将首先运行命令,然后理解输出 -

$ ab -n 100 -c 10 https://apache.org/

这里-n是为基准测试会话执行的请求数。默认值是只执行一个请求,这通常会导致基准测试结果不具有代表性。

并且-c是并发性,表示一次执行多个请求的数量。默认值是一次一个请求。

因此,在此测试中,Apache Bench 将以 10 的并发性向 Apache 组织服务器发出 100 个请求。

输出

This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, https://apache.org/

Benchmarking www.apache.org (be patient).....done

Server Software:        Apache/2.4.7
Server Hostname:        www.apache.org
Server Port:            443
SSL/TLS Protocol:       TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256

Document Path:          /
Document Length:        58769 bytes

Concurrency Level:      10
Time taken for tests:   1.004 seconds
Complete requests:      100
Failed requests:        0
Total transferred:      5911100 bytes
HTML transferred:       5876900 bytes
Requests per second:    99.56 [#/sec] (mean)
Time per request:       100.444 [ms] (mean)
Time per request:       10.044 [ms] (mean, across all concurrent requests)
Transfer rate:          5747.06 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       39   46  30.9     41     263
Processing:    37   40  21.7     38     255
Waiting:       12   15  21.7     13     230
Total:         77   86  37.5     79     301

Percentage of the requests served within a certain time (ms)
  50%     79
  66%     79
  75%     80
  80%     80
  90%     82
  95%     84
  98%    296
  99%    301
 100%    301 (longest request)

运行我们的第一个测试后,很容易识别此命令的使用模式,如下所示 -

# ab [options .....]  URL

其中,

  • ab − Apache Bench 命令

  • options − 我们要执行的特定任务的标志

  • URL − 我们要测试的路径 URL

理解输出值

我们需要了解不同的指标以理解 ab 返回的各种输出值。以下是列表 -

  • 服务器软件 − 这是第一个成功返回的 HTTP 标头中返回的 Web 服务器名称。

  • 服务器主机名 − 这是命令行上给定的 DNS 或 IP 地址。

  • 服务器端口 − 这是 ab 连接到的端口。如果命令行上未给出端口,则默认为 http 的 80 和 https 的 443。

  • SSL/TLS 协议 − 这是客户端和服务器之间协商的协议参数。仅当使用 SSL 时才会打印此内容。

  • 文档路径 − 这是从命令行字符串解析的请求 URI。

  • 文档长度 − 它是第一个成功返回的文档的大小(以字节为单位)。如果文档长度在测试期间发生变化,则响应被视为错误。

  • 并发级别 − 这是测试期间使用的并发客户端(相当于 Web 浏览器)的数量。

  • 测试花费的时间 − 这是从创建第一个套接字连接的那一刻到接收最后一个响应的那一刻所花费的时间。

  • 完成的请求 − 收到的成功响应数。

  • 失败的请求 − 被视为失败的请求数。如果此数字大于零,则将打印另一行,显示由于连接、读取、内容长度不正确或异常而导致失败的请求数。

  • 总传输量 − 从服务器接收到的字节总数。此数字本质上是从网络上传输的字节数。

  • HTML 传输量 − 从服务器接收到的文档字节总数。此数字不包括在 HTTP 标头中接收到的字节

  • 每秒请求数 − 这是每秒请求数。此值是将请求数除以总花费时间的计算结果。

  • 每个请求的时间 − 平均每个请求花费的时间。第一个值使用公式 concurrency * timetaken * 1000 / done 计算,而第二个值使用公式 timetaken * 1000 / done 计算

  • 传输速率 − 使用公式 totalread / 1024 / timetaken 计算的传输速率。

负载测试输出的快速分析

在了解了 ab 命令输出值的标题后,让我们尝试分析和理解我们初始测试的输出值 -

  • Apache 组织正在使用他们自己的 Web 服务器软件 - Apache(版本 2.4.7)

  • 由于 https,服务器正在端口 443 上侦听。如果是 http,它将是 80(默认值)。

  • 100 个请求的总数据传输量为 58769 字节。

  • 测试在 1.004 秒内完成。没有失败的请求。

  • 每秒请求数 - 99.56。这被认为是一个相当不错的数字。

  • 每个请求的时间 - 100.444 毫秒(对于 10 个并发请求)。因此,在所有请求中,它是 100.444 毫秒/10 = 10.044 毫秒。

  • 传输速率 - 接收到的 1338.39 [Kbytes/sec]。

  • 在连接时间统计信息中,您可以观察到许多请求必须等待几秒钟。这可能是由于 apache web 服务器将请求放入等待队列中。

在我们的第一个测试中,我们测试了托管在不同服务器上的应用程序(即 www.apache.org)。在本教程的后面部分,我们将测试托管在与我们运行 ab 测试相同的服务器上的示例 Web 应用程序。这是为了便于学习和演示。理想情况下,主机节点和测试节点应该不同,以便进行准确的测量。

为了更好地学习 ab,您应该比较和观察输出值在不同情况下如何变化,因为我们将在本教程中继续前进。

绘制 Apache Bench 的输出

在这里,我们将绘制相关结果以查看服务器随着请求数量的增加需要花费多长时间。为此,我们将在先前的命令中添加-g选项,后跟 ab 输出数据将保存到的文件名(此处为 out.data) -

$ ab -n 100 -c 10 -g out.data https://apache.org/

现在让我们看看out.data,然后我们创建绘图 -

$ less out.data

输出

starttime       seconds ctime   dtime   ttime   wait
Tue May 30 12:11:37 2017        1496160697      40      38      77      13
Tue May 30 12:11:37 2017        1496160697      42      38      79      13
Tue May 30 12:11:37 2017        1496160697      41      38      80      13
...

现在让我们了解out.data文件中的列标题 -

  • starttime − 这是调用开始的日期和时间。

  • seconds − 与 starttime 相同,但采用 Unix 时间戳格式(date -d @1496160697 返回 starttime 输出)。

  • ctime − 这是连接时间。

  • dtime − 这是处理时间。

  • ttime − 这是总时间(在数学上,ttime = ctime + dtime)。

  • wait − 这是等待时间。

有关这些多个项目如何相互关联的图形化可视化,请查看以下图像 -

Multiple Items

如果我们正在终端或图形不可用的地方工作,gnuplot是一个不错的选择。我们将通过以下步骤快速了解它。

让我们安装并启动 gnuplot -

$ sudo apt-get install gnuplot  
$ gnuplot

输出

G N U P L O T
Version 4.6 patchlevel 6    last modified September 2014
Build System: Linux x86_64

Copyright (C) 1986-1993, 1998, 2004, 2007-2014
Thomas Williams, Colin Kelley and many others

gnuplot home:     http://www.gnuplot.info
faq, bugs, etc:   type "help FAQ"
immediate help:   type "help"  (plot window: hit 'h')

Terminal type set to 'qt'
gnuplot>

由于我们正在终端上工作,并假设图形不可用,我们可以选择哑终端,它将在终端本身输出 ASCII。这有助于我们了解我们使用此快速工具的绘图外观。现在让我们准备终端以进行 ASCII 绘图。

gnuplot> set terminal dumb

输出

Terminal type set to 'dumb'
Options are 'feed  size 79, 24'

由于我们的 gnuplot 终端现在已准备好进行 ASCII 绘图,让我们绘制out.data文件中的数据 -

gnuplot> plot "out.data" using 9  w l

输出

  1400 ++-----+------+-----+------+------+------+------+-----+------+-----++
       +      +      +     +      +      +      +"out.data" using 9 ****** +
       |                                                                   |
  1200 ++                       ********************************************
       |     *******************                                           |
  1000 ++    *                                                            ++
       |     *                                                             |
       |     *                                                             |
   800 ++   *                                                             ++
       |    *                                                              |
       |    *                                                              |
   600 ++   *                                                             ++
       |    *                                                              |
       |    *                                                              |
   400 ++   *                                                             ++
       |    *                                                              |
   200 ++   *                                                             ++
       |    *                                                              |
       +****  +      +     +      +      +      +      +     +      +      +
     0 ++-----+------+-----+------+------+------+------+-----+------+-----++
       0      10     20    30     40     50     60     70    80     90    100

我们绘制了 ttime,总时间(以毫秒为单位),来自第 9 列,相对于请求数。我们可以注意到,对于最初的十个请求,总时间接近 100 毫秒,对于接下来的 30 个请求(从第 10 个到第 40 个),它增加到 1100 毫秒,依此类推。您的绘图必须根据您的out.data有所不同。

广告