在Web应用程序上执行压力测试?


243

过去,我使用Microsoft Web Application Stress Tool和Pylot对Web应用程序进行压力测试。我编写了一个简单的主页,登录脚本和网站演练(在一个电子商务网站中,向购物车中添加了一些商品并结帐)。

仅仅与少数开发人员一起努力访问主页几乎总是可以找到一个主要问题。更多的可扩展性问题将在发布的第二阶段甚至更多阶段出现。

我使用的工具的URL是Microsoft Homer(又名Microsoft Web Application Stress Tool)和Pylot

这些工具生成的报告对我而言从来没有多大意义,我将花费大量时间试图弄清楚该站点能够支持哪种并发负载。始终值得这样做,因为总是会出现最愚蠢的错误和瓶颈(例如,Web服务器配置错误)。

您做了什么,使用了哪些工具,您的方法取得了成功?对我来说最有趣的部分是提出一种有意义的公式,用于根据压力测试应用程序报告的数量来计算应用程序可以支持的并发用户数。

Answers:


110

这是JMeter的另一票。

JMeter是用Java编写的开源负载测试工具。它能够测试多种不同的服务器类型(例如,Web,Web服务,数据库,以及几乎所有使用请求的东西)。

但是,一旦开始进行复杂的测试,它的学习曲线确实很陡峭,但这是值得的。您可以非常快速地启动并运行,并且根据要进行的压力测试类型而定,可能会很好。

优点:

  • Apache项目中的开源/免费工具(帮助购买)
  • 易于上手,一旦掌握了核心概念,就易于使用。(即,如何创建请求,如何创建断言,如何使用变量等)。
  • 非常可扩展。我已经用11台机器运行了测试,这些机器在服务器上产生的负载几乎达到每小时一百万次命中。它比我预期的容易得多。
  • 拥有活跃的社区和良好的资源来帮助您入门和运行。首先阅读教程,并玩一会儿。

缺点:

  • UI用Swing编写。(啊!)
  • JMeter通过解析服务器返回的响应文本来工作。因此,如果您想验证任何一种JavaScript行为,那么您就不走运了。
  • 对于非程序员,学习曲线陡峭。如果您熟悉正则表达式,那么您已经领先于游戏了。
  • 支持论坛中有大量的(insert expivetive)蠢货,他们会提出愚蠢的问题,如果他们给文档提供粗略的浏览就可以轻松解决。(“如何使用JMeter对Windows GUI进行压力测试”显示得非常频繁)。
  • 报告“开箱即用”尚需时日,特别是对于大型测试。在上面提到的测试中,我最终不得不编写一个快速的控制台应用程序来执行一些从“ xml-logfile”到“ html”的转换。不过那是几年前的事,因此很可能不再需要。

请澄清一下,JMeter是否可以帮助您测试安装在远程VPS上的应用程序?我不知道,因为它是桌面版
拉哈特·古普塔

1
要注意的另一个与JMeter相关的选项是JMeter即服务。这些类型的SaaS提供了高度可扩展的JMeter并大大改善了报告功能。
Ophir Prusak 2014年

5
我不同意JMeter具有很好的可扩展性。每小时一百万个请求仅每秒278个请求,与其他工具相比,在11台计算机上运行,​​这是极低的。我实际上会将JMeter的可伸缩性放在缺点方面。
Heyman 2014年

JMeter不是浏览器,它可以在协议级别运行。就Web服务和远程服务而言,JMeter看起来像一个浏览器(或者说多个浏览器)。但是,JMeter不会执行浏览器支持的所有操作。Web应用程序应“执行”才能执行。
LeonanCarvalho

36

我用过《磨床》。它是开源的,非常易于使用,并且可配置。它基于Java,并使用Jython编写脚本。我们将其针对.NET Web应用程序运行,因此不要以为它只是Java工具(从本质上讲,任何Web压力工具都不应与其使用的平台绑定)。

我们用它做了一些整洁的事情……我们是一个基于Web的电信应用程序,所以我设置的一个很酷的用途是模仿通过我们的Web应用程序拨打电话,然后使用我们拥有的自动应答工具(基本上是一个教程) Microsoft的应用程序以连接到其RTC LCS服务器……这是Microsoft Office Communicator在本地网络上连接的……然后进行了修改,以自动接听电话)。然后,这使我们可以使用它代替昂贵的电话工具The Hammer(或类似的东西)。

