【性能诊断】四、单功能场景的性能分析(RedGate,找到同一个客户端的并发请求被串行化问题)

时间:2021-11-07 05:51:48

问题描述:

  1. 客户端js连续发起两个异步http请求,请求地址相同,但参数不同;POST http://*.*.*.*/*****/webservice/RESTFulWebService/RESTFulHandlerForWeb.ashx HTTP/1.1
  2. 服务器端第二方法的响应时间明显很长(不正常),在ProcessRequest方法上增加日志后发现,第二个方法的开始时间明显延迟了大约0.5秒
  3. 后台跟踪发现累计SQL执行时间不超过50毫秒;

【性能诊断】四、单功能场景的性能分析(RedGate,找到同一个客户端的并发请求被串行化问题)

使用log记录应用处理的响应时间(11表示handler方法开始,22表示handler结束),结果发现:两个http请求,从服务器端处理的时间上来看是很短的;

【性能诊断】四、单功能场景的性能分析(RedGate,找到同一个客户端的并发请求被串行化问题)

RedGate分析

通过redgate抓取服务器端的处理堆栈,发现两个http请的处理方式不一样。

第一个请求的处理堆栈如下(这是一个普通的、正常的堆栈):

【性能诊断】四、单功能场景的性能分析(RedGate,找到同一个客户端的并发请求被串行化问题)

第二个请求额处理堆栈如下(可以看到time队列及sessionState关键字):

【性能诊断】四、单功能场景的性能分析(RedGate,找到同一个客户端的并发请求被串行化问题)

查阅资料显示,如果HttpHandler实现了IRequiresSessionState接口,会导致同一个客户端的并发请求被串行化。解决办法:去掉该接口或改为IReadOnlySessionState

根据堆栈提出找到对应的handler代码,果然实现了该接口,至此问题解决。

【性能诊断】四、单功能场景的性能分析(RedGate,找到同一个客户端的并发请求被串行化问题)