我正在尝试为 WCF 服务模拟 X 数量的并发请求并测量每个请求的响应时间。我想让所有请求或多或少同时到达服务。
作为第一步,我使用 Thread 类生成了 X 个线程,并调用了 Start 方法。为了同步所有请求,在 Thread 回调上我打开连接并有一个 Monitor.Wait 来阻止请求被触发,直到创建并启动所有线程。所有线程启动后,我调用 Monitor.PulseAll 以触发 WCF 客户端代理上的方法调用。
当我以这种方式执行请求时,我发现响应出现了巨大的延迟。一个应该只需几毫秒的请求,现在大约需要一秒钟。
我还注意到在服务方法中发送请求和接收请求之间存在巨大的延迟。我通过将发送客户端时间戳作为参数值发送到每个请求的服务方法来衡量这一点。
我有以下设置。假设“X”为我要触发的并发请求数。另请注意,使用以下设置我不会遇到任何拒绝服务问题。
- 调用链如下,Client->Service1->Service2->Service3
- 所有服务都是 PerCall,并发设置为多个。
- 节流设置为 X 个并发调用,X 个并发实例。
- X 服务上的 MaxConnections、ListenBacklog。
- ThreadPool 的最小/最大线程数在客户端和服务器上都设置为 X(我已经应用了 Microsoft 提供的补丁)。
不确定我测量的响应时间是否准确。我是否遗漏了一些非常微不足道的东西?
对此的任何输入都会有很大帮助。
谢谢。
-克里希南
最佳答案
我确实通过艰难的方式找到了答案。一直以来,我测量响应时间的方式都是错误的。应该生成 X 个线程,其中 X 是要模拟的并发用户数。在每个线程中,仅打开一次连接并使用 while 循环在给定的持续时间内仅执行要测试的 WCF 方法。测量每个返回的响应时间,将其累加并将其与给定持续时间内执行的调用次数进行平均。
关于c# - 模拟并发 WCF 客户端调用并测量响应时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3377541/