我必须对一堆相互依赖的服务进行性能/负载测试。它们都使用 net.tcp,并且大多数使用双工合约和内部队列。 [使用 lock(syncRoot) 手卷 POCO 队列类 { if(queue.Empty) Thread.Wait(); }]
这是我想出的方法:
- 确定要进行性能测试的 WCF 服务
- 确定每项服务的相关性能计数器
- 确定将执行正在测试的服务的逻辑起点
- 使用 VS.Net 为每个服务自动生成单元测试
- 编写特定的功能测试(例如,我可以采用一个用例 - “下订单” - 并编写对相关服务进行所有调用并通常执行几乎所有所需功能的测试)
- 使用运行 #5 中的跟踪文件生成单元测试 [使用 CodePlex 中的 WCF 负载测试](在我看来,这在某种程度上是在调试环境中重现生产/现场中的用户错误的理想工具。免责声明:未使用该工具。印象从阅读项目描述)
- 可以调整上面的测试以使用自动生成的输入数据进行调用
- 引入输入变化,以便执行不同的代码路径
- 来自性能计数器的日志数据
- 分析并识别瓶颈
问题:
- 有更好的方法吗?
- 对于使用内部队列的服务,使用标准性能计数器测量性能是一个问题。我可能需要定制计数器?
- 如果#1 为真,是否有办法在不更改正在测试的服务代码的情况下引入客户计数器?
- 我应该关心功能测试的结果吗?
- 有没有一种方法可以[非侵入式]为 WCF 服务实施 SLA? (我认为,如果我的计数器有足够的数据,例如服务的请求、发生的异常、响应时间等,我应该能够验证我的 SLA - 在 5 分钟内服务 200,000 个请求,每个请求的响应时间为 2 秒 -对照这些数字。我的问题也许是我是否可以只指定我的 SLA,并且产品/工具可以完成幕后的所有工作并为我提供表格答案?我知道...我知道...我在做白日梦:))
- 旁白:在 WCF 服务内部对请求进行排队的最佳方法是什么?
哇……标题绝对是冰山一角!希望我的回答不会离谱! :)
WCF 服务的性能测试可以通过多种不同的方式完成:使用 Microsoft Team Test、Borland Silk Performer、Mercury LoadRunner 等测试工具,或者 LoadGen 或自定义测试工具等工具。我的偏好是尝试采用您在创建某种功能单元测试中所做的方法,然后将数据输入到该测试中,同时使用测试工具启动该测试的多个并发实例(虚拟“用户”) 。大多数商业测试工具的工具确实促进了这种类型的测试,因此这里很难出错。最大的挑战通常来自维护测试用例和测试数据以支持测试应用程序。
WCF 没有任何与性能相关的内置计数器。这实际上是一个盲点。当然,您可以看到与服务器建立的连接数量,但这是粗略信息,您可能想知道哪些服务正在为这些请求提供服务。有传言称,作为为 WCF/WF 提供丰富的托管环境的一部分,Microsoft 的“Dublin”将包含托管服务的性能计数器。我们将不得不等待,看看到底会发生什么。
如果我需要在不影响现有代码库的情况下检测 WCF 服务,我会研究可以从可以应用于该服务的 WCF 行为中获得多少里程。此自定义行为可能会显示您可能想要的性能计数器。
是的。我会关心功能测试的结果(意味着性能?)。需要注意的是,可能存在一些可以忽略的启动(JIT)。我可能希望分析功能测试的执行以获得执行指标 - 但我不会在性能运行期间打开代码分析。
对于 SLA 来说,自定义行为可能就是答案。您可以将运营指标记录到数据库中,然后进行报告。 Amberpoint 和 SOA Software 等商业产品也将为此提供支持(包括性能计数器)。
将请求排队到 wcf 服务?我立即想到 net.msmq 绑定,特别是如果您希望使请求持久。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)