【问题标题】:How to do load testing using jmeter and visualVM?如何使用 jmeter 和 visualVM 进行负载测试?
【发布时间】:2011-08-04 11:05:12
【问题描述】:

我想为我的网站对 1000 万用户进行负载测试。该站点是一个基于 Java 的网络应用程序。我的方法是为所有链接创建一个 Jmeter 测试计划,然后为 1000 万用户生成报告。然后使用 jvisualVM 进行 profiling 并检查是否存在瓶颈。

有没有更好的方法来做到这一点?是否有任何现有的演示可以做到这一点?我是第一次这样做,所以任何帮助都会非常有帮助。

【问题讨论】:

  • 我的目标是支持至少 1000 万用户。
  • 哇。这是个大问题。几个前期问题:10 Mill 很多。那是并发的唯一用户吗?您在使用本机 Web 服务器吗?您是否对 Java 应用程序服务器进行集群?你会使用负载均衡器吗?您能说一下您将使用哪个应用服务器吗?还会有其他依赖,比如数据库等吗?
  • 数据库中有 1000 万用户。我可以使用 PL/SQL 过程来做到这一点。 150 个并发用户。没有聚类。只是登台机器。没有负载均衡器。应用服务器为 Jetty。

标签: performance jmeter load-testing visualvm jvisualvm


【解决方案1】:

您在正确的道路上,但您的负载限制很高。

为什么我这么说是因为您的网站可能需要更多机器来处理 10Milj 并发用户。单独一个进程可能难以处理并发的 32K TCP 流。还要计算实际处理 10Milj 用户所需的带宽。

现在我不知道您想在您的网站上提供什么样的服务,但是当考虑到 JVisualVM 将处理速度减慢 10 倍(或更多用于方法跟踪)时,您实际上不会测量“真实世界” " 如果你让 JMeter 和 JVisualVM 同时工作。

当您在较低负载下运行时,JVisualVM 会更有用。

要创建良好的衡量标准,首先要确保您有一个良好的基准。 对 10 个并发用户进行测试,连接 JVisuamVM 并让它运行一段时间,而不是关闭所有有趣的值。

获得基线后,您可以开始添加更多负载。 添加 10 倍负载(ea:100 个用户),看看 JVisualVM 中的变化。继续此操作,直到 JVisualVM 明显减慢您的速度,每次增加额外负载时,请确保您已写下您感兴趣的数字。在图表中绘制数字。

现在...为您想要的用户数量插入图表(手动)。这适用于内存使用、磁盘访问等,但不适用于已用 CPU 时间,因为 JVisualVM 会占用 CPU 并给你无效的数字(特别是如果你打开了方法跟踪)。

如果你真的想达到 10Milj 用户,我也不会信任 JMeter,我会编写一个我自己的小测试程序来执行你想要的测试。这没关系,因为设置站点来处理 10Milj 也需要时间,所以花一点额外的时间来测试工具并不是浪费。

【讨论】:

  • Unix 提出了一个很好的观点 - 确保您有一个良好的可靠基线,并使用不同的并发用户(10、50、100、150)以相同的持续时间运行每个测试,并且至少持续一个小时。
  • 在上一个 JDK 版本中,JVisualVM 具有采样分析器,它不会按数量级影响性能。即使在中等负载下,这种类型的分析也可以在生产服务器上完成。
【解决方案2】:

仅仅因为您在数据库中有 1000 万用户,并不意味着您需要使用这么多用户进行负载测试。想一想 - 您的网站真的会拥有 1000 万同时用户吗?对于 Web 应用程序,1:100 的注册用户比例很常见,即您不可能在任何时候拥有超过 100K 的用户。

JMeter 可以处理这种负载吗?我对此表示怀疑。请改用faban。它非常轻量级,可以在单个 VM 上支持数千个用户。您还可以更灵活地创建工作负载,还可以自动监控整个测试基础架构。

现在进入分析部分。你没有说你使用的是什么服务器。任何 Java 应用服务器都会提供足够的监控支持。商业服务器提供了很好的 GUI 工具,而 Tomcat 通过 JMX 提供了广泛的监控。在进入 JVM 级别之前,您可能希望从这里开始。

对于 JVM,您真的不想在运行如此大型的性能测试时使用 VisualVM。除了支持这样的负载,我假设您正在使用多个 appserver/JVM 实例。主要的性能问题通常是 GC,因此使用 JVM 选项来收集和记录 GC 信息。您必须对数据进行后处理。

