2

我必须对一堆相互依赖的服务进行性能/负载测试。他们都使用 net.tcp 并且大多数使用双工合同和内部排队。[使用 lock(syncRoot) { if(queue.Empty) Thread.Wait(); 处理 POCO 队列类 }]

这是我想出的方法:

  1. 确定要进行性能测试的 WCF 服务
  2. 确定每个服务的相关性能计数器
  3. 确定将通过正在测试的服务执行的逻辑起点
  4. 使用 VS.Net 为每个服务自动生成单元测试
  5. 编写特定的功能测试(例如,我可以使用一个用例 - “下订单” - 并编写对相关服务进行所有调用并通常执行几乎所有所需功能的测试)
  6. 使用运行 #5 中的跟踪文件生成单元测试 [使用 CodePlex 的 WCF 负载测试](在我看来,这似乎是在调试环境中重新创建生产/字段中的用户错误的理想工具。免责声明:未使用该工具。印象从阅读项目描述)
  7. 可以调整上面的测试以使用自动生成的输入数据进行调用
  8. 为输入引入变化,以便执行不同的代码路径
  9. 来自性能计数器的日志数据
  10. 分析和识别瓶颈

问题:

  1. 有更好的方法吗?
  2. 对于使用内部队列的服务,使用标准性能计数器测量性能是一个问题。我可能需要自定义计数器?
  3. 如果 #1 为真,有没有办法在不更改被测试服务代码的情况下引入客户计数器?
  4. 我应该关心我的功能测试的结果吗?
  5. 有没有办法 [非侵入式] 为 WCF 服务实施 SLA?(我认为,如果我的计数器有足够的数据,例如服务的请求、发生的异常、响应时间等,我应该能够验证我的 SLA - 在 5 分钟内处理 200,000 个请求,每个请求的响应时间为 2 秒 -反对这些数字。我的问题也许是我是否可以仅指定我的 SLA,并且产品/工具可以在幕后完成所有工作并为我提供表格答案?我知道...我知道...我做白日梦:))
  6. 旁白:在 WCF 服务内部对请求进行排队的最佳方法是什么?
4

1 回答 1

1

哇……标题绝对是冰山一角!希望我的回答不会离题!:)

  1. WCF 服务的性能测试可以通过多种不同的方式完成:使用 Microsoft Team Test、Borland Silk Performer、Mercury LoadRunner 等测试工具,或 LoadGen 或自定义测试工具等工具。我的偏好是尝试采用您在创建某种功能单元测试然后将数据输入该测试中所做的方法,同时使用测试工具来启动该测试的多个并发实例(虚拟“用户”) . 大多数商业测试工具的工具确实促进了这种类型的测试,因此在这里很难出错。最大的挑战通常来自维护测试用例和测试数据以支持测试应用程序。

  2. WCF 没有任何与性能相关的内置计数器。这实际上是一个盲点。当然,您可以看到与服务器建立了多少连接,但这是粗略的信息,您可能想知道哪些服务正在为这些请求提供服务。有传言称,作为为 WCF/WF 提供丰富托管环境的一部分,Microsoft 的“都柏林”将包括为托管服务显示性能计数器。我们将不得不拭目以待,看看实际会发生什么。

  3. 如果我需要在不影响现有代码库的情况下检测 WCF 服务,我会研究我可以从 WCF 行为中获得多少里程并将其应用于服务。这种自定义行为可能会显示您可能需要的性能计数器。

  4. 是的。我会关心功能测试的结果(意味着性能?)。需要注意的是,可能存在一些可以忽略的启动 (JIT)。我可能希望分析功能测试的执行以获取执行指标 - 但我不会在性能运行期间打开代码分析。

  5. 对于 SLA 的再次自定义行为可能是答案。您可以将操作指标记录到数据库中,然后将其报告出来。Amberpoint 和 SOA Software 等商业产品也将为此提供支持(包括性能计数器)。

  6. 排队对 wcf 服务的请求?我立即想到 net.msmq 绑定,特别是如果您希望使请求持久。

于 2009-04-15T03:28:22.443 回答