什么是IIS上的时间,如果它不是我的代码?请求是否排队?

时间:2014-07-21 17:10:19

标签: c# asp.net performance iis asp.net-web-api

我在asp.net Web API中实现了许多服务。 我已经实现了一个ActionFilterAttribute来衡量服务器上的性能:

public class PerformanceActionFilterAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        actionContext.Request.Properties[StopwatchKey] = Stopwatch.StartNew();
        base.OnActionExecuting(actionContext);
    }

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        var stopwatch = (Stopwatch) actionExecutedContext.Request.Properties[StopwatchKey];
        if(actionExecutedContext.Response != null)
            actionExecutedContext.Response.Headers.Add("ServerTimeMs", stopwatch.ElapsedMilliseconds.ToString());

        base.OnActionExecuted(actionExecutedContext);
    }
}

上述代码将服务器上的时间花费作为标头发送回客户端。此标头显示所有服务调用的非常好的性能。通常低于100毫秒。 当服务器上的负载增长时,我从上面的测量中获得了不错的性能,但我在浏览器中遇到的性能很糟糕。 我得到了#34;等待时间"超过10秒。即使从Chrome屏幕截图中看到的负载相当低,也是如此:

Network tab in chrome

我使用的是Windows Server 2012。

到目前为止我的结论是,我的代码不是需要很长时间才能执行的。但那又是什么呢?我该如何调查这个问题?

(我还尝试使用Global.asax中的Application_BeginRequestApplication_EndRequest来衡量效果。它给出了大致相同的值。)

编辑: 来自fiddler记录的随机请求的一些额外信息。请注意ClientConnectedClientBeginRequest

之间的长差距
ClientConnected:    19:20:58.835
ClientBeginRequest: 19:21:06.928
GotRequestHeaders:  19:21:06.928
ClientDoneRequest:  19:21:06.928
Determine Gateway:  0ms
DNS Lookup:         0ms
TCP/IP Connect:     0ms
HTTPS Handshake:    0ms
ServerConnected:    19:20:53.769
FiddlerBeginRequest:19:21:06.928
ServerGotRequest:   19:21:06.929
ServerBeginResponse:19:21:07.043
GotResponseHeaders: 19:21:07.043
ServerDoneResponse: 19:21:07.043
ClientBeginResponse:19:21:07.043
ClientDoneResponse: 19:21:07.043

1 个答案:

答案 0 :(得分:0)

仔细观察服务器上的性能计数器后,我发现执行时间实际上非常低。但约400请求pr。第二,IIS开始对请求进行排队。

所以我的问题的答案必须是,除了执行我的代码之外,请求在队列中花费了大量时间。队列开始建立,但每个请求的执行时间仍然非常低。

这引出了一个新问题。如何优化我的应用程序或服务器设置以推动限制。但这是另一个故事。