【问题标题】:CPU usage goes upto 75% while stream a 300 MB file using WCF service使用 WCF 服务流式传输 300 MB 文件时 CPU 使用率高达 75%
【发布时间】:2010-08-31 10:30:09
【问题描述】:

我有一个用于下载文件的 wcf 服务。它工作正常(终于),但我可以看到当它下载时 CPU 使用率约为 75%。

请指教

客户端代码

FileTransferServiceClient obj = new FileTransferServiceClient();
Byte[] buffer = new Byte[16 * 1024];
CoverScanZipRequest req = new CoverScanZipRequest(
    new string[] { "1", "2" });

CoverScanZipResponse res = new CoverScanZipResponse();
res = obj.CoverScanZip(req);

int byteRead = res.CoverScanZipResult.Read(buffer, 0, buffer.Length);
Response.Buffer = false;
Response.ContentType = "application/zip";
Response.AddHeader("Content-disposition", 
    "attachment; filename=CoverScans.zip");

Stream outStream = Response.OutputStream;
while (byteRead > 0)
{
    outStream.Write(buffer, 0, byteRead);
    byteRead = res.CoverScanZipResult.Read(buffer, 0, buffer.Length);
}
res.CoverScanZipResult.Close();
outStream.Close();

【问题讨论】:

  • 你希望它有多高?
  • 几乎不可能在没有更多细节的情况下提供任何建议。请给我们一些代码。
  • 通常我不希望它超过 40-50 %。
  • @Brain,对不起。我现在添加了调用 Web 服务的代码。请指教
  • 可能是你读/写了很多小块,比如每 kB 的 kB。如果您通过读取/写入更大的片段来减少 CPU 使用率,您可以尝试。

标签: c# asp.net wcf


【解决方案1】:

在这一行:

byteRead = res.CoverScanZipResult.Read(buffer, 0, buffer.Length);

您是否正在获取未压缩的数据,并在运行中对其进行压缩。如果是这样,那可能是您的问题。压缩数据可能会占用大量 CPU。作为一个诊断测试,尝试简单地将原始数据发送到 bowser 并查看 CPU 使用率是否下降。如果您在运行中压缩并发送未压缩的数据会减少 CPU 负载,那么您有 2 个现实的选择。

  1. 确保您有足够的服务器基础架构来执行此操作。

  2. 离线压缩您的文件,这样它们就可以排队,这样多人同时访问该服务就不会杀死服务器。然后,您可以将 zip 文件保存在临时文件夹中,并在处理完成后通过电子邮件向用户发送链接或类似内容。

【讨论】:

  • 本,感谢您的回复。我可以确认我没有即时进行任何压缩。我所做的只是从磁盘读取一个大约 300MB 的 zip 文件并从客户端下载它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 2018-03-27
  • 1970-01-01
相关资源
最近更新 更多