【问题标题】:Performance in Service Stack vs IIS for serving files服务堆栈与 IIS 中的文件服务性能
【发布时间】:2012-08-07 17:08:10
【问题描述】:

我们将服务堆栈用于 Web 服务 API。我们编写了一个“获取文件”例程来获取文件,而不是让 IIS 直接提供文件,因为我们需要服务器端的身份验证逻辑。

我们通过返回一个IStreamWriterRestServiceBase<Foo>.OnGet返回一个文件,实现如下:

public void WriteTo(Stream responseStream)
{
    Stream filedata = File.OpenRead(_filepath);
    filedata.CopyTo(responseStream);
}

问题:这比 IIS 直接提供文件要慢 50% 到 100%。

我是否从服务堆栈错误地返回了文件?有什么办法可以加快速度吗?


或者,有什么方法可以将我们的身份验证方案(我们希望完全无状态,因此在服务器机器上没有缓存凭据)插入 IIS,以便 IIS 以某种方式调用我们的服务器来验证每个请求,然后服务文件本身?

【问题讨论】:

    标签: authentication iis servicestack


    【解决方案1】:

    本机代码与托管代码

    IIS 将使用本机代码来提供静态文件,并且可能会采用一些积极的内存缓存来实现其性能。

    由于 ServiceStack 是一个 .NET 库,代码直接写入 ASP.NET 的响应流,因此在托管 .NET 代码中流式传输文件时更难获得更快的速度。您可以通过将文件加载到内存中并改为写入原始字节来进一步提高性能。

    利用 HTTP 缓存

    这就是为什么如果您必须使用托管代码,您应该尽最大努力利用 HTTP 缓存,这是我们在 StaticFileHandler 中所做的 - 即 ServiceStack 用于提供其静态内容的内容,例如 css/ js/html 页面。

    注册一个原始的 HttpHandler

    尽管 ServiceStack 的请求管道已经过高度优化(即不会增加太多开销),您仍然可以通过注册自己的自定义 IHttpHandler 来绕过它并自己处理原始 ASP.NET 请求 - 这将是最快的选择在 .NET 代码中,例如:

    SetConfig(new EndpointHostConfig { 
        RawHttpHandlers = { MiniProfilerHandler.MatchesRequest },
    });
    

    这是内置 MiniProfiler 用来提供静态内容的。 MatchesRequest 只需要一个 IHttpRequest 来确定它是否应该处理请求(通过返回 IHttpHandler 的实例)或不(返回 null):

    public static IHttpHandler MatchesRequest(IHttpRequest request)
    {
        var file = Path.GetFileNameWithoutExtension(request.PathInfo);
        return file != null && file.StartsWith("ss-") 
            ? new MiniProfilerHandler()
            : null;
    }
    

    除此之外,ServiceStack 的独立版本(即 HttpListener 主机)应该提供比 ASP.NET 更好的原始吞吐量。

    【讨论】:

    • 感谢您对这个问题的回答,我可以解决我在 Mac 上运行 ServiceStack 时遇到的问题。一段时间后,SS 将停止提供静态文件,尽管正在提供动态 Razor 视图。只有重新启动该过程才能解决它。阅读您的答案后,我禁用了 MiniProfiler(它已打开)并且问题停止了。只是让您知道,如果您想进一步了解它。
    【解决方案2】:

    在 IIS I/O 线程到 CLR 线程池上的线程的上下文切换中存在惩罚,如果您将 (asp config) MaxConcurrentRequestsPerCPU 设置为 0,您的 CLR 代码应该能够减轻这种情况(可能不过还有其他影响)

    http://blogs.msdn.com/b/tmarq/archive/2007/07/21/asp-net-thread-usage-on-iis-7-0-and-6-0.aspx

    我不知道 Windows 是否允许“零复制”:对文件进行“零复制”(从不离开内核模式并跳过套接字上的缓冲区到文件句柄操作)但是如果支持,IIS 肯定会使用它(使其比用户模式下的 CLR ..)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-08
      相关资源
      最近更新 更多