我正在运行 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