我在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屏幕截图中看到的负载相当低,也是如此:
我使用的是Windows Server 2012。
到目前为止我的结论是,我的代码不是需要很长时间才能执行的。但那又是什么呢?我该如何调查这个问题?
(我还尝试使用Global.asax中的Application_BeginRequest
和Application_EndRequest
来衡量效果。它给出了大致相同的值。)
编辑:
来自fiddler记录的随机请求的一些额外信息。请注意ClientConnected
和ClientBeginRequest
:
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
答案 0 :(得分:0)
仔细观察服务器上的性能计数器后,我发现执行时间实际上非常低。但约400请求pr。第二,IIS开始对请求进行排队。
所以我的问题的答案必须是,除了执行我的代码之外,请求在队列中花费了大量时间。队列开始建立,但每个请求的执行时间仍然非常低。
这引出了一个新问题。如何优化我的应用程序或服务器设置以推动限制。但这是另一个故事。