调整WCF文件服务器

时间:2009-11-10 23:56:30

标签: wcf iis performance

我正在调整服务器并需要一些指导。此服务器提供以下功能:

  1. 一个带有数据库调用的ASPX页面,大约每3分钟由几千台机器下载
  2. 一个简单的ASP.NET管理网站,由少数人使用但必须具有高可用性
  3. 一个WCF服务,它使用BasicHttpBinding和Streamed消息为另外几千个客户端提供文件同步。
  4. 当文件同步客户端(#3)有可用的更新时,他们会聚集服务器,要求他们的新数据。如果没有激进的限制,他们会占用所有可用的ASP.NET工作线程并导致#1和#2挂起。孩子们说,这就是sux0rs。

    我在4-proc服务器上重现了这个问题。通过测试客户端创建100个同时下载,我看到48个下载同时运行;在perfmon中,我看到其余部分在ASP.NET->应用程序队列中的请求中排队。这与in this article描述的“每CPU 12个并发线程”默认设置相吻合。 CPU和内存看起来很好;它实际上只是在没有处理的情况下切换字节。

    在我看来,我可以做一些事情,可能是一致的。

    1. 在machine.config
    2. 中启动maxIOThreads和maxWorkerThreads
    3. 设置网络花园
    4. 重做客户端,以便直接处理下载而不是通过WCF(例如直接链接到文件而不是通过消息流式传输)。
    5. 我的问题:

      • 除了试验和错误之外,对于增加线程数量有什么好的指导方针,因为每个线程都会在CPU /内存使用率较低的情况下长时间使用?如果我走这条路线,我如何确保增加线程数量的任务切换不会超过系统并导致更多问题?
      • 在这种情况下,网络花园会有所帮助吗?
      • 如果我从WCF下载并让IIS完全处理它,我会看到更好的性能吗?

      Best,roufamatic

1 个答案:

答案 0 :(得分:1)

如果做得对,WCF是这项工作的最佳工具。如果您要发送一个静态文件,我建议查看一个异步服务impl(如果你想在没有WCF的ASP.NET中执行它的异步HttpHandler),它建立在一个设置了异步标志的FileStream上,并且客户端也写异步。这将允许您更有效地使用工作线程并将工作卸载到操作系统。同时下载同一文件的1000份副本不应该导致您的服务器在impl正确完成时瞄准。