WCF流式下载 - IIS与控制台中托管的高CPU利用率

时间:2014-04-10 21:00:03

标签: c# .net wcf iis

我看过一些看似相关的帖子,这些帖子没有提供解决方案(或者有助于我解决问题的解决方案):

CPU usage goes upto 75% while stream a 300 MB file using WCF service

High CPU load using WCF streaming

所以我希望那里有人可以提供帮助。

我已经使用.NET 4.5整合了一个WCF服务,以便于上传和下载大文件(数百MB到GB)。

我正在使用" Streamed"没有安全性的BasicHttpBinding上的TransferMode。

一切正常,但是,我注意到在IIS中托管时服务的CPU利用率与在控制台应用程序中自托管它时存在巨大的差异。

在控制台应用程序中,利用率低于20%,一旦在IIS中,利用率超过80% - 这是单个实例下载。

在两种情况下,服务的配置方式相同,并且两者都在同一个框中运行。

我的绑定配置如下:

<binding name="UnsecuredStreamBinding"
                 receiveTimeout="00:30:00"
                 sendTimeout="00:30:00"
                 transferMode="Streamed"
                 maxReceivedMessageSize="53687091200" maxBufferSize="65536" /> <!--50GB--> 

服务代码也很简单:

...
var fileStream = File.OpenRead(filename);
var size = fileStream.Length;

var response = new DownloadResponse
    {
       FileStream = fileStream,
       Size = size,
    };

return response;

其中DownloadResponse被定义为MessageContract。

我在改变默认IIS环境方面做得很少(Windows Server 2012 R2上的IIS 8.5) 记录/诊断已关闭,因此不会增加开销。

这是我第一次涉足Web服务开发,所以我知道有很多我不知道的,我希望我能错过一些相当简单的东西来解释巨大的问题。我看到的CPU利用率差异。

1 个答案:

答案 0 :(得分:2)

我终于弄清楚发生了什么......

在IIS 8.5控制面板的IIS部分下,有一个&#34;压缩&#34;特征。 在那里,有两个选项默认选中;

  • 启用动态内容压缩
  • 启用静态内容压缩

似乎&#34;动态内容压缩&#34;应该责怪,取消选中此选项会导致CPU利用率与控制台应用程序的CPU利用率相似。

重新检查此选项时,实际上会警告您可能会导致更高的CPU利用率。