如何使用Apache JMeter的要在Web服务器上执行负载测试

在本教程中,我们将复习如何使用Apache JMeter的在Web应用程序环境中执行基本负载和压力测试。我们将向你展示如何使用图形用户界面来建立一个测试计划,对运行的Web服务器测试。 JMeter是被设计为负载测试和衡量绩效的一个开源的桌面Java应用程序。

介绍

在本教程中,我们将讨论如何使用Apache JMeter在Web应用程序环境中执行基本的加载和压力测试。 我们将向您展示如何使用图形用户界面构建测试计划并针对Web服务器运行测试。

JMeter是一个开源桌面Java应用程序,旨在加载测试和测量性能。 它可用于以多种方式模拟各种场景的负载和输出性能数据,包括CSV和XML文件和图形。 因为它是100%的Java,它在支持Java 6或更高版本的每个操作系统上都可用。

先决条件

为了遵循本教程,您将需要有一台计算机,您可以运行JMeter和一个Web服务器来加载测试。 不要对生产服务器运行这些测试,除非您知道它们可以处理负载,否则可能会对服务器的性能产生负面影响。

您可以将本教程中的测试适用于您自己的任何Web应用程序。 我们正在测试的Web服务器是一个1 CPU / 512 MB VPS,在NYC2 DigitalOcean数据中心的LEMP上运行WordPress。 JMeter计算机在纽约的DigitalOcean办公室中运行(这与我们的测试的延迟有关)。

请注意,JMeter测试结果可能会受到各种因素的影响,包括JMeter可用的系统资源(CPU和RAM)以及JMeter和正在测试的Web服务器之间的网络。 通过以非图形模式运行测试或通过将负载生成分布到多个JMeter服务器,JMeter可以生成而不偏移结果的负载大小可以增加。

安装JMeter

因为我们使用Apache JMeter作为桌面应用程序,并且有大量不同的桌面操作系统在使用,我们不会涵盖任何特定操作系统的JMeter的安装步骤。 据说,JMeter是很容易安装。 最简单的安装方法是使用软件包管理器(例如apt-get或Homebrew),或从官方网站下载和取消归档JMeter二进制文件并安装Java(版本6或更高版本)。

这里是软件的列表,链接到档案馆,运行JMeter的要求

这取决于你如何安装Java,您可能需要在Java bin目录添加到您的PATH环境变量,这样的JMeter可以找到Java和密钥工具的二进制文件。

此外,我们将把您安装JMeter的(也就是说你未归档它的目录)作为路径$JMETER_HOME 因此,如果你是一个基于Unix的Linux或OS,JMeter的二进制文件位于$JMETER_HOME/bin/jmeter 如果您运行的是Windows,你可以运行$JMETER_HOME/bin/jmeter.bat

作为参考,在编写本教程时,我们使用以下软件版本:

  • Oracle Java 7更新60,64位
  • JMeter 2.11

一旦你有JMeter安装并运行,让我们继续构建一个测试计划!

构建基本测试计划

JMeter的启动之后,你应该看到一个空的测试计划的图形用户界面:

JMeter GUI

测试计划由确定如何模拟负载测试的一系列测试组件组成。 我们将解释如何在将这些组件添加到我们的测试计划中时使用这些组件。

添加线程组

首先,添加一个线程组 的测试计划

  1. 测试计划右键点击
  2. 将鼠标移到添加>
  3. 将鼠标移到线程(用户)>
  4. 点击线程组

线程组有三个特别重要的性能影响负载测试:

  • 线程(用户)数量 :这JMeter会尝试模拟用户的数量。 将其设置为50
  • 提升周期(秒):时间的持续时间的JMeter将在分配线程的开始。 将它设置为10。
  • 循环计数 :的次数来执行测试。 将此设定为1。

线程组属性

添加HTTP请求默认值

HTTP请求默认配置元件被用于在我们的测试计划HTTP请求设置默认值。 如果我们想要将多个HTTP请求发送到同一台服务器作为测试的一部分,这是非常有用的。 现在让我们添加HTTP请求默认 主题组

  1. 选择线程组 ,然后右键单击它,
  2. 将鼠标移到添加>
  3. 将鼠标移到配置元件>
  4. 点击HTTP请求默认值

在HTTP请求默认值,下的Web服务器部分,填补了服务器名称或IP字段与要测试Web服务器的名称或IP地址。 在这里设置服务器使其成为此线程组中其余项目的默认服务器。

HTTP请求默认值

如果您的网络服务器使用Cookie,您可以通过向线程组添加HTTP Cookie管理器来添加对Cookie的支持:

  1. 选择线程组 ,然后右键单击它,
  2. 将鼠标移到添加>
  3. 将鼠标移到配置元件>
  4. 点击HTTP Cookie管理器

添加HTTP请求采样器

