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



我遇到了这个奇怪的问题。我在服务器上有 3 个 WCF 服务。管理器服务是外部请求的主要入口点。另一项服务是应用程序的逻辑。第三个服务是一个数据库连接服务,两个服务都去并完成大部分工作(数据库这样做)。

当我使用对管理器的请求运行负载测试并运行性能测试时,我同时运行了 90 个不同的线程,第二个服务大约有 50 个,数据库连接只有大约 12 个。

我觉得这是应用程序中的主要性能问题。 当我分析这两个服务时,我看到它们确实等待了很多来自数据库服务的响应。

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

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

有什么想法是怎么回事吗?

为什么请求会排队?

一些附加信息:

绑定是基本的httpbinding,但我尝试了netpipe ipc,结果相同。我将上下文模式和并发性设置为每个调用或每个会话多个具有相同结果。

此外,服务是自托管的。体系结构之所以如此,是为了允许多个其他服务或应用程序将请求直接发送到这些服务。在这个特定的事件中,我按照描述对其进行测试,在其他事件中,流程可能会有所不同。

这意味着这些请求在途中排队。如果所有服务都承载在 IIS 上,则可以使用性能计数器 ASP.NET 每个服务级别上挂起的请求数(据我所知,WCF 不提供此类性能计数器)。正如@the coon所建议的那样,这肯定是错误的架构方法。与在不同层上由同一服务执行业务逻辑和数据访问操作相比,每个服务调用都可以被视为昂贵的调用。老实说,我看不出使用这种方法的理由。

最新更新