【问题标题】:WCF polling, background processing, and resource starvationWCF 轮询、后台处理和资源匮乏
【发布时间】:2010-01-21 09:54:07
【问题描述】:

我有一个使用 WCF 实现并托管在 IIS7 中的 Web 服务,具有提交-轮询通信模式。发出初始请求,该请求快速返回并启动后台进程。客户端轮询后台进程的状态。此接口已设置且无法更改(它是我们所依赖的外部服务的模拟)。

我通过向现有服务添加另一个服务合同来实现后台处理,该服务合同使用单向消息合同启动长时间运行的流程。 “后台”服务会根据状态更新数据库,以便与主服务进行通信。这样可以避免创建任何新的 Web 服务或要部署的项目。

问题是后台进程占用大量 CPU 资源,并且似乎正在饿死其他服务调用。它将占用整个处理器,当后台进程的单个实例正在运行时,对主服务的状态轮询调用可能需要一分钟以上。我不在乎后台进程需要多长时间。

有没有办法限制后台方法的资源使用?或者在不更改我的提交/轮询服务合同的情况下在 WCF 中执行长时间运行的异步进程的明显方法?如果这两个服务仍在同一台服务器上运行,将它们分成不同的 Web 服务会有所帮助吗?

【问题讨论】:

    标签: wcf


    【解决方案1】:

    我会尝试的第一件事是降低优先级。

    如果您实际上为后台工作分离了一个单独的进程,那么您可以这样做:

    Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.BelowNormal;
    

    如果它真的只是一个背景线程,请改用它(在线程内):

    Thread.CurrentThread.Priority = ThreadPriority.BelowNormal;
    

    (其实最好先挂起线程,在运行前在调用者处改变优先级,但一般自己调低优先级也可以。)

    至少它应该有助于确定这是否真的是 CPU 问题。如果您在降低优先级后仍有问题,则可能是其他一些问题,例如文件或网络 I/O。

    【讨论】:

    • 它实际上是一个Web服务调用,而不是一个进程或一个线程。我的印象是,从 IIS 托管的应用程序中启动自己的线程或进程是个坏主意。
    • @Tegan Mulholland:不,创建线程并没有什么问题,事实上,如果您需要在仍然执行长时间运行的操作时,您应该应该这样做服务大量请求。只是不要使用ThreadPool;使用实际的System.Thread
    猜你喜欢
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 2017-11-19
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    相关资源
    最近更新 更多