3

我正在使用 LoadRunner 对 J2EE 应用程序进行压力测试。

我有:1 个 MySQL DB 服务器和 1 个 JBoss App 服务器。每个都是 16 核 (1.8GHz) / 8GB RAM 盒。

连接池:数据库服务器正在使用max_connections = 100. my.cnfApp Server 也在使用min-pool-sizeand max-pool-size= 100 in mysql-ds.xmland mysql-ro-ds.xml

我正在模拟来自“常规”单核 PC 的 100 个虚拟用户的负载。这是一个 1.8GHz / 1GB 内存盒。

该应用程序在 100 Mbps 以太网 LAN 上部署和使用。

我在我的压力测试脚本的部分中使用集合点来模拟现实世界的并行(而不是并发)使用。

问题:

这台产生负载的 PC 上的 CPU 利用率永远不会达到 100%,而且我相信内存也是可用的。因此,我可以尝试在这台 PC 上添加更多虚拟用户。但在此之前,我想了解一两个关于并发/并行性和硬件的基础知识:

  1. 只有一个单核负载生成器,我真的可以模拟 100 个用户的并行负载(每个用户在现实生活中使用专用 PC 操作)吗?我可能不正确的理解是,单核 PC 上的 100 个线程将同时运行(即交错)但不是并行运行......这意味着,我无法真正模拟 100 个并行用户的实际负载(在 100 台 PC 上) ) 只需一台单核 PC!那是对的吗?

  2. 用户并行性的网络带宽限制:即使假设我有一台 100 核负载生成 PC(或者,假设我的 LAN 上有 100 台单核 PC),以太网的工作方式也不会只允许并发和不是用户在将负载生成 PC 连接到服务器的以太网线上的并行性。事实上,这个问题(缺乏用户并行性)似乎即使在实际应用程序使用(每个用户 1 台 PC)中也会持续存在,因为用户请求到达多核机器上的应用程序服务器只能交错到达. 也就是说,多核服务器唯一可以并行处理用户请求的情况是每个用户在它和服务器之间都有自己的专用物理层连接!

  3. 假设无法实现并行性(由于上述“问题”)并且只有称为并发的下一个最好的事情是可能的,我将如何选择硬件和网络规范来使用我的模拟。例如,(a) 我的负载生成 PC 应该有多强大?(b) 每台 PC 需要创建多少虚拟用户?(c) LAN 上的每台 PC 是否必须通过交换机连接到服务器(以避免)如果使用集线器而不是交换机会发生广播流量?

提前致谢,

/HS

4

4 回答 4

1

在我看来,你想得太多了。您的服务器又快又新,非常适合处理大量客户端。您的瓶颈(如果有的话)要么是您的应用程序本身,要么是您的 100m 网络。

1./2. 您正在测试服务器,而不是客户端。在这种情况下,客户端所做的只是发送和接收数据——客户端处理(渲染 HTML、解码图像、执行 javascript 以及其他任何可能的内容)没有开销。最近的单核机器很容易使千兆链路饱和;一个 100 mbit 的管道应该是小菜一碟。

另外 - 较新/更高级的以太网卡中的处理器从 CPU 上卸载了大量工作,因此您不必期望 CPU 受到影响。

3. 不要使用集线器。您可以在 craigslist 上以 5 美元的价格购买 1 亿个集线器,这是有原因的。

于 2011-01-27T07:58:10.350 回答
1

如果没有更好地理解您的应用程序,很难回答其中的一些问题,但一般来说,您是正确的,要实现服务器的“真正”压力测试,最好有 100 个内核(使用 100 个并发的目标)用户),即 100 台 PC。但是,各种问题可能会表明这是显而易见的。