无论如何,我们还使用该工具来查看我们的应用程序如何在高负载下保持稳定,并且在发现瓶颈方面非常有效。该工具内置了报告功能,可以显示请求花费了多长时间,但我们从未使用过。日志还可以存储所有响应和诸如此类的内容,也可以存储自定义日志。

我强烈推荐这个工具,它对价格非常有用...但是希望使用它进行一些自定义设置(它具有内置的代理来记录脚本,但是可能需要自定义才能捕获类似会话的内容...我知道我必须对其进行自定义,以利用每个线程的唯一会话)。


1
磨床+1。我特别喜欢代理脚本选项。
davek

这可以用来模拟一个空闲的浏览器。我们的应用每两秒钟从一个空闲的浏览器发出服务器请求。我想知道当我们有三十个并发的空闲浏览器时会发生什么。
拉米

1
磨床+1。与EC2配对使用,我们已经成功地使用它来增加10万个并发用户。
nategood 2012年

23

参加这个聚会有点晚了。我同意Pylot是目前最好的新兴开源工具。它简单易用,并得到了一个好人(Corey Goldberg)的积极努力。作为OpenQA的创始人,我也很高兴Pylot现在已在我们的主页上列出并使用了我们的一些基础架构(即论坛)。

但是,我最近还认为,负载测试的整个概念都是有缺陷的:模拟HTTP流量以及应用程序已经变得如此复杂,这是一团糟。这就是为什么我创建了商业工具BrowserMob。这是一个外部负载测试服务,在回放负载时使用Selenium来控制实际的Web浏览器。

这种方法显然需要比正常负荷测试技术更多的硬件,但硬件实际上是相当便宜的,当你正在使用云计算。这样做的一个好处是,脚本编写比普通的负载测试容易得多。您不必进行任何高级正则表达式匹配(如JMeter要求的)即可提取Cookie,.NET会话状态,Ajax请求参数等。由于您使用的是真正的浏览器,因此它们仅能执行应做的事情。

很抱歉公然推销一种商业产品,但是希望这个概念对某些人很有趣,并且至少让他们在可以使用大量额外的硬件时思考一些新的方式来处理负载测试!


2
Pylot的作者还创建了另一个网络测试工具:code.google.com/p/multi-mechanize
codeape 2011年

2
pylot.org的链接重定向到一些可疑的网站。
mpiktas

15

我用过JMeter。除了测试Web服务器之外,您还可以测试数据库后端,消息服务和电子邮件服务器。



9

为了简单使用,我进行了ab(apache基准测试)和围攻,由于ab不支持cookie,并且以后会从动态站点创建无休止的会话,因此需要使用ab。

两者都很容易开始:

ab -c n -t 30 url

siege -b -c n -t 30s url

攻城游戏可以使用更多网址。

最后的攻城版本在siegerc中打开了详细信息,这很烦人。您只能通过编辑该文件(/usr/local/etc/siegerc)来禁用它。


9

对于基于Web的服务,请查看loader.io

摘要:

loader.io是一项免费的负载测试服务,可让您通过成千上万的并发连接对Web-app / api进行压力测试。

他们也有一个API


2
这是用自己的机器测试自己的机器的好选择
nurettin

9

由于这个问题仍然悬而未决,所以我不妨考虑一下。

好消息是,在过去的5年左右的时间里,开放源代码工具已经真正成熟并在太空中流行起来,坏消息是其中有很多这样的工具。

这是我的想法:

Jmeter vs磨床

Jmeter由XML样式规范驱动,该规范是通过GUI构造的。

Grinder在多线程Java框架内使用Jython脚本,因此更加面向程序员。

两种工具都将处理HTTP和HTTPS,并具有代理记录器以帮助您入门。两种工具都使用Controller模型来驱动多个测试代理,因此可伸缩性不是问题(允许访问云)。

哪个更好:-

当您遇到URL重写,关联,为每个虚拟用户提供唯一数据并模拟首次或返回用户(通过操作HTTP标头)的更复杂的脚本要求时,这两种工具的学习曲线都是艰难的。

就是说,我将从Jmeter开始,因为该工具拥有大量关注者,并且网络上有许多使用此工具的示例和教程。如果而且当您遇到“路障”时,使用Jmeter无法轻松地做到这一点,那么请看一下Grinder。好消息是这两个工具都具有相同的Java要求,而且“混搭”解决方案也不是没有问题。

