【问题标题】:WCF service unresponsive under CPU loadWCF 服务在 CPU 负载下无响应
【发布时间】:2011-06-30 06:21:44
【问题描述】:

我有一个相当简单的 WCF 服务。大多数服务调用在 300 毫秒或更短的时间内执行。这些调用的负载将相当轻。

一旦“报告”电话是一个长时间运行(10 到 15 分钟)的电话。它与 IO 的 CPU 绑定仅在调用的前几毫秒和最后几毫秒内发生。这些报告调用应该是连续的。

在“报告”调用期间,我想轮询服务的进度。我曾希望简单地设置两个 ServiceHost... 一个使用 ConcurrencyMode.Single 用于长时间运行的报告,一个使用 ConcurrencyMode.Multiple 用于轮询。

但是,一旦“报告”调用运行(系统 CPU 接近 100%),轮询状态调用就永远不会进入服务。我曾希望 OS CPU 调度程序能让新请求拥有一块 CPU,但事实并非如此。

我读过另一个 SO 问题,即 .NET 线程池在 CPU 负载较重的情况下可能不会产生新线程。 “报告”调用发送到第 3 方 DLL,因此我没有明显的方法来限制该进程。

关于如何让轮询调用与长期运行的“报告”调用并行处理的任何想法?

(我正在使用 netTcpBinding。)

【问题讨论】:

    标签: c# wcf threadpool


    【解决方案1】:

    我读过另一个 SO question .NET ThreadPool 可能不会产生新的 重 CPU 负载下的线程。这 “报告”电话打到第三个 派对DLL,所以我没有明显的 限制该过程的方法。

    它在第 3 方 DLL 中并不重要。您仍然可以从另一个线程(具有较低线程优先级)调用第三方 DLL,并使用线程同步原语使主线程休眠,直到您完成。

    【讨论】:

    • 是的......这样的事情是我的后备计划。但是,我的理解是,我的用例是 WCF 应该可以很好地处理的东西。
    【解决方案2】:

    如果您将处理操作设置为 OneWay,这将实质上创建一个异步调用,然后您可以“轮询”此操作的状态。目前,它将在继续之前等待回复。

    我使用类似的过程来插入和处理大型文本文件。

    http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapdocumentmethodattribute.oneway(v=vs.71).aspx

    【讨论】:

    • 出于好奇,您是否遇到过 CPU 负载过重的类似情况?如果我使用Thread.Sleep 调用模拟长时间运行的服务,一切都会按预期工作。据我所知,整个 WCF 堆栈在 CPU 负载较重的情况下表现不同。
    • 另外,你用的是什么绑定?到目前为止,从我对该主题的简单阅读来看,它的行为似乎因绑定而异。
    • CPU 负载“更高”,但不是特别高。我们使用了 httpBinding。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多