对Web应用程序进行压力测试?

253

过去,我使用了微软Web应用程序压力测试工具和Pylot来对web应用程序进行压力测试。我编写了一个简单的首页、登录脚本和网站漫游(在电子商务网站上将几个商品添加到购物车和结算)。

只需用一些开发人员猛攻主页,就几乎总能找到一个严重问题。更多可扩展性问题将在第二阶段浮出水面,甚至在发布后还会有更多问题。

我使用的工具URL是Microsoft Homer(又称Microsoft Web应用程序压力测试工具)和Pylot

这些工具生成的报告对我来说从来没有什么意义,我会花费很多时间试图弄清楚网站能够支持多少并发负载。但这总是值得的,因为最愚蠢的错误和瓶颈总会出现(例如,Web服务器配置不当)。

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

30个回答

116

这里再次推荐JMeter

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

但是,一旦开始进行复杂的测试,就需要花费较长时间来学习,但这是值得的。你可以非常快速地上手,并且根据你想要进行压力测试的类型,这可能是可以接受的。

优点:

  • 源于Apache项目的免费开源工具(有助于获得支持)
  • 易于入门,一旦掌握了核心概念(即如何创建请求、创建断言、处理变量等),使用起来很容易。
  • 可伸缩性非常高。我曾经运行过在11台机器上的测试,生成的负载每小时接近一百万次,它比我预期的容易设置多了。
  • 有积极的社区和良好的资源可帮助您快速上手。先阅读教程并试用一段时间。

缺点:

  • UI使用Swing编写。(呃!)
  • JMeter通过解析服务器返回的响应文本来工作。因此,如果您要验证任何类型的JavaScript行为,则会遇到麻烦。
  • 对于非程序员来说,学习曲线陡峭。如果您熟悉正则表达式,则已经领先了一步。
  • 支持论坛中有大量(插入粗口)白痴在询问愚蠢的问题,如果他们稍微浏览一下文件就可以轻松解决(“如何使用JMeter测试我的Windows GUI”经常出现)。
  • “开箱即用”的报告功能在处理更大的测试项目时不够完善。在我之前提到的测试中,我最终不得不编写一个快速的控制台应用程序来执行一些“xml-logfile”到“html”转换。不过,这已经是几年前的事情了,现在可能不再需要了。

  • 请问JMeter能否帮助您测试安装在远程VPS上的应用程序?我不确定,因为它是桌面版本。 - Rajat Gupta
    1
    另一个与JMeter相关的选项是JMeter作为服务。这些类型的SaaS提供高度可扩展的JMeter以及大大改进的报告。 - Ophir Prusak
    5
    我不同意JMeter非常具有可扩展性。每小时一百万个请求仅相当于278个请求/秒,而且运行在11台机器上的情况下,与其他工具相比非常低。我认为JMeter的可扩展性实际上应该列在缺点一栏。 - heyman
    JMeter不是浏览器,它在协议层工作。就Web服务和远程服务而言,JMeter看起来像一个浏览器(或者说多个浏览器);然而,JMeter并不执行浏览器支持的所有操作。 Web应用程序需要“执行”才能完成。 - LeonanCarvalho

    37

    我使用过The Grinder。它是一个开源工具,相当易于使用,并且可以进行高度的配置。它基于Java并使用Jython脚本。我们对.NET Web应用程序进行了测试,因此不要认为它仅适用于Java平台(任何Web压力测试工具都不应该与其使用的平台绑定)。

    我们用它做了一些炫酷的东西... 我们是一个基于Web的电信应用程序,因此我设置了一个很酷的用途,模拟通过我们的Web应用程序拨打号码,然后使用我们的自动答复工具(基本上是从Microsoft获取的教程应用程序,用于连接他们的RTC LCS服务器... 这是Microsoft Office Communicator在本地网络上连接的服务器... 然后修改为仅自动接听电话)。这使我们可以使用它来替代一个名为The Hammer(或类似名称)的昂贵的电话工具。

    无论如何,我们还使用该工具查看我们的应用程序在高负载下的表现情况,它非常有效地发现了瓶颈。该工具内置报告功能,可以显示请求持续的时间,但我们从未使用过。日志也可以存储所有响应等内容,或自定义日志。

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


    1
    +1 给研磨机。我特别喜欢代理脚本选项。 - davek
    有没有可能使用这个来模拟一个空闲的浏览器。我们的应用程序每两秒钟从一个空闲的浏览器发出服务器请求。我想知道当我们有30个并发的空闲浏览器时会发生什么。 - Ramy
    1
    +1 给研磨机。与 EC2 搭配,我们成功地使用它来启动了 100k 并发用户。 - nategood

    24

    我来晚了,但我同意Pylot是目前最好的开源工具之一。它易于使用,并由一个伟大的人(Corey Goldberg)积极维护。作为OpenQA的创始人,我也很高兴Pylot现在被列在我们的主页上并使用我们的基础设施(即论坛)。

    然而,我最近也认为负载测试的整个概念是有缺陷的:随着应用程序变得越来越复杂,模拟HTTP流量变得非常麻烦。这就是我创建商业工具BrowserMob的原因。它是一个外部负载测试服务,使用Selenium控制真实的Web浏览器进行负载回放。

    这种方法显然需要比普通负载测试技术多得多的硬件,但当您使用云计算时,硬件实际上相当便宜。而这种方法的一个好处是脚本编写比普通负载测试要容易得多。您不需要执行任何高级的正则表达式匹配(如JMeter所需)来提取cookie、.NET会话状态、Ajax请求参数等。由于使用真实的浏览器,它们只会按照预期运行。

    抱歉明目张胆地推销商业产品,但希望这个概念对一些人有趣,并至少让他们考虑一些新的方法来处理当您拥有额外硬件时的负载测试!


    2
    Pylot的作者还创建了另一个网络测试工具:http://code.google.com/p/multi-mechanize/。 - codeape
    2
    pylot.org的链接重定向到了一些可疑的网站。 - mpiktas

    17

    我曾使用JMeter。除了测试 Web 服务器,您还可以测试数据库后端、消息服务和邮件服务器。


    13

    1
    最近我使用了tsung这个工具(用于真正的压力测试),以下是如何配置http://progrnotes.blogspot.com/2011/11/tsung-web-application-performance-and.html或官方文档http://tsung.erlang-projects.org/user_manual.html。 - Sergey
    我也发现Openload很有用:http://linuxpoison.blogspot.com/2010/12/tool-for-load-testing-of-web.html - wael34218

    10

    针对基于网络的服务,可以尝试使用 loader.io

    简介:

    loader.io 是一个免费的负载测试服务,可以让你使用成千上万个并发连接来压力测试你的 Web 应用程序/ API。

    他们还提供一个 API


    2
    这是一个很好的选择,可以避免使用自己的机器来测试自己的机器。 - nurettin

    9
    由于这个问题仍然未解决,我想我也可以发表一下自己的看法。好消息是,在过去的5年左右时间里,开源工具在这个领域真正成熟并开始流行起来了。坏消息是,有太多这样的工具。
    以下是我的想法:
    Jmeter vs Grinder Jmeter是从XML风格的规范中推动的,这个规范是通过GUI构建的。
    Grinder使用Jython脚本在多线程Java框架内,因此更适合程序员。
    这两个工具都能处理HTTP和HTTPS,并且有一个代理记录器让你开始测试。这两个工具都使用控制器模型来驱动多个测试代理,因此可扩展性不是问题(只要能够访问云)。
    哪个更好:
    这是一个艰难的选择,因为随着你进入更复杂的脚本要求,如URL重写、相关性、为虚拟用户提供唯一数据以及模拟首次或返回用户(通过操纵HTTP头),这些工具都需要较陡峭的学习曲线。
    尽管如此,我会先从Jmeter开始,因为这个工具有很多追随者,并且有很多关于使用这个工具的示例和教程。如果你遇到一个“路障”,即你无法“轻松”地使用Jmeter,那么再看看Grinder。好消息是,这两个工具具有相同的Java要求,可以进行“混搭”解决方案。
    新增内容 - 运行多个Selenium WebDriver实例的无头浏览器。
    这是一种相对较新的方法,因为它依赖于现在可以从云中提供的资源。采用这种方法时,将Selenium(WebDriver)脚本在无头浏览器中运行(即WebDriver = New HtmlUnitDriver())驱动程序中的多线程。
    根据经验,可以从Amazon M1小型实例执行约25个“无头浏览器”的实例。
    这意味着所有关联、URL重写问题都会消失,因为您可以将功能测试脚本重新定位为性能测试脚本。
    与HTTP驱动程序(如Grinder或Jmeter)相比,可扩展性受到影响。尽管如此,如果您想要驱动500个虚拟用户,则需要更多的VM来驱动负载,例如20个Amazon Small实例(每小时6美分),成本仅为每小时1.20美元,这样就可以得到非常接近真实用户体验的负载。

    Grinder也可以使用Clojure脚本。 - user100464

    9

    对于简单的使用,我更喜欢使用ab(apache benchmark)和siege。后者需要使用,因为ab不支持cookie,并且会从动态站点创建无限会话。

    两者都很容易开始:

    ab -c n -t 30 url
    
    siege -b -c n -t 30s url
    

    siege可以同时运行多个URL。

    最新版本的siege在siegerc中打开了详细输出,这很烦人。你只能通过编辑该文件(/usr/local/etc/siegerc)来禁用它。


    8
    我们最近开始使用Gatling进行负载测试。我强烈建议尝试一下这个负载测试工具。我们以前使用过SOASTA和JMETER。考虑使用Gatling的主要原因如下:
    • 记录器用于记录场景
    • 使用Akka和Netty,与Jmeter线程模型相比具有更好的性能
    • DSL Scala相对于Jmeter XML更易于维护
    • 编写测试很容易,不必担心它是Scala。
    • 报告
    让我给您举一个使用Gatling代码编写简单示例的例子:
    // 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-Gatling.pdf

    8
    此外,有一个很棒的开源纯Python分布式和可扩展Locust框架,它使用Greenlets。它非常适合模拟大量同时在线的用户。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接