要添加的新内容–运行多个Selenium WebDriver实例的无头浏览器。

这是一种相对较新的方法,因为它依赖于现在可以从云中配置的资源的可用性。通过这种方法,Selenium(WebDriver)脚本可以在多个线程的无头浏览器(即WebDriver = New HtmlUnitDriver())驱动程序中运行。

根据经验,可以从Amazon M1 Small Instance执行大约25个“无头浏览器”实例。

这意味着当您将功能测试脚本重新用作性能测试脚本时,所有相关的url重写问题都会消失。

与HTTP驱动程序(例如Grinder或Jmeter)相比,可伸缩性受到损害,因为需要更多的VM来驱动负载。就是说,如果您希望驱动500个虚拟用户,然后以每小时1.20美元的成本使用20个Amazon Small Instance(每个小时6美分),则您的负载非常接近真实用户体验。


Grinder也可以使用Clojure脚本。
user100464

7

此外,还有一个很棒的开源纯Python分布式可缩放蝗虫框架,该框架使用greenlets。模拟大量并发用户非常有用。


7

我们最近开始使用Gatling进行负载测试。我强烈建议尝试使用此工具进行负载测试。我们过去曾经使用过SOASTA和JMETER。我们考虑加特林的主要原因如下:

  • 记录器记录场景
  • 与Jmeter线程模型相比,使用Akka和Netty可以提供更好的性能
  • DSL Scala与Jmeter XML相比非常易于维护
  • 易于编写测试,不要害怕它是scala。
  • 报告中

让我给您一个简单的示例,使用加特林代码编写代码:

// your code starts here  
val scn = scenario("Scenario")  
     .exec(http("Page")
     .get("http://example.com")) 
// injecting 100 user enter code here's on above scenario.   
setUp(scn.inject(atOnceUsers(100)))       

但是,您可以使其尽可能复杂。加特林(Gatling)突出的功能之一就是报告,它非常详细。

以下是一些链接:
Gatling
Gatling教程

我最近对此进行了讨论,您可以在此处进行讨论:https :
//docs.google.com/viewer?url=http%3A%2F%2Ffiles.meetup.com%2F3872152%2FExploring-Load-Testing-with -加特林.pdf


6

这是一个古老的问题,但我认为值得一提的是新的解决方案。检出LoadImpact:http : //www.loadimpact.com


是的 我刚刚看了一下。在找到此问题之前,先在Google上找到它。我认为基于Web的应用程序是一种很好的方法,但是我不确定它是否真的在推动我的服务器。毫无疑问,值得尝试一下。Tbh,我真的很想注册一个完整帐户。
查理

4

我尝试过WebLoad,这是一个非常简洁的工具。它带有测试脚本IDE,可让您记录用户在网站上的操作。它还在您的Web服务器上执行压力测试时绘制一个图形。试试吧,我强烈推荐。


1
我也推荐WebLoad。这是一个很好的工具,易于使用,并且报告非常有用。我假设您使用的是Windows平台,因此将这些结果与perfmon结合使用将使您几乎了解所有需要了解的内容。
巴巴克纳法斯

2
请注意,WebLoad现在纯粹是商业化的。他们发出了一封电子邮件,其中引用:---------已宣布WebLOAD开源报废(EOL)-如果您仍然拥有该产品的版本,我们提醒您,根据EULA,严禁使用该产品或将其用于服务第三方。-------禁止分发开源版本吗?甚至禁止以他们不喜欢的方式使用它?这不是我想要的任何行为。
约什丹,

1
链接到域现在只是广告-原始域已过期。
dodgy_coder 2012年

@Joshdan这就是为什么GPL很重要的原因。
托尔比约恩Ravn的安德森

3

尝试这里提到的所有内容,我发现 curl-loader最适合我的目的。非常简单的界面,实时监控,有用的统计信息,从中我可以绘制性能图。包含libcurl的所有功能。


3

Blaze meter具有一个chrome扩展名,用于记录会话并将其导出到JMeter(当前需要登录)。您还可以选择付钱给他们在他们的JMeter服务器群集上运行它(它们的价格似乎比我刚刚停止使用的LoadImpact好得多):

我与他们没有任何关联,只是喜欢他们的服务外观,尽管我还没有使用付费版本。


2