现在,你将要增加一个HTTP请求取样器线程组 ,它代表一个页面请求,每个线程(用户)将访问:

  1. 选择线程组 ,然后右键单击它,
  2. 将鼠标移到添加>
  3. 将鼠标移到取样器>
  4. 点击HTTP请求

在HTTP请求,根据HTTP请求部分,填写与您要每个线程(用户)要求项目的路径 我们将它设置为/ ,所以每个线程将进入我们的服务器的主页。 请注意,您不需要在此项中指定服务器,因为它已在HTTP请求默认值项中指定。

注意:如果你想添加更多的HTTP请求作为测试的一部分,重复此步骤。 每个线程将执行此测试计划中的所有请求。

在表侦听器中添加查看结果

在JMeter中,监听器用于输出负载测试的结果。 有多种监听器可用,其他监听器可以通过安装插件来添加。 我们将使用表,因为它很容易阅读。

  1. 选择线程组 ,然后右键单击它,
  2. 将鼠标移到添加>
  3. 将鼠标移到监听>
  4. 点击表查看结果

您也可以为文件名的值输入到输出结果到CSV文件。

运行基本测试计划

现在我们已经设置了基本测试计划,让我们运行它并查看结果。

首先,点击文件,然后保存保存测试计划,然后指定所需的文件名。 然后在表查看结果左窗格中选择,然后从主菜单中运行,那么单击开始 (或点击下面的主菜单中的绿色开始箭头)。 您应该在表中看到测试结果,因为测试运行方式如下:

测试结果表

解释结果

您可能会看到所有请求的状态为“成功”(由带有复选标记的绿色三角形表示)。 在此之后,你可能在最感兴趣的列是采样时间(ms)等待时间 (例如,在不显示)的列。

  • 延迟 :当JMeter的发送请求时,接收到初始响应之间经过的毫秒数
  • 采样时间 :毫秒数服务器走上全面服务请求(响应+延迟)

根据生成的表,采样时间的范围为128-164 ms。 这是基本首页的合理响应时间(大约55 KB)。 如果您的Web应用程序服务器没有挣扎资源,如示例所示,您的采样时间将主要受地理距离(通常会增加延迟)和所请求项目的大小(其增加传输时间)的影响。 您的个人结果将与示例不同。

因此,我们的服务器幸存了我们的模拟50用户访问我们的55 KB WordPress主页超过10秒(每秒5次),具有可接受的响应。 让我们看看当我们增加线程数时会发生什么。

增加负载

让我们在10秒内尝试使用80个线程进行同样的测试。 在左窗格中的线程组项目, 线程(用户)号码更改为80。 现在单击表查看结果 ,然后单击开始 在我们的示例服务器上,结果如下表:

结果表2

如您所见,示例时间已增加到接近一秒,这表明我们的Web应用程序服务器开始变得负载过重的请求。 让我们登录到我们的VPS,看看在负载测试期间快速查看资源使用情况。

通过SSH登录到Web服务器并运行top

top

除非你有用户主动打你的服务器,你应该看到CPU(S)%的用户使用量( 我们 )应该是非常低的或0%,并且CPU(S)%闲置(ID)应该是99%+,像所以:

空闲顶部输出

现在,在JMeter的 ,重新开始测试,然后切换回Web服务器的SSH会话。 您应该会看到资源使用率增加:

最大CPU顶部输出

在我们的例子中的情况下,CPU%用户使用率94%,系统使用(SY)为4.7%与0%空闲。 我们没有用完内存,如上图所示,所以性能下降是由于缺乏CPU的力量! 我们还可以看到,服务于WordPress的php5-fpm进程正在使用大多数CPU(大约96%的组合)。

为了满足在10秒内对80个用户进行模拟的需求,我们需要增加CPU或优化我们的服务器设置以使用更少的CPU。 在WordPress的情况下,我们可以移动MySQL数据库(使用CPU的一部分)到另一个服务器,我们也可以实现缓存(这将减少CPU使用)。

如果你很好奇,你可以调整测试中的线程数,看看你的服务器可以处理多少开始展现性能下降。 在我们的1 CPUDroplet示例的情况下,它工作正常,直到我们使用72线程超过10秒。

结论

JMeter可以是一个非常有价值的工具,用于确定如何改进Web应用程序服务器设置,以减少瓶颈并提高性能。 既然您熟悉JMeter的基本用法,请随时创建新的测试计划,以在各种情况下衡量服务器的性能。

我们用作示例的测试不能准确反映正常用户的使用模式,但JMeter具有执行各种测试的工具,这些测试可能在您自己的环境中有用。 例如,JMeter可以配置为模拟用户登录到您的应用程序,客户端缓存,以及处理带有URL重写的用户会话。 还有许多其他内置采样器,监听器和配置工具,可以帮助您构建所需的场景。 此外,还有JMeter的插件来增强其功能,可供下载的http://jmeter-plugins.org/