这是一个不平凡的练习 - 祝你好运!

【讨论】:

  • 请检查 cmets。我指定数据库中有 1000 万用户和 150 个并发用户。
  • 对不起 - 错过了。然后,根据您的目标正确地创建工作负载以访问所有用户或用户子集非常重要。
【解决方案3】:

有两种类型的负载测试 - 瓶颈识别和吞吐量。这个问题让我相信这是关于瓶颈的,所以用户数量是一个红鲱鱼,相反,目标是为给定的配置找到可以改进以增加并发性的区域。

应用程序瓶颈通常分为三类:数据库、内存泄漏或慢速算法。找到它们需要让有问题的应用程序长时间承受压力(即负载)——至少一个小时,可能长达几天。 Jmeter 是一个很好的工具。要考虑的一件事是在启用 cookie 处理(即 Jmeter 保留 cookie 并随每个后续请求发送)和禁用的情况下运行相同的测试 - 有时您会得到非常不同的结果,这很重要,因为后者实际上是对某些内容的模拟爬虫对您的网站执行的操作。瓶颈检测的详细信息如下:

数据库

没有索引的表或涉及多个连接的 SQL 语句是常见的应用程序瓶颈。我处理过的每个数据库服务器,MySQL、SQL Server 和 Oracle 都有一些记录或识别运行缓慢的 SQL 语句的方法。 MySQL 具有慢查询日志,而 SQL Server 具有跟踪运行最慢的 SQL 的动态管理视图。一旦你掌握了缓慢的语句,使用解释计划来查看数据库引擎正在尝试做什么,使用任何建议索引的功能,并考虑其他策略 - 例如非规范化 - 如果这两个选项不能解决瓶颈.

内存泄漏

打开详细垃圾收集日志记录和 JMX 监控端口。然后使用提供更好图表的 jConsole 来观察趋势。特别是泄漏通常表现为填充旧代或永久代空间。泄漏是 JVM 的瓶颈,它花费越来越多的时间尝试垃圾收集但未成功,直到抛出 OOM 错误。

Perm Gen 意味着需要增加空间作为 JVM 的命令行参数。虽然 Old Gen 暗示了泄漏,您应该停止负载测试,生成堆转储,然后使用 Eclipse 内存分析工具来识别泄漏。

慢速算法

这更难追踪。最常见的问题是同步、进程间通信(例如 RMI、Web 服务)和磁盘 I/O。另一个常见问题是使用嵌套循环的代码(看看妈妈 O(n^2) 的性能!)。

如果没有更深入的知识,我发现找到这些问题的最佳方法是生成堆栈跟踪。这些将告诉所有线程在给定时间点正在做什么。您正在寻找的是 BLOCKED 线程或多个线程都访问相同的代码。这通常指向代码库中的一些缓慢。

【讨论】:

    【解决方案4】:

    我写了博客,我进行性能测试的方式:

    1. 确保服务器(硬件可以根据暂存/生产要求)没有其他可能影响性能的安装。
    2. 为了在 DB 中设置用户,可以使用一个过程,并且可以作为 jmeter 测试计划的一部分调用。
    3. 在单独的机器上安装 jmeter,这样 jmeter 就不会影响性能。
    4. 在 jmeter 中为所有 uri 创建一个测试计划(如图 1 所示),包括响应检查和基于计时器的请求。
    5. 使用 jmeter 进行初始基准测试。
    6. 检查低性能 uri。这些是预期的瓶颈点。
    7. 尝试不同的选项来提高性能,但一次只关注一个瓶颈。
    8. 尝试步骤 6 中的任一修复,然后进行基准测试。如果有任何改进,请提交更改并从第 5 步开始重复。否则请还原并尝试第 6 步中的任何其他选项。
    9. 下一步是使用负载平衡、硬件扩展、集群等。这可能包括一些物理设置和硬件/软件成本。使用可扩展性选项给出结果。

    详解:http://www.daemonthread.com/2011/06/site-performance-tuning-using-jmeter.html

    【讨论】:

    • 链接失效
    【解决方案5】:

    我开始使用JMeter plugins
    这使我可以收集 JMX 上可用的应用程序指标,以便在我的负载测试中使用。

    【讨论】:

      猜你喜欢
      • 2019-03-10
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 2014-12-30
      • 1970-01-01
      相关资源
      最近更新 更多