场景:在网站中定义一个类实现IHttpHandler接口,在ProcessRequest方法中根据context的请求参数不同执行相应的方法。执行开始前Stopwatch.start(),执行结束后stopwatch.stop(),然后将ExecuteTime用log4net记录到文件日志中。
现象:外部调用者经常会反映我们的接口响应超时,通过排查网站IIS日志发现部分记录的time-taken大于10s以上,sc-status状态码都是200,sc-win32-status则出现了64、1236、121等状态码(正常的响应码是0)。然后检查了log4net中对应时段日志记录,发现ExecuteTime比较稳定,基本保持在5-200ms之间,极少的情况会出现1-2s。两个日志的耗时差距非常大!
问题:
1、IIS中time-taken的值是怎么得出的?
2、能否根据现象的描述排除掉是我们程序本身的性能问题?
3、如果是网络这块的问题,应该如何排查?
奉上所有园豆,求大神
//
// MessageId: ERROR_NETNAME_DELETED
//
// MessageText:
//
// The specified network name is no longer available.
//
#define ERROR_NETNAME_DELETED 64L
//
// MessageId: ERROR_SEM_TIMEOUT
//
// MessageText:
//
// The semaphore timeout period has expired.
//
#define ERROR_SEM_TIMEOUT 121L
//
// MessageId: ERROR_CONNECTION_ABORTED
//
// MessageText:
//
// The network connection was aborted by the local system.
//
#define ERROR_CONNECTION_ABORTED 1236L
1. IIS中time-taken的值从服务端收到请求的第一个字节开始起,直到把所有响应内容发送出去为止. 就这段时间。
2. 你可以用time-taken倒序, 看哪些最大, 然后再去分析是什么情况。
3. 结合第2点,但网络排查不尽, 讲究高性能, 你就得多架服务器, 负载均衡, 烧钱烧钱等等等等等等等等等等等等等等
1. 在代码里面,把未关闭的连接关闭
2. 扩大共享池,方法如下:
解决方法可以是修改连接池的连接生存期,因为默认值是60秒,即连接从应用程序被释放后可以在池中保存的时间。
具体操作步骤如下:
如果是ODBC的话,则可以在ODBC Data Source Administrator中手动更改,该程序位于“Start”菜单中的“Programs”->"Adminstrative Tools"(中文名:管理工具)下,或从"Control Panel"(中文名:控制面板)中打开“ODBC Data Source Administrator”(ODBC数据源管理器),再选择“Connection Pooling”(连接池)选项卡,双击驱动程序中的“SQL Server”,选择“Pool Connetions to this drive”(使用池连接该驱动程序),把下面的时间60秒改的大一点,例如120。
如果是SqlConnection的共享连接,则为ConnectionString属性Connection Lifetime数值名称指定一个值,该值默认情况下是0,表示连接永远不会从池中被自动移走。如果指定一个不同的值,那么一旦连接被返回到池中,该值将和连接的创建时间及当前时间进行比较。如果生存期超过了Connection Lifetime的值,那么连接将从池中被移走。
从大到小排查吧。
先看看调用者到你服务器的网络是不是有问题。
程序和数据库分别进行排查。看是否有那块出现问题了。