【问题标题】:WCF Streamed Download - High CPU Utilization Hosted in IIS vs ConsoleWCF 流式下载 - 托管在 IIS 与控制台中的高 CPU 利用率
【发布时间】:2014-04-10 21:00:02
【问题描述】:

我查看了一些看似相关的帖子,但没有提供解决方案(或对我的情况有帮助的解决方案):

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)的上传和下载。

我在没有安全性的 BasicHttpBinding 上使用“流式”传输模式。

一切正常,但是,我注意到在 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 利用率方面的巨大差异看到了。

【问题讨论】:

    标签: c# .net wcf iis


    【解决方案1】:

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

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

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

    看起来应该归咎于“动态内容压缩”,取消选中此选项会导致与控制台应用程序的 CPU 利用率相似。

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

    【讨论】:

      猜你喜欢
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      相关资源
      最近更新 更多