介绍
在本教程中,我们将介绍如何使用 Apache JMeter 在您的 Web 应用程序环境中执行基本的负载和压力测试。 我们将向您展示如何使用图形用户界面来构建测试计划并针对 Web 服务器运行测试。
JMeter 是一个开源桌面 Java 应用程序,旨在负载测试和测量性能。 它可用于模拟各种场景的负载并以多种方式输出性能数据,包括 CSV 和 XML 文件以及图形。 因为它是 100% Java,所以它在支持 Java 6 或更高版本的每个操作系统上都可用。
先决条件
为了学习本教程,您需要有一台可以运行 JMeter 的计算机,以及一个用于负载测试的 Web 服务器。 除非您知道它们可以处理负载,否则不要对您的生产服务器运行这些测试,否则您可能会对服务器的性能产生负面影响。
您可以将本教程中的测试应用到您自己的任何 Web 应用程序中。 作为示例,我们正在测试的 Web 服务器是在 NYC2 DigitalOcean 数据中心的 LEMP 堆栈上运行 WordPress 的 1 CPU / 512 MB VPS。 JMeter 计算机在纽约市的 DigitalOcean 办公室运行(这与我们测试的延迟有关)。
请注意,JMeter 测试结果可能会受到多种因素的影响,包括 JMeter 可用的系统资源(CPU 和 RAM)以及 JMeter 和正在测试的 Web 服务器之间的网络。 通过在非图形模式下运行测试或将负载生成分布到多个 JMeter 服务器,可以增加 JMeter 可以在不影响结果的情况下生成的负载大小。
安装 JMeter
由于我们使用 Apache JMeter 作为桌面应用程序,并且使用的桌面操作系统种类繁多,因此我们不会介绍任何特定操作系统的 JMeter 安装步骤。 话虽如此,JMeter 很容易安装。 最简单的安装方法是使用包管理器(例如 apt-get 或 Homebrew),或从官方站点下载并解压缩 JMeter 二进制文件并安装 Java(版本 6 或更高版本)。
这是软件列表,带有档案链接,需要来运行JMeter:
- Oracle Java 或 OpenJDK(6 或更高版本)
- 阿帕奇 JMeter
根据您安装 Java 的方式,您可能需要将 Java bin 目录添加到您的 PATH
环境变量中,以便 JMeter 可以找到 Java 和 keytool 二进制文件。
此外,我们将您安装 JMeter 的路径(您将其解压缩到的目录)称为 $JMETER_HOME
。 因此,如果您使用的是基于 Linux 或 Unix 的操作系统,则 JMeter 二进制文件位于 $JMETER_HOME/bin/jmeter
。 如果您运行的是 Windows,则可以运行 $JMETER_HOME/bin/jmeter.bat
。
作为参考,在编写本教程时,我们使用了以下软件版本:
- Oracle Java 7 更新 60、64 位
- JMeter 2.11
安装并运行 JMeter 后,让我们继续构建测试计划!
建立一个基本的测试计划
启动 JMeter 后,您应该会看到带有空 Test Plan 的图形用户界面:
测试计划由一系列测试组件组成,这些组件确定如何模拟负载测试。 当我们将这些组件添加到我们的测试计划中时,我们将解释如何使用它们。
添加线程组
首先,将 Thread Group 添加到 Test Plan:
- 右键单击测试计划
- 将鼠标悬停在 添加 >
- 将鼠标悬停在 线程(用户)>
- 点击线程组
Thread Group 具有三个影响负载测试的特别重要的属性:
- 线程数(用户):JMeter 将尝试模拟的用户数。 将此设置为 50
- Ramp-Up Period(以秒为单位):JMeter 将分配线程开始的持续时间。 将此设置为 10。
- Loop Count:执行测试的次数。 将此设置保留为 1。
添加 HTTP 请求默认值
HTTP Request Defaults 配置元素用于在我们的测试计划中设置 HTTP 请求的默认值。 如果我们想在测试中向同一服务器发送多个 HTTP 请求,这将特别有用。 现在让我们将 HTTP Request Defaults 添加到 Thread Group:
- 选择线程组,然后右键单击它
- 将鼠标悬停在 添加 >
- 将鼠标悬停在 配置元素 >
- 单击 HTTP 请求默认值
在 HTTP 请求默认值中,在 Web 服务器部分下,使用您要测试的 Web 服务器的名称或 IP 地址填写 服务器名称或 IP 字段。 在此处设置服务器使其成为该线程组中其余项目的默认服务器。
添加 HTTP Cookie 管理器
如果您的 Web 服务器使用 cookie,您可以通过将 HTTP Cookie 管理器添加到线程组来添加对 cookie 的支持:
- 选择线程组,然后右键单击它
- 将鼠标悬停在 添加 >
- 将鼠标悬停在 配置元素 >
- 点击 HTTP Cookie 管理器
添加 HTTP 请求采样器
现在您需要将 HTTP Request 采样器添加到 Thread Group,它表示每个线程(用户)将访问的页面请求:
- 选择线程组,然后右键单击它
- 将鼠标悬停在 添加 >
- 将鼠标悬停在 采样器 >
- 点击 HTTP 请求
在 HTTP 请求中,在 HTTP 请求部分下,使用您希望每个线程(用户)请求的项目填写 Path。 我们将其设置为 /
,因此每个线程都将访问我们服务器的主页。 请注意,您不需要在此项中指定服务器,因为它已在 HTTP 请求默认值项中指定。
注意: 如果您想在测试中添加更多 HTTP 请求,请重复此步骤。 每个线程都将执行此测试计划中的所有请求。
在表侦听器中添加查看结果
在 JMeter 中,监听器用于输出负载测试的结果。 有多种监听器可用,其他监听器可以通过安装插件来添加。 我们将使用该表,因为它易于阅读。
- 选择线程组,然后右键单击它
- 将鼠标悬停在 添加 >
- 将鼠标悬停在 Listener >
- 点击在表中查看结果
您还可以为 Filename 键入一个值,以将结果输出到 CSV 文件。
运行基本测试计划
现在我们已经设置了基本的测试计划,让我们运行它并查看结果。
首先,通过单击 File 然后单击 Save 保存测试计划,然后指定所需的文件名。 然后在左侧窗格中选择 View Results in Table,然后从主菜单中单击 Run,然后单击 Start(或者只需单击下面的绿色开始箭头主菜单)。 当测试运行时,您应该在表中看到测试结果,如下所示:
解释结果
您可能会看到所有请求的状态都是“成功”(由带有复选标记的绿色三角形指示)。 之后,您可能最感兴趣的列是 Sample Time (ms) 和 Latency(示例中未显示)列。
- Latency:JMeter 发送请求和收到初始响应之间经过的毫秒数
- Sample Time:服务器完全服务请求所用的毫秒数(响应+延迟)
根据生成的表格,Sample Time 的范围是 128-164 ms。 这是基本主页(大约 55 KB)的合理响应时间。 如果您的 Web 应用程序服务器没有为资源而苦苦挣扎,如示例中所示,您的采样时间将主要受地理距离(通常会增加延迟)和请求项目的大小(这会增加传输时间)的影响。 您的个人结果将与示例不同。
因此,我们的服务器在我们模拟 50 个用户在 10 秒内(每秒 5 个)访问我们的 55 KB WordPress 主页的模拟中幸存下来,并获得了可接受的响应。 让我们看看当我们增加线程数时会发生什么。
增加负载
让我们在 10 秒内用 80 个线程尝试相同的测试。 在左侧窗格的线程组项中,将线程(用户)数更改为80。 现在单击 View Results in Table,然后单击 Start。 在我们的示例服务器上,这会产生下表:
如您所见,采样时间已增加到近一秒,这表明我们的 Web 应用程序服务器开始因请求而变得不堪重负。 让我们登录到我们的 VPS,快速查看负载测试期间的资源使用情况。
通过 SSH 登录到您的 Web 服务器并运行 top
:
top
除非您有用户主动访问您的服务器,否则您应该看到 Cpu(s) % 用户使用率 (us) 应该非常低或 0%,并且 Cpu(s) % 空闲 ( id) 应该是 99%+,像这样:
现在,在 JMeter 中,再次开始测试,然后切换回 Web 服务器的 SSH 会话。 您应该会看到资源使用量增加:
在我们的示例中,CPU % 用户使用率为 94%,系统使用率 (sy) 为 4.7%,空闲率为 0%。 如上图所示,我们并没有耗尽内存,因此性能下降是由于 CPU 能力不足! 我们还可以看到,为 WordPress 服务的 php5-fpm 进程正在使用大部分 CPU(大约 96% c 组合)。
为了在 10 秒内满足 80 个用户的模拟需求,我们需要增加 CPU 或优化我们的服务器设置以使用更少的 CPU。 对于 WordPress,我们可以将 MySQL 数据库(使用部分 CPU)移动到另一台服务器,还可以实现缓存(这将减少 CPU 使用率)。
如果您好奇,您可以调整测试中的线程数,以查看您的服务器在开始表现出性能下降之前可以处理多少。 在我们的 1 个 CPU 液滴示例中,它可以正常工作,直到我们在 10 秒内使用 72 个线程。
结论
JMeter 是一个非常有价值的工具,可用于确定应如何改进 Web 应用程序服务器设置,以减少瓶颈并提高性能。 现在您已经熟悉了 JMeter 的基本用法,可以随意创建新的测试计划来衡量您的服务器在各种场景中的性能。
我们用作示例的测试并不能准确反映普通用户的使用模式,但 JMeter 具有执行各种测试的工具,这些测试可能对您自己的环境有用。 例如,可以将 JMeter 配置为模拟用户登录到您的应用程序、客户端缓存以及通过 URL 重写处理用户会话。 还有许多其他内置的采样器、侦听器和配置工具可以帮助您构建所需的场景。 此外,还有一些 JMeter 插件可以增强其功能,可从 http://jmeter-plugins.org/ 下载。