9

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

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

4

5 回答 5

7

你在正确的道路上,但你的负载限制是一个很高的因素。

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

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

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

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

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

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

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

于 2011-04-19T12:45:17.053 回答
3

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

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

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

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

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

于 2011-04-20T05:28:36.323 回答
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 线程或多个线程都访问相同的代码。这通常指向代码库中的一些缓慢。

于 2011-05-10T12:54:28.653 回答
0

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

  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

于 2011-06-07T10:24:46.547 回答
0

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

于 2012-08-12T16:32:08.153 回答