如何在Web服务器中利用Apache JMeter执行负载测试
提供:ZStack云计算 系列教程本教程为利用Apache JMeter实现负载测试系列两篇中的第一篇。内容简介在本教程中,我们将了解如何利用Apache JMeter在Web应用环境下执行基本的负载与压力测试。我们还将探讨如何利用其图形用户界面构建测试规划并针对Web服务器运行测试。JMeter是一款开源桌面Java应用,旨在进行负载测试与性能评估。其可用于模拟多种场景下的负载情况并以各类方式输
提供:ZStack云计算
系列教程
本教程为利用Apache JMeter实现负载测试系列两篇中的第一篇。
内容简介
在本教程中,我们将了解如何利用Apache JMeter在Web应用环境下执行基本的负载与压力测试。我们还将探讨如何利用其图形用户界面构建测试规划并针对Web服务器运行测试。
JMeter是一款开源桌面Java应用,旨在进行负载测试与性能评估。其可用于模拟多种场景下的负载情况并以各类方式输出性能数据,包括CSV与XML文件以及图形等。由于其属于纯Java应用,因此适用于任何支持Java 6及更高版本的操作系统。
先决条件
为了完成本教程,大家需要拥有一台运行有JMeter的计算机,一台作为测试目标的Web服务器。除非大家确信其能够处理负载,否则千万不要直接针对生产服务器进行压力测试,这可能影响到服务器性能。
本示例中使用的测试目标服务器为1 CPU/ 512 MB内存VPS,在LEMP堆栈之上运行有WordPress,且来自NYC2 DigitalOcean数据中心。JMeter计算机则运行在DigitalOcean NYC办公室当中(旨在降低测试延迟)。
请注意,JMeter的测试结果取决于多种因素,包括可用系统资源(CPU与内存)以及JMeter与Web服务器间网络等。如果使用非图形模式或者将由多台JMeter服务器同时生成负载,则可实现更高的负载压力。
安装JMeter
由于我们使用的是Apache JMeter的桌面应用,因此可适合多种桌面操作系统。这里我们不会详尽说明JMeter在不同系统上的具体安装方式。总而言之,其安装非常简单,特别是使用软件包管理器(例如apt-get或者Homebrew)或者下载并解压JMeter二进制文件这两种方式。
以下为运行JMeter所需要的软件清单:
- Oracle Java或者OpenJDK (6或更高版本)
- Apache JMeter
根据Java的具体安装方式,大家可能需要向PATHenvironmental变更中添加Java bin目录,这样JMeter才能找到Java及其密钥工具二进制文件。
另外,我们还需要将JMeter的安装路径以¥JMETER_HOME的形式进行引用。因此,如果大家使用Linux或者Unix类系统,那么JMeter二进制文件将位于 JMETERHOME/bin/jmeter。如果是在Windows上,则可运行 JMETER_HOME/bin/jmeter.bat。
作为参考,我们使用以下软件版本:
- Oracle Java 7 update 60, 64-bit
- JMeter 2.11
JMeter安装完成并开始运行后,下面进入今天的正题!
构建一套基础测试规划
JMeter启动后,大家会看到图形用户界面中提供的空白Test Plan:
所谓测试规划,由一系列测试组件所构成,用于确定负载测试如何模拟并进行。下面我们来解释各组件的具体使用方式。
添加Thread Group
首先向Test Plan中添加一个Thread Group:
- 右键点击 Test Plan
- 鼠标悬停于Add >上方
- 鼠标悬停于Threads (Users) >上方
- 点击Thread Group
Thread Group拥有三大能够影响负载测试的重要属性:
- Number of Threads (users): JMeter将尝试模拟的用户数量。这里将其设置为50。
- Ramp-Up Period (in seconds): JMeter自分配线程开始的持续时长。将其设置为10。
- Loop Count: 测试的执行次数。这里将其设置为1。
添加HTTP Request Defaults
HTTP Request Defaults配置元素用于设置测试规划之内的HTTP请求默认值,其能够帮助我们向测试中的同一服务器发送多条HTTP请求。现在让我们将HTTP Request Defaults添加至Thread Group当中:
- 选定Thread Group并右键点击
- 鼠标悬停于Add >之上
- 鼠标悬停于Config Element >之上
- 点击HTTP Request Defaults
在HTTP Request Defaults当中的Web Server部分中,利用测试目标服务器的实际名称或IP地址填写Server Name or IP字段。在此Thread Group中的其余条目中,将该服务器同样设置为默认服务器。
添加HTTP Cookie Manager
如果大家的Web服务器使用cookies,则可通过向Thread Group中添加HTTP Cookie Manager实现cookies支持能力:
- 选定Thread Group后右键点击
- 鼠标悬停于Add >之上
- 鼠标悬停于Config Element >之上
- 点击HTTP Cookie Manager
添加HTTP Request Sampler
现在我们需要向Thread Group添加一个HTTP Request示例,其代表着每一线程(用户)将进行访问的页面请求:
- 选定Thread Group并右键点击
- 鼠标悬停于Add >
- 鼠标悬停于Sampler >
- 点击HTTP Request
在HTTP Request中的HTTP Request部分,根据各线程(用户)的请求指向填写Path。我们将其设为/,这样每个线程就能够访问服务器主页了。请注意,我们不需要在这里指定服务器本身,因为其已经在HTTP Request Defaults条目中指定完成。
注意:如果大家希望在测试中添加更多HTTP Request,可重复这一步骤。每个线程都会执行测试规划内的全部请求。
在Table监听器中添加查看结果
在JMeter中,监听器用于输出负载测试结果。其提供多种可用监听器类型,我们亦可安装插件以加入更多监听器。在这里我们使用Table,因为其形式更易于阅读。
- 选定Thread Group后右键点击
- 鼠标悬停于Add >
- 鼠标悬停于Listener >
- 点击View Results in Table
大家可能还需要为Filename输出一个值,以将结果输出至CSV文件。
运行基础测试规划
现在我们的基础测试规划已经设置完成,接下来运行并查看其结果。
首先点击File而后Save以存储测试规划,接下来指定需要的文件名称。而后在左侧窗格内选定View Results in Table,点击主菜单中的Run,然后点击 Start(或者直接点击主菜单下方的绿色Start箭头)。大家看到的结果应如下所示:
解释结果
大家可能看到全部请求的Status都为“Success”(以绿色三角形代表且包含复选标记)。在此之后,我们需要关注其中的Sample Time (ms)与Latency(示例截屏中并未出现)两列。
- Latency: JMeter发出请求与接收响应之间所间隔的毫秒数
- Sample Time: 服务器完成请求的整体毫秒时耗(响应加延迟)
根据生成的表格,Sample Time区间为128到164 ms。作为基础主页(55 KB大小),这一水平基本合理。如果大家的Web应用服务器资源比较充裕,那么Sample Time结果将主要受到地理距离以及请求大小的影响(分别影响延迟水平与传输时间)。各位的实际结果可能与本示例不同。
因此,我们的服务器顺利完成了10秒之内55 KB WordPres主页的50位用户并发访问模拟(相当于每秒5次)。下面来看增加线程数量后结果会有怎样的变化。
提升负载
下面我们试试在10秒钟内设置80个线程。在左侧窗格中的Thread Group内将Number of Threads (users)调整为80,而后点击View Results in Table与Start。示例结果如下所示:
可以看到,示例时间增加了近1秒,这意味着我们的Web应用服务器已经无法应对如此规模的请求。现在登录VPS并查看资源使用情况。
通过SSH登录Web服务器并运行top:
top
除非这时仍有用户在访问该服务器,否则其Cpu(s) % user usage(us)应该很低或者为0%,而Cpu(s)% idle(id)应为99%以上,如下所示:
现在在JMeter中再次进行测试,而后切换回Web服务器的SSH会话。大家应该看到资源使用量的增加情况:
在本示例中,CPU % user usage为94%,而system usage (sy)则为4.7%,idle为0%。我们的内存仍然够用,因此性能降低主要源自CPU计算资源不足!我们也可以看到负责支持WordPress的php5-fpm进程,其使用了大部分CPU资源(约总体占用量的96%)。
为了满足10秒内80用户模拟场景的资源需求,我们需要增加CPU容量或者优化服务器设置。在WordPress中,我们可以将MySQL数据库(其为CPU使用主力)移动至其它服务器并采用缓存机制(能够降低CPU使用量)。
如果大家感兴趣,也可以进一步调整线程数量,了解服务器在遭遇性能下滑前的最高可处理负载强度。在我们的1 CPU droplet示例中,其最高线程容量为10秒内72个。
总结
JMeter是一套极具价值的工具,能够帮助我们了解Web应用服务器的改进空间,从而降低瓶颈并提升性能。现在大家已经了解了JMeter的基本使用方式,接下来请随意设置场景以进一步摸索其功能。
我们在示例中使用的测试方式并不能准确反应普通用户的使用模式,但JMeter提供多种工具以执行极具现实意义的环境测试任务。例如,JMeter能够通过配置模拟单一用户登录应用、客户端缓存以及利用URL重写处理用户会话的场景。其中还包括其它多种采样器、监听器以及配置工具,旨在帮助大家建立自己需要的场景。另外,我们也可以从http://jmeter-plugins.org/处下载更多插件以增加其功能。
本文来源自DigitalOcean Community。英文原文:How To Use Apache JMeter To Perform Load Testing on a Web Server By Mitchell Anicas
翻译:diradw
更多推荐
所有评论(0)