您将近一年前问这个问题,但我不知道您是否还在寻找基准测试网站的另一种方法。但是,由于此问题仍未标记为已解决,因此我建议使用免费的Web服务LoadImpact(顺便说一句,未附属)。刚刚通过twitter获得了此链接,并希望分享此发现。他们创建了一个合理的良好概览,只需花几美元,您便可以使用“完全影响模式”。这听起来似乎很奇怪,但是祝您好运,推动并终止您的服务:)



1

我用过openSTA

这允许记录与网站的会话,然后通过相对简单的脚本语言进行回放。

您可以轻松地测试Web服务并编写自己的脚本。

它允许您以所需的任何方式将脚本放置在测试中,并配置迭代次数,每次迭代中的用户数,引入每个新用户的加速时间以及每次迭代之间的延迟。测试也可以在将来安排。

它是开源的,免费的。

它产生许多报告,可以将其保存到电子表格中。然后,我们使用数据透视表轻松分析结果并绘制图形。


1

我们使用提到的Microsoft工具-Microsoft Web应用程序压力工具。这是我使用过的最简单的工具。它在许多方面受到限制,包括只能在手动创建的测试中命中端口80。但是,它的易用性意味着它实际上已被使用。

我们使用其他工具(包括OpenSTA和链接检查蜘蛛)来补充此工具的负载。

从我的初步评估来看,JMeter看起来不错,我希望将其纳入我们未来的持续集成中。但是,JMeter复杂且不容易推广。

我建议打开另一个有关解释MS压力工具结果的问题。


1

Visual Studio测试版2010(2008也不错)。这是创建Web /负载测试的真正简单而强大的工具。

针对Windows服务器使用此工具的好处是,您可以对报告中的所有perfmon服务器统计信息进行集成访问。真的很有用。

另一个好处是,在Visual Studio项目中,您可以集成一个“性能会话”,以分析您网站的代码执行情况。

如果您是从Windows服务器提供网页,那么这是最好的工具。

但是,使用多台计算机对应用程序进行负载测试需要单独且昂贵的许可证。


1

我们已经开发出一种流程,将负载和性能度量视为头等大事-正如您所说,将其留在项目结束时往往会令人失望...

因此,在开发过程中,我们包括非常基本的多用户测试(使用硒),该测试检查基本的疯狂程度,例如会话管理中断,明显的并发问题和明显的资源争用问题。不平凡的项目在持续集成过程中将其包括在内,因此我们会得到非常定期的反馈。

对于没有极端性能要求的项目,我们在测试中包括基本性能测试。通常,我们使用BadBoy编写测试脚本,然后将它们导入JMeter,替换登录详细信息和其他特定于线程的内容。然后,我们将其提高到服务器每秒处理100个请求的水平。如果响应时间少于1秒,通常就足够了。我们发起并继续前进。

对于具有极端性能要求的项目,我们仍然使用BadBoy和JMeter,但是投入了大量精力来了解我们测试平台上的服务器(通常是Web和数据库服务器)上的瓶颈。有一个很好的工具可用于分析Microsoft事件日志,对此很有帮助。我们通常会发现意外的瓶颈,如果可能的话,我们会对其进行优化。这样就为我们提供了一个与“ 1台Web服务器,1台数据库服务器”一样快的应用程序。然后,我们通常将其部署到目标基础架构,并使用“云中的Jmeter”服务之一来大规模重新运行测试。

同样,PAL报告有助于分析测试期间发生的情况-您通常会在生产环境中看到非常不同的瓶颈。

关键是要确保您不仅运行压力测试,而且还收集了理解应用程序性能所需的信息。


1

这里提到了很多好的工具。我想知道工具是否可以回答以下问题:“您如何对Web应用程序进行压力测试?” 这些工具实际上并没有提供强调Web应用程序的方法。这是我所知道的:

压力测试显示了在为不断增长的用户提供服务时Web应用程序如何失败。压力测试显示了Web应用程序失败时的功能。当今,大多数Web应用程序,尤其是社交/移动Web应用程序,都是服务的集成。例如,当Facebook在2011年5月停运时,您将无法登录Pepsi.com的Web应用程序。该应用程序并没有完全失败,只是正常功能的很大一部分对用户不可用。

性能测试表明,Web应用程序可以保持响应时间,而与同时使用该应用程序的用户数量无关。例如,一个每秒处理10个并发用户的10个事务的应用程序应在20个用户的情况下每秒处理20个事务。如果该应用程序每秒处理少于20个事务,则响应时间会更长,并且该应用程序将无法实现线性可伸缩性。

