【问题标题】:Simulate Concurrent WCF Client Calls And Measure Response Time模拟并发 WCF 客户端调用并测量响应时间
【发布时间】:2010-07-31 09:26:36
【问题描述】:

我正在尝试为 WCF 服务模拟 X 个并发请求并测量每个请求的响应时间。我想让所有请求或多或少同时到达服务。

作为第一步,我使用 Thread 类生成了 X 个线程,并调用了 Start 方法。为了同步所有请求,在线程回调中,我打开连接并使用 Monitor.Wait 来阻止请求被触发,直到所有线程都被创建并启动。启动所有线程后,我调用 Monitor.PulseAll 来触发 WCF 客户端代理上的方法调用。

当我以这种方式执行请求时,我发现响应中有很大的延迟。一个应该只有几毫秒的请求,现在大约需要一秒钟。

我还注意到发送请求的时间和服务方法接收到的时间之间存在巨大的延迟。我通过将发送客户端时间戳作为参数值发送给每个请求的服务方法来测量这一点。

我有以下设置。假设我要触发的并发请求数为“X”。还要注意以下设置,我没有遇到任何拒绝服务问题。

  1. 调用链如下,Client->Service1->Service2->Service3
  2. 所有服务都是 PerCall,并发设置为 Multiple。
  3. 限制设置为 X 个并发调用,X 个并发实例。
  4. MaxConnections,服务上的 ListenBacklog 到 X。
  5. 客户端和服务器上 ThreadPool 的最小/最大线程数设置为 X(我已应用 Microsoft 提供的补丁)。

不确定我测量的响应时间是否准确。我错过了一些非常琐碎的事情吗?

对此的任何意见都会有很大帮助。

谢谢。

-克里希南

【问题讨论】:

  • 你试过X=1吗?添加线程时响应延迟是否会发生变化?
  • 是的,确实如此。对于 X = 1,响应时间等于我在没有线程的情况下按顺序执行请求时得到的响应。还有一个信息。我使用 TCP 绑定。

标签: c# multithreading concurrency wcf


【解决方案1】:

我确实以艰难的方式自己找到了答案。一直以来,我测量响应时间的方式都是错误的。一个人应该产生 X 个线程,其中 X 是一个想要模拟的并发用户的数量。在每个线程中,仅打开一次连接并使用 while 循环仅在给定持续时间内执行要测试的 WCF 方法。测量每次返回的响应时间,将其累积并与在给定持续时间内执行的调用次数进行平均。

【讨论】:

    【解决方案2】:

    如果您的所有传出调用都来自单个进程,则运行时可能会将多个请求合并到单个开放通道上,或者限制对单个目标服务的并发请求数。如果您将每个模拟客户端移动到自己的进程中,使用名为 EventWaitHandle 来同步它们,然后调用 #Set() 一次性释放它们,您可能会获得更好的结果。

    Windows 桌面版本允许的同时挂起(TCP SYN 或 SYN/ACK 状态)传出 TCP 连接的数量也有限制;如果您遇到此限制,您将获得 event 4226 记录,并且额外的同时连接将被延迟。

    【讨论】:

    • 感谢您的回复。我会尝试你的建议。在调用代理上的方法之前,我正在创建 WCF 代理的新实例并在每个线程上显式打开它。你还觉得一个开放的渠道可以重复使用吗?有没有办法可以验证?如果我创建多个 AppDomains 而不是 Processes 会有帮助吗?
    • 如果您使用 TCP 传输,AppDomains 可能会这样做;无论如何,它们几乎是过程。不过,您可能仍会遇到事件 4226。
    • 创建 AppDomains 似乎并不能解决问题。我注意到响应中有更多的延迟。我正在尝试仅模拟 10 个并发请求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 2013-01-28
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多