1

我正在运行 Windows 8.1,并且我有一个集成测试套件,它利用 HostableWebCore 来启动隔离的 ASP.NET Web 服务器进程。出于性能原因,我一次启动其中的 8 个,一旦它们启动,我向每个发送一个非常简单的 Web 请求,该请求由加载到每个中的 MVC 应用程序处理。每个实例都在侦听不同的端口。

问题是请求在 HTTP.sys (或现在所谓的任何名称)中被阻止(我相信)。如果我查看 fiddler,我可以立即(在几毫秒内)看到所有 8 个请求都达到了 ServerGotRequest 状态。但是,请求会处于这种状态 20-100 秒,具体取决于我一次并行运行的数量。

我怀疑这是 HTTP.sys 问题的原因是因为我必须等待它们中的任何一个响应的时间随着我并行启动的托管应用程序的数量而增加。如果我只启动一个托管应用程序,它将在大约 20 秒内开始响应。如果我启动 2,它们都会在约 30 秒内开始响应。如果我旋转 4,~40 秒。如果我启动 8,~100 秒(这是默认的 WebClient 请求超时)。

由于这种长时间的延迟,我有足够的时间附加调试器并在我的控制器操作中放置一个断点,并且该断点将在 20-100 秒的延迟后命中,这表明我的进程尚未收到请求。在大约 5-10 秒的冷启动 CPU 搅动之后,所有主机都处于空闲状态 20-100 秒。所有主机似乎同时接收到请求,好像有什么东西阻止了任何请求通过,然后突然让一切通过。

我的问题是,我无法找到任何有关如何调试 HTTP.sys 的信息。我怎样才能看到它在做什么?是什么导致阻塞?为什么要等待将请求转发给工人?为什么他们都一起度过了难关?

或者,如果有人知道我如何解决这个问题并让请求立即通过(无需等待),我将非常感激。

另一个注意事项:我可以看到系统(PID 4)在托管应用程序启动后立即注册以侦听我指定的端口。

附加信息:这是我的一个托管应用程序在下面的样子netsh http show servicestate

Server session ID: FD0000012000004C
    Version: 2.0
    State: Active
    Properties:
        Max bandwidth: 4294967295
        Timeouts:
            Entity body timeout (secs): 120
            Drain entity body timeout (secs): 120
            Request queue timeout (secs): 120
            Idle connection timeout (secs): 120
            Header wait timeout (secs): 120
            Minimum send rate (bytes/sec): 150
    URL groups:
    URL group ID: FB00000140000018
        State: Active
        Request queue name: IntegrationTestAppPool10451{974E3BB1-7774-432B-98DB-99850825B023}
        Properties:
            Max bandwidth: inherited
            Max connections: inherited
            Timeouts:
                Timeout values inherited
            Logging information:
                Log directory: C:\inetpub\logs\LogFiles\W3SVC1
                Log format: 0
            Number of registered URLs: 2
            Registered URLs:
                HTTP://LOCALHOST:10451/
                HTTP://*:10451/

Request queue name: IntegrationTestAppPool10451{974E3BB1-7774-432B-98DB-99850825B023}
    Version: 2.0
    State: Active
    Request queue 503 verbosity level: Basic
    Max requests: 1000
    Number of active processes attached: 1
    Controller process ID: 12812
    Process IDs:
        12812
4

1 回答 1

0

主要是为了后人回答这个问题。原来我的问题不是 HTTP.sys,而是 ASP.NET。当它试图编译文件时,它会打开一个共享锁。此共享锁由 标识System.Web.HttpRuntime.AppDomainAppId。我相信,由于我所有的应用程序都是从一个公共applicationHost.config文件动态构建的,它们都具有相同的 AppDomainAppId ( /LM/W3SVC/1/ROOT)。这意味着它们都共享一个锁,并且实际上所有页面编译对于所有应用程序都是按顺序进行的。但是,由于从锁中来/去的性质,所有页面都倾向于同时完成,因为它们中的任何一个都不太可能及时到达进程的结尾,从而导致它们全部完成大约在同一时间。一旦其中一个通过,其他人可能紧随其后并在之后完成。

于 2015-04-03T21:32:48.690 回答