247

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

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

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

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

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

4

30 回答 30

113

这是对JMeter的另一票。

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

然而,一旦你开始进行复杂的测试,它确实有一个陡峭的学习曲线,但它是非常值得的。您可以快速启动并运行,并且取决于您想要进行哪种压力测试,这可能没问题。

优点:

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

缺点:

  • UI 是用 Swing 编写的。(啊!)
  • JMeter 通过解析服务器返回的响应文本来工作。因此,如果您希望验证任何类型的 javascript 行为,那么您就不走运了。
  • 非程序员的学习曲线很陡峭。如果您熟悉正则表达式,那么您已经走在了前面。
  • 支持论坛中有大量(插入咒骂)白痴提出愚蠢的问题,如果他们粗略地看一下文档,这些问题很容易解决。(“如何使用 JMeter 对我的 Windows GUI 进行压力测试”经常出现)。
  • 报告“开箱即用”还有很多不足之处,特别是对于较大的测试。在我上面提到的测试中,我最终不得不编写一个快速控制台应用程序来执行一些“xml-logfile”到“html”的转换。不过那是几年前的事了,所以很可能不再需要这样做。
于 2008-09-18T13:24:55.903 回答
37

我用过The Grinder。它是开源的,非常易于使用且非常可配置。它基于 Java,并使用 Jython 编写脚本。我们针对一个 .NET Web 应用程序运行它,所以不要认为它是一个仅限 Java 的工具(就其本质而言,任何 Web 压力工具都不应该与它使用的平台绑定)。

我们用它做了一些巧妙的事情......我们是一个基于网络的电信应用程序,所以我设置的一个很酷的用途是通过我们的网络应用程序模仿拨号,然后使用我们拥有的自动应答工具(基本上是一个教程Microsoft 的应用程序连接到他们的 RTC LCS 服务器...这是 Microsoft Office Communicator 在本地网络上连接的...然后修改为仅自动接听电话)。然后,这使我们可以使用它而不是昂贵的电话工具,称为 The Hammer(或类似的东西)。

无论如何,我们还使用该工具查看了我们的应用程序在高负载下的运行情况,它在发现瓶颈方面非常有效。该工具已内置报告以显示请求需要多长时间,但我们从未使用过它。日志还可以存储所有响应和诸如此类的东西,或自定义日志记录。

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

于 2008-08-11T03:27:15.250 回答
24

这次聚会有点晚了。我同意Pylot是目前最好的新兴开源工具。它使用简单,并且由一位伟人 ( Corey Goldberg ) 积极开发。作为OpenQA的创始人,我也很高兴 Pylot 现在列在我们的主页上并使用我们的一些基础设施(即论坛)。

然而,我最近还认为负载测试的整个概念是有缺陷的:模拟 HTTP 流量,应用程序变得如此复杂,是一件很痛苦的事情。这就是我创建商业工具 BrowserMob 的原因。这是一个外部负载测试服务,在回放负载时使用Selenium来控制真实的 Web 浏览器。

这种方法显然需要比普通负载测试技术更多的硬件,但是当您使用云计算时,硬件实际上非常便宜。这样做的一个很好的副作用是脚本编写比正常的负载测试要容易得多您无需执行任何高级正则表达式匹配(如 JMeter 要求)来提取 cookie、.NET 会话状态、Ajax 请求参数等。由于您使用的是真正的浏览器,它们只会做它们应该做的事情。

很抱歉公然推销一个商业产品,但希望这个概念对某些人来说很有趣,并且至少让他们在您可以访问一堆额外硬件时考虑一些新的方法来处理负载测试!

于 2009-02-17T04:49:54.923 回答
16

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

于 2008-08-11T04:26:42.353 回答
13

absiegetsunghttperfTrample、 Pylot 、request-log-analyzerperftools

于 2011-04-19T05:05:46.463 回答
10

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

概括:

loader.io 是一项免费的负载测试服务,可让您使用数千个并发连接对您的 web-apps/apis 进行压力测试。

他们也有一个API

于 2013-01-02T22:08:22.133 回答
9

由于这个问题仍然悬而未决,我不妨权衡一下。

好消息是,在过去 5 年左右的时间里,开源工具已经真正成熟并在该领域起飞,坏消息是其中有很多。

以下是我的想法:-

Jmeter vs磨床

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

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

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

哪个更好:-

当您遇到更复杂的 url 重写、关联、为每个虚拟用户提供唯一数据以及模拟第一次或返回用户(通过操作 HTTP 标头)的脚本要求时,这两种工具的学习曲线都非常陡峭,因此很难调用。

也就是说,我将从 Jmeter 开始,因为这个工具有大量的追随者,并且网上有很多使用这个工具的示例和教程。如果您遇到“路障”,那是您无法使用 Jmeter“轻松”完成的事情,然后看看 Grinder。好消息是这两个工具都具有相同的 Java 要求,并且“混合搭配”解决方案并非不可能。

添加一些新东西——运行多个 Selenium WebDriver 实例的无头浏览器。

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

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

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

与 Grinder 或 Jmeter 等 HTTP 驱动程序相比,由于需要更多 VM 来驱动负载,因此可扩展性受到影响。也就是说,如果您希望以每小时 1.20 美元的成本驱动 500 个虚拟用户,那么使用 20 个 Amazon 小型实例(每个小时 6 美分)可以为您提供非常接近真实用户体验的负载。

于 2013-03-28T23:52:34.397 回答
9

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

