当客户端是同一服务器中的服务时,服务请求将排队

时间:2012-06-28 13:54:21

标签: .net multithreading wcf performance

我有这个奇怪的问题。我在服务器上有3个WCF服务。 Manager服务是来自外部的请求的主要入口点。另一项服务是应用程序的逻辑。第三个服务是一个数据库连接服务,这两个服务都进入并正在完成大部分工作(数据库确实如此)。

当我向管理员发出请求并运行性能测试的负载测试时,我有90个不同的线程同时运行,第二个服务大约有50个,而DB连接只有大约12个。

我觉得这是应用程序中的主要性能问题。当我对两种服务进行分析时,我发现他们确实等待了很多来自数据库服务的响应。

我尝试直接向DB Service运行测试。在打开通道之后和发送请求之前,我运行了80个线程并使用ManualEventHandler停止了它们。然后,当所有准备就绪时,我已经设置了处理程序,它在DB连接服务中运行了大约25个线程。

因此它能够处理超过12个线程。

有什么想法发生了什么?

为什么请求排队?

其他一些信息:

绑定是basichttpbinding但我尝试了net pipe ipc,结果相同。 我已将上下文模式和并发性设置为每次调用或每次会话多次,结果相同。

此外,服务是自托管的。 这是架构的原因是为了允许多个其他服务或应用程序直接向这些服务发送请求。在这个特定的事件中,我按照描述进行测试,在其他事件中,流程可能不同。

1 个答案:

答案 0 :(得分:2)

这意味着这些请求正在排队等候。如果您的所有服务都托管在IIS上,您可以使用ASP.NET性能计数器查看每个服务级别上的待处理请求数(据我所知,WCF不提供此类性能计数器)。 正如@the coon所说,这肯定是错误的架构方法。与在不同层上由相同服务执行的业务逻辑和数据访问操作相比,每个服务调用可被认为是昂贵的。说实话,我没有看到使用这种方法的理由。