.net 当客户端是同一服务器中的服务时,对服务的请求进入队列

.net 当客户端是同一服务器中的服务时,对服务的请求进入队列,.net,multithreading,wcf,performance,.net,Multithreading,Wcf,Performance,我有一个奇怪的问题。我在一台服务器上有3个WCF服务。Manager服务是外部请求的主要入口点。另一个服务是应用程序的逻辑。第三个服务是一个数据库连接服务,这两个服务都可以访问,并且正在做大部分工作(数据库可以) 当我运行一个负载测试并向管理器发出请求并运行一个性能测试时,我同时运行了90个不同的线程,第二个服务大约有50个线程,DB连接只有大约12个线程 我觉得这是应用程序中的一个主要性能问题。当我分析这两个服务时,我发现它们确实在等待来自DB服务的响应 我试着直接运行DB服务的测试。我运行了

我有一个奇怪的问题。我在一台服务器上有3个WCF服务。Manager服务是外部请求的主要入口点。另一个服务是应用程序的逻辑。第三个服务是一个数据库连接服务,这两个服务都可以访问,并且正在做大部分工作(数据库可以)

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

我觉得这是应用程序中的一个主要性能问题。当我分析这两个服务时,我发现它们确实在等待来自DB服务的响应

我试着直接运行DB服务的测试。我运行了80个线程,并在打开通道和发送请求之前使用ManualEventHandler停止了它们。当一切就绪后,我设置了处理程序,它在DB连接服务中运行了大约25个线程

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

你知道发生了什么事吗

为什么请求排队

一些补充资料:

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

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

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

您是否对
并发模式设置进行过任何设置?请参见此处:。它对服务间通话有影响。如果你不介意我问的话,为什么会有这种设计?。在我看来,它好像在自找麻烦。@thecoon为什么会有麻烦?你能详细说明一下吗?我知道请求是排队的,我问他们为什么排队。我知道这似乎是错误的,但您建议如何在允许其他客户端直接向db连接服务发送请求的情况下采取不同的做法?您是否配置了并发模式和限制?如果所有服务都是WCF(我假设它们是),并且您可以访问所有服务(我假设您可以访问),则仅在一个服务中从DB服务和业务服务移动合同。在这个场景中,您将有一个业务服务的入口点,它将直接访问DAL(而不是通过调用单独的服务)。另外,如果有客户机必须只访问DAL,则没有问题,因为这些DAL方法是使用不同的契约在同一服务上公开的。您在服务之间使用什么类型的绑定?我已经编辑了关于绑定和上下文的问题。关于统一服务的建议听起来非常感谢!但我仍然对所描述的行为感到困惑,你认为这是为什么?可能两个服务在与db服务的同一连接上竞争?如果是这样的话,为什么会这样?有没有办法跨越它?我不确定我是否明白,我以为只有你的一项服务正在访问数据库。即使两个服务同时尝试访问数据库,也不应导致此类问题,除非两个服务都尝试访问数据库中的同一资源(同一个表),并且这两个服务中的一个服务的一个操作是锁定它。你能从每个服务中发布一个服务操作的代码吗?