同样,在上面的示例中,每秒事务计数应该仅是测试用例/工作流的成功操作。故障通常发生在较短的时间范围内,这会使TPS测量结果过于乐观。故障对于压力和性能测试很重要,因为它们也会在应用程序上产生负载。

我在http://www.pushtotest.com/pushtotest-testmaker-6-methodology的《 TestMaker用户指南》中写下了PushToTest方法论。TestMaker有两种形式:开源(GPL)社区版本和TestMaker Enterprise(在强大的专业支持下进行商业销售)。

-坦率


1
这不回答OP的任何问题
科里·戈德堡

1

看看LoadBooster(https://www.loadbooster.com)。它利用无头可编写脚本的浏览器PhantomJS / CasperJs来测试网站。Phantomjs将解析并渲染每个页面,执行客户端脚本。无头浏览器方法更容易编写测试方案,以支持复杂的AJAX重型Web 2.0应用程序,浏览器导航,鼠标单击和击入浏览器的击键,或者等到DOM中存在某个元素。LoadBooster也支持硒HTML脚本。

免责声明:我为LoadBooster工作。


1

尝试使用ZebraTester,它比jMeter更容易使用。我已经使用jMeter很长时间了,但是负载测试的总设置时间始终是一个问题。尽管ZebraTester不是开源的,但我在过去六个月中节省的时间弥补了这一麻烦。他们还具有SaaS门户,可使用其负载生成器来快速运行测试。


0

还有一点要注意,对于我们的Web应用程序,我发现由于锁上线程之间的争用,我们遇到了巨大的性能问题。因此,道德上要非常仔细地考虑锁方案。我们最终使工作线程使用异步http处理程序来限制太多请求,否则应用程序将不堪重负,崩溃并烧毁。这意味着可能会积压大量积压,但至少该站点会停滞不前。


这不回答OP的任何问题
科里·戈德堡


0

我赞同opensta的建议。我要补充一点,它允许您做一些事情来监视您正在使用SMTP测试的服务器。我们会跟踪处理器负载,已用内存,发送的拜拜等信息。唯一的缺点是,如果发现某些问题并想进行修复,则它依赖于几个不再使用的开源库,因此需要进行编译该版本的源代码比大多数OSS更为棘手。


0

我和JMeter一起玩。一个认为它无法测试的是ASP.NET Webforms。viewstate破坏了我的测试。我不知道为什么,但是有一些工具不能正确处理视图状态。我当前的项目是ASP.NET MVC,JMeter可以很好地工作。



0

冒着被指责为无耻自我提升的风险,我想指出,在我寻求免费负载测试工具时,我去了这篇文章: http //www.devcurry.com/2010/07/10-free- tools-to-loadstress-test-your.html

我无法获得所需的吞吐量,或者无法获得所需的灵活性。而且我想在测试后分析中轻松汇总多个负载测试生成主机的结果。

我尝试了清单上的所有工具,但令我沮丧的是,他们没有一个完全按照我的意愿去做。因此,我建立了一个并共享它。

它在这里:http : //sourceforge.net/projects/loadmonger

PS:熟悉城市语的人们对此名称不屑一顾。我不是,但是现在变得更加世俗了。


0

我也为jMeter投票,我想在@PeterBernier答案中添加一些引号。

负载测试所回答的主要问题是我的Web应用程序可以支持多少个并发用户?为了获得正确的答案, 负载测试应尽可能接近实际的应用程序使用情况

请记住,jMeter具有许多构建模块,包括逻辑控制器配置元素预处理器侦听器 ...,它们可以帮助您实现这一目标。

您可以使用jMeter模拟现实情况,例如:

  1. JMeter的配置通过配置来充当真正的浏览器(concurrent resource downloadbrowser cachehttp headerssetting request time outcookie managementhttps supportencodingajax support,...)
  2. 配置JMeter的生成用户请求(通过定义number of users per secondramp-up timescheduling,...)
  3. 使用jMeter配置许多客户端,以进行分布式负载测试。
  4. 处理响应以查找服务器在测试过程中是否正确响应。(例如assert,在其中查找文本的响应)

请考虑:

https://www.blazemeter.com/jmeter具有很好的和实用的信息,以帮助您配置测试环境。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.