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

本文关键字:利用率 CPU 控制台 下载 -IIS WCF | 更新日期: 2023-09-27 17:57:58

我看过几篇看似相关的帖子,它们没有提供解决方案(或有助于我的情况的解决方案):

使用WCF服务流式传输300 MB文件时,CPU使用率高达75%

使用WCF流的高CPU负载

所以我希望有人能帮忙。

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

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

一切都很好,但是,我注意到在IIS中托管的服务与在控制台应用程序中自托管的服务在CPU利用率方面存在巨大差异。

在Console应用程序中,利用率低于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利用率的巨大差异。

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

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

在IIS 8.5控制面板的IIS部分下,有一个"压缩"功能。在那里,有2个选项,默认选中;

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

"动态内容压缩"似乎是罪魁祸首,取消选中此选项会导致与Console应用程序类似的CPU利用率。

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