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

    问题描述:

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

    image

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

    image

    RedGate分析

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

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

    image

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

    image

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

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

    image

    注,示例说明:

    在调用ashx时,如果需要应用Session,则必须继承接口IRequiresSessionState,IReadOnlySessionState,但根据字面,可以知道IRequiresSessionState可对Session进行所有操作,IReadOnlySessionState只能对Session进行只读操作

    假设场景:有页面Test.aspx以及一般处理程序Requires.ashx和ReadOnly.ashx(Requires.ashx继承IRequiresSessionState,ReadOnly.ashx继承IReadOnlySessionState,两者的ProcessRequest方法内都只有一段代码System.Threading.Thread.Sleep(1000)),Test.aspx分别有一段js通过ajax异步的方式调用Requires.ashx和ReadOnly.ashx


    活动场景1:对Requires.ashx同时进行2次ajax异步访问,通过FireBug监测时间,可以发现第一个Requires.ashx的执行时间为1秒,第二个Requires.ashx的执行时间为2秒,第二个Requires.ashx的处理时间比第一个多1倍
    活动场景2:对ReadOnly.ashx同时进行2次ajax异步访问,通过FireBug监测时间,可以发现第一个ReadOnly.ashx的执行时间为1秒,第二个ReadOnly.ashx的执行时间为1秒,两者处理时间相同

    可以得出结论,在继承IRequiresSessionState时,为保证Session的正确性,asp.net内部机制会保证同一次会话期间,在第一个ashx执行完毕前,不会执行第二个ashx;而继承IReadOnlySessionState时,因为Session是只读不变的,所以asp.net不需要对Session的正确性进行控制,无论多少个请求,只要IIS能处理,就会同时处理多少个请求

  • 相关阅读:
    rpm命令参数(转载)
    通过KMS服务器激活windows
    icehouse版本中常用操作命令
    openstack环境搭建常用命令
    openstack 重启服务命令
    python连接mysql数据库报错pymysql连接数据库报错TypeError: __init__() takes 1 positional argument but 5 positional arguments
    Linux下LDAP统一认证解决方案
    windows系统添加IP地址黑名单
    网站防止SQL注入
    Windows服务器修改远程端口号的方法
  • 原文地址:https://www.cnblogs.com/zhaoguan_wang/p/4569820.html
Copyright © 2011-2022 走看看