模拟并发WCF客户端调用并测量响应时间

时间:2010-07-31 09:26:37

标签: c# multithreading concurrency wcf

我正在尝试模拟WCF服务的X个并发请求,并测量每个请求的响应时间。我希望所有的请求或多或少同时在服务上。

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

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

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

我有以下设置。假设“X”为我想要触发的并发数量的请求。另请注意,使用以下设置时,我不会收到任何拒绝服务问题。

  1. 致电链如下,客户 - >服务1 - >服务2 - >服务3
  2. 所有服务都是PerCall,并发设置为多个。
  3. 限制设置为X并发调用,X并发实例。
  4. 服务到X的MaxConnections,ListenBacklog。
  5. 在客户端和服务器上将ThreadPool的最小/最大线程设置为X(我已经应用了Microsoft提供的补丁)。
  6. 我不确定我测量的响应时间是否准确。我错过了一些非常微不足道的事情吗?

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

    感谢。

    -Krishnan

2 个答案:

答案 0 :(得分:1)

我确实找到了自己的答案。所有这些,我测量响应时间的方式是错误的。一个应该产生X个线程,其中X是一个想要模拟的并发用户数。在每个线程中,只打开一次连接并使用while循环只执行要在给定持续时间内测试的WCF方法。测量每个回报的响应时间,累计并将其与给定持续时间内执行的呼叫数进行平均。

答案 1 :(得分:0)

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

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