我有一个几年前构建的通信引擎(.NET / C#),它使用异步套接字——需要尽可能快的速度,所以我们不得不忘记在套接字之上添加任何额外的层,比如 HTTP 或任何其他更高的抽象。在具有 4GB RAM 的四核 3.0GHz 计算机上运行,​​该服务器可以轻松处理约 2,200 个并发连接的流量。有一个 Gb 交换机,所有 PC 都有 Gb NIC。即使所有 PC 同时进行通信,也很少会看到该服务器上的处理器负载 > 30%。我认为这是因为“整个系统”中固有的所有延迟。

我们有一项新要求,即支持我目前正在实施的 50,000 个并发用户。该服务器具有双四核 2.8GHz 处理器、64 位操作系统和 12GB 内存。我们的建模显示这台计算机足以处理 50K 用户。

我提到的网络延迟(不要忘记 CAT 3 与 CAT 5 与 CAT 6 问题)、数据库连接、存储的数据类型和平均记录大小、参考问题、背板和总线速度、硬盘驱动器速度和大小等,等等,等等,在“总体上”减慢平台速度方面起着同样重要的作用。我的猜测是您的系统可能有 500、750、1,000 甚至更多用户。

过去的目标是永远不要让线程阻塞太久……新的目标是让所有内核保持忙碌。

我有另一个应用程序,每天下载和分析约 7,800 个 URL 的内容。在具有 24GB RAM 的双四核 3.0GHz(Windows Ultimate 7 64 位版本)上运行,该过程过去需要大约 28 分钟才能完成。通过简单地将循环切换到 Parallel.ForEach(),整个过程现在需要 < 5 分钟。我们看到的我的处理器负载始终低于 20%,最大网络负载仅为 14%(通过标准 Gb 哑集线器和 T-1 线路在 Gb NIC 上的 CAT 5)。

让所有内核保持忙碌会产生巨大的影响,尤其是对于花费大量时间等待 IO 的应用程序而言更是如此。

于 2011-01-27T16:32:35.010 回答
1

您不仅使用以太网,假设您正在编写 Web 服务,而且您正在通过位于 TCP 套接字之上的 HTTP(S) 进行交谈,这是一种可靠的有序协议,具有可靠协议固有的内置往返行程。套接字位于 IP 之上,如果您的 IP 数据包不与您的以太网帧对齐,您将永远无法充分利用您的网络。即使您使用 UDP,已将数据报调整为适合您的以太网帧,在您的服务器上有 100 个负载生成器和 100 个 1Gbit 以太网卡,它们仍然会在中断上运行,并且您将有时间多路复用进一步向下堆栈。

这里的每一层都可以从事务的角度来考虑,但同时考虑每一层是没有意义的。如果您正在编写一个在OSI 模型第 7 级运行的 SOAP 应用程序,那么这就是您的领域。就您而言,您的事务是 SOAP HTTP(S) 请求,它们是并行的并且需要不同的时间来完成。

现在,要真正开始回答您的问题:这取决于您的测试脚本、它们使用的内存量,甚至是您的应用程序响应的速度。200 个或更多的虚拟用户应该没问题,但是找到你的瓶颈是一个科学探究的问题。做实验,找到它们,扩大它们,重复直到你满意为止。从负载生成器和被测系统中收集系统指标,并与操作系统提供商的建议进行比较,查看濒临死亡的系统和正常工作的系统之间的差异,寻找达到平稳状态的图表等等。

于 2011-01-29T03:55:43.840 回答
0

当您代表用户时,请忽略集合点,除非您有维护同时行为的工程要求,或者您的代理是进程而不是人类用户,并且这些代理受时钟节拍控制。人类是混乱的计算单元,具有不同的到达和离开窗口,具体取决于一个人能或不能阅读、打字、与朋友交谈等的速度……关于人口行为主题的一本好书是 James Gleik 的“Chaos”(sp? )

在可观察的条件下,您的 100 个解耦用户的行为在瞬间高度同步的几率为零。但是,在规定的时间窗口内发生并发活动的几率可能非常高,例如 100 个用户在工作日上午 9:00 后的 10 分钟内登录。

作为旁注,强调会合的简历是工具理解差和性能测试过程差的人的第一标记。这来自过去 15 年中进行的 1500 多次采访的作品集(我于 1996 年 4 月 1 日开始担任 Mercury 员工)

詹姆斯·普利

版主

-SQAForums WinRunner、LoadRunner

-YahooGroups LoadRunner, Advanced-LoadRunner

-GoogleGroups lr-LoadRunner

-Linkedin LoadRunner(所有者),LoadrunnerByTheHour(所有者)

水星明矾 (1996-2000)

首席技术官,Newcoe 性能工程

于 2011-04-02T22:53:41.357 回答