两者都很容易上手:

ab -c n -t 30 url

siege -b -c n -t 30s url

siege 可以运行更多的 url。

最后一个围攻版本在siegerc中打开冗长,这很烦人。您只能通过编辑该文件(/usr/local/etc/siegerc)来禁用它。

于 2010-08-23T09:58:24.570 回答
8

此外,还有一个很棒的开源纯 python 分布式和可扩展的locust框架,它使用greenlets。它非常适合模拟大量同时使用的用户。

于 2013-05-07T22:03:18.237 回答
8

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

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

让我举个简单的例子来使用 Gatling Code 编写代码:

// 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

于 2015-11-23T16:44:43.827 回答
6

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

于 2012-01-05T21:33:32.110 回答
4

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

于 2008-09-30T01:07:12.063 回答
3

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

我和他们没有任何联系,我只是喜欢他们服务的外观,虽然我还没有使用过付费版本。

于 2013-11-01T03:03:38.703 回答
3

尝试了这里提到的所有内容,我发现 curl-loader最适合我的目的。非常简单的界面,实时监控,有用的统计数据,我从中构建了性能图表。libcurl 的所有功能都包括在内。

于 2010-09-03T09:24:55.350 回答
2

您大约一年前问过这个问题,我不知道您是否还在寻找另一种对您的网站进行基准测试的方法。然而,由于这个问题仍未被标记为已解决,我想建议免费的网络服务 LoadImpact(顺便说一句。不附属)。刚刚通过 twitter 获得了这个链接,并想分享这个发现。它们创建了一个合理的良好概览,并且多花几块钱,您就可以获得“完全影响模式”。这可能听起来很奇怪,但祝你好运推动和制动你的服务:)

于 2009-06-22T01:38:28.007 回答
1

我发现IBM Page Detailer也是一个有趣的工具。

于 2008-08-28T19:38:25.400 回答
1

我用过openSTA

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

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

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

它是开源和免费的。

它会生成许多报告,这些报告可以保存到电子表格中。然后,我们使用数据透视表轻松分析和绘制结果。

于 2008-09-15T20:39:37.367 回答
1

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

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

从我最初的评估来看,JMeter 看起来不错,我希望将它包含在我们未来的持续集成中。但是,JMeter 的推出很复杂且不容易。

我建议就解释 MS 压力工具结果提出另一个问题。

于 2008-09-28T15:37:22.533 回答
1

Visual Studio 测试版 2010(2008 也不错)。这是一个非常简单而强大的工具,可以用来创建 Web/负载测试。

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

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

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

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

于 2009-12-08T21:28:44.787 回答
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 企业版(具有强大专业支持的商业版。)

-坦率

于 2012-08-17T21:01:34.420 回答
1

我们开发了一个流程,将负载和性能测量视为头等大事 - 正如您所说,将其留到项目结束往往会导致失望......

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

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

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

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

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

于 2012-07-15T14:39:35.453 回答
1

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

免责声明:我为 LoadBooster 工作。

于 2016-12-29T05:43:25.380 回答
1

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

于 2016-09-30T21:21:12.673 回答
0

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

于 2008-08-11T03:31:52.167 回答
0

看看TestComplete

于 2008-08-21T10:34:39.620 回答
0

我支持opensta的建议。我只想补充一点,它允许您使用 SMTP 监控您正在测试的服务器。我们会跟踪处理器负载、使用的内存、发送的再见等。唯一的缺点是,如果您发现一些问题并想要进行修复,它依赖于几个不再跟上的开源库,因此需要进行编译源版本比大多数 OSS 更棘手。

于 2008-09-20T22:09:00.017 回答
0

我玩过JMeter。一种认为它无法测试的是 ASP.NET Webforms。视图状态打破了我的测试。我不知道为什么,但是有几个工具不能正确处理视图状态。我目前的项目是 ASP.NET MVC,JMeter 可以很好地配合它。

于 2009-02-03T10:55:07.573 回答
0

冒着被指责无耻自我推销的风险,我想指出,在我寻求免费负载测试工具的过程中,我阅读了这篇文章: http: //www.devcurry.com/2010/07/10-free-工具加载压力测试your.html

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

我尝试了列表中的每一个工具,但令我沮丧的是,它们都没有完成我想做的事情。所以我建立了一个并分享它。

这是:http: //sourceforge.net/projects/loadmonger

PS:熟悉城市俚语的人不会对这个名字进行冷嘲热讽。我不是,但现在稍微更世俗了。

于 2012-12-11T01:22:17.917 回答
0

我使用FunkLoad取得了不错的成绩:

  • 易于编写用户交互脚本
  • 报告很清楚
  • 可以监控服务器负载
于 2012-11-13T10:32:48.667 回答
0

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

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

请记住,jMeter有许多构建块Logical ControllersConfig ElementsPre ProcessorsListeners ,...可以帮助您。

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

  1. concurrent resource download通过配置 ( , browser cache, http headers, setting request time out, cookie management, https support, encoding, ajax support,... )将 jMeter 配置为真正的浏览器
  2. 配置 jMeter 以生成用户请求(通过定义number of users per second, ramp-up time, scheduling,...)
  3. 使用 jMeter 配置大量客户端,进行分布式负载测试。
  4. 处理响应以查找服务器在测试期间是否正确响应。(例如assert响应在其中查找文本)

请考虑:

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

于 2017-06-28T13:37:29.150 回答