如何诊断和调优,才能轻松与数据库“timeout”说再见?
《如何诊断和调优,才能轻松与数据库“timeout”说再见?》要点: 作者介绍 许昌永,高级DBA,微软SQLServerMVP,十年以上SQLServer使用经验.曾就职于腾讯公司,从事了六年游戏行业SQLServer数据库开发和管理.目前就职于跨境电商DX.COM三年多,负责公司SQLServer和MongoDB的数据库架构设计、高可用部署、运维管理和性能优化等工作.翻译出版了书籍《PowerShellV3——SQLServer2012数据库自动化运维权威指南》,文末将有许老师的新书赠送,不容错过~ 一、超时分析下面是用户访问一个Web站点的常见错误: 详细错误描述如下: 以上输出非常清晰地描述了,对于这个操作的超时时间结束,而实际上工作并没有完成. 我们常常会发现“timeout”错误,那么具体是在哪个访问阶段、受哪个设置影响报出来的呢?下面,我们通过典型的Web应用架构来分析下超时问题. 结合上面的访问关系图,可以看到:我们从数据库实例的角度出发,它会收到来自Web端的访问、用户的直接访问,它也可能同时访问其他数据库实例.那么,连接就分为传入连接(Incomingconnection)访问和传出连接(Outgoingconnection)访问.那我们就根据不同阶段的访问来分类超时问题. 传入连接:Web端访问超时首先,针对传入连接,我们来看看Web端的访问超时:有ASP.NET请求超时、WebService请求超时、IIS请求超时、数据库连接超时和查询超时. ASP.NET请求超时 ASP.NET页面的运行超时时间可以在多个地方设置. 来自MSDN的解释: httpRuntime是配置asp.Nethttp运行时设置,以确定如何处理对asp.Net应用程序的请求. executionTimeout:表示允许执行请求的最大时间限制,单位为秒.默认值为90秒. maxRequestLength:指示ASP.Net支持的最大文件上载大小.该限制可用于防止因用户将大量文件传递到该服务器而导致的拒绝服务攻击.指定的大小以KB为单位.默认值为4096KB(4MB). 1、全局超时时间 服务器上如果有多个网站,希望统一设置一下超时时间,则需要设置Machine.config文件中的ExecutionTimeout属性值.Machine.config文件位于%SystemRoot%\Microsoft.NET\Framework\%VersionNumber%\CONFIG\目录中. 例如:
2、单个站点超时时间 Web.config配置文件中设置http请求运行时间:
这里设置的为720秒,前面的属性maxRequestLength一般用于用户上传文件限制大小!默认一般为4096KB(4MB). 3、单个页面请求超时时间 对于单个页面,可以使用Server.ScriptTimeout来设定超时. Server.ScriptTimeout=120; 注意:如果在Web.config里设置了debug属性,例如: <compilationdebug=”true”targetFramework=”4.0″> 此时,ScriptTimeout会被忽略. WebService请求超时 扩大代理类的超时限制,默认是90秒,即在调用方法前指定超时时间. YourWebServiceyws=newYourWebService(); yws.Timeout=1200000;//20分钟,单位是毫秒 如果将Timeout属性设置为Timeout.Infinite,则指示该请求无超时.即使XMLWebservices客户端可以将Timeout属性设置为无超时,Web服务器仍可以在服务器端使请求超时. IIS请求超时 在IISManager中,选中Sites,点击右侧的WebsiteDefaults,在Limits属性列表中,设置连接超时时间ConnectionTime-out(seconds).默认值为120秒. 连接超时有助于减少由空闲连接消耗的处理资源损失.启用连接超时时,IIS会在连接级别执行以下类型的连接超时:客户端已向服务器发送了数据,现处于空闲状态造成的连接超时. 已建立了与服务器的连接,但客户端未发送数据时造成的服务器侦听超时.响应超时(基于可配置的最小字节数/秒的值).请求超时,它禁止客户端向服务器发送不合理的慢速请求(例如,1比特/秒). 数据库连接超时 在.NET的SqlConnection类,有ConnectionTimeout属性,获取终止尝试并生成错误之前在尝试建立连接时所等待的时间.等待连接打开所需的时间(以秒为单位).默认值为15秒.在这个时间内,如果连接没有建立,我们将会看到这个错误.值为0表示无限制. 主要通过连接字符串中的ConnectTimeout来进行控制,如下:
数据库查询超时 在.NET的SqlCommand类,有CommandTimeout属性,获取或设置在终止尝试执行命令并生成错误之前的等待时间.等待命令执行所需的时间(以秒为单位).默认值为30秒.如果请求正在运行,并且没有在超时时间内完成,那么我们将看到这个错误.值为0表示无限制. 主要是通过SqlCommand.CommandTimeout来进行控制.如下:
(编辑:ASP站长网) |