帮助排除故障SQLEXCEPTION:超时过期的连接,在无负荷情况(Help troubleshoo

2019-07-18 00:31发布

我有我的主机有几乎零流量的网站的服务器。
有几个人(<20),每天进入该网站,以及一些RSS阅读器订阅我们提出了一些饲料。

几乎每天晚上,一个RSS阅读器将达到我们在半夜,并得到一个例外,该网站无法连接到SQL Server,因为在连接超时。 细节是非常奇怪的,所以我在寻找的可能是什么问题一些帮助,因为我不知道从哪里开始寻找了。

我们使用ASP.Net MVC,实体框架,和SQL Server 2008在Windows Server 2008的本机是一种专用的盒子,我们从一个不完全的顶级供应商获得,这样的事情可能配置不很理想,或者谁知道其他。
这个盒子也非常小,并且只有1GB内存,但它应该采取的那种,我们有负荷的现在...

我复制了充分调用堆栈下面,但首先,一些我们知道的事情:

  • 错误时,iTunes是查询我们的网站总是会发生的。 我相信这应该有无关什么,但事实是,我们只从iTunes得到它。 我最好的猜测是,这是因为只有在iTunes中时,没有人被击中我们夜间的那个时候我们查询。
  • 我们的一个理论是,SQL Server和IIS正在争取的内存,其中一人是越来越分页到磁盘出不使用时,当有人“唤醒它”,它读取一切从磁盘恢复时间太长到内存中。 这是有可能发生的潜在? (我是那种抛弃这一点,因为它听起来像一个设计问题在SQL Server如果有可能)
  • 我也想过,我们正在泄漏的连接,因为我们可能无法适当地配置EF实体(可能在这里看到我的问题 )。 这是我可以通过谷歌搜索的问题找到的唯一的事情。 我放弃这给我们有非常低的负荷。
  • 这总是发生在夜间,所以它的相关的事实都没有发生了,而很可能的东西。 例如,我敢肯定的是,当这些请求命中,Web服务器进程得到了回收,它的启动/重新JITting一切。 重新JITting不解释SQL超时,虽然。

更新:我们连接探查的建议,并花了相当长一段时间,我们有一个新的异常之前。 这是我们所知道的新东西:

  • 具有极大连接探查减小的,我们得到了错误的数量。 事实上,在获得正常每天几个,我们不得不等待3或4天,这一次发生。 一旦我们停止剖析,这又回到了正常的错误频率(或更糟)。 因此,剖析了隐藏这个问题在一定程度上,但并不完全一定的影响。
  • 纵观探查器跟踪旁边的请求日志IIS,有请求和查询之间的预期的一一对应关系。 然而,每一个现在,然后,我看到正在执行的查询很多不具有correllation与IIS日志的。 事实上,被记录的实际错误权利之前,我在一段3分钟 ,所有这些都是完全无关的IIS日志得到了750个查询 。 查询文本看看什么样的不可读的废话是EF产生,他们并不都是一样的,他们都看起来就像从网站来查询:相同的应用程序名称,用户等方面给予的想法有多可笑这个是,该网站得到了打DB约370 IIS的要求,在2天的过程
  • 这些无法解释的疑问并非来自同一ClientProcessID与以前那些网站,虽然他们可能仍然有来自网站,如果该进程得到了在此期间回收。 有上一次的无活动将近一个小时解释查询,第一个原因不明。
  • 其中一个长的查询扫尾我不知道他们来自哪里传来的权利我被记录的错误之前,所以我相信这是我们应该遵循的线索。
  • 如我所料最初,当被执行抛出错误的查询,它来自一个不同的ClientProcessID比前一个,(8分钟后比前不明原因之一,而且几乎整整一个小时比以前IIS一个更高版本)。 这意味着,对我来说,工作进程确实得到了循环利用。
  • 这事我绝对不明白。 在IIS日志显示错误的请求前一分钟,4人担任完美,但对于那些查询不跟踪显示在所有。 事实上,在这4个是顺利,我有4个例外接二连三抛出,那些4还没有在跟踪中显示出来(这是有道理的,因为如果在连接超时的查询应该从来没有得到执行,但我没有看到连接在跟踪尝试要么)

因此,简而言之,我完全一无所知这一点。 我无法找到那些几百个查询,它们会在快速连续运行的原因,但我相信那一定有事情做的问题。
我也不知道如何诊断连接问题...
要不怎么事件探查器跟踪可能会丢失一些查询,根据IIS经过精细去...

有任何想法吗?


这是异常信息:

System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

System.Data.EntityException: The underlying provider failed on Open. ---> System.Data.SqlClient.SqlException: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
   at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
   at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   at System.Data.SqlClient.SqlConnection.Open()
   at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)
   at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)
   --- End of inner exception stack trace ---
   at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)
   at System.Data.EntityClient.EntityConnection.Open()
   at System.Data.Objects.ObjectContext.EnsureConnection()
   at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
   at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
   at System.Data.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__1[TResult](IEnumerable`1 sequence)
   at System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable`1 query, Expression queryRoot)
   at System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[S](Expression expression)
   at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source)
   at MyProject.Controllers.SitesController.Feed(Int32 id) in C:\...\Controller.cs:line 38
   at lambda_method(ExecutionScope , ControllerBase , Object[] )
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
   at System.Web.Mvc.Controller.ExecuteCore()
   at System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

任何想法将极大的赞赏。

Answer 1:

内存不足

这很可能是内存的问题,或许加重或其他事情触发,但本质上仍然是内存的问题。 有两个其他(不太可能)的可能性,你应该检查并排除第一(因为它很容易这样做):

易查的可能性:

  1. 你可能有“自动关闭”激活:自动关闭可以拥有的正是这种行为,但它是罕见的为它打开。 要进行检查,在SSMS您的应用程序的数据库上单击右键,选择“属性”,然后选择“选项”窗格。 看看“自动关闭”项,并确保它被设置为False。 检查tempdb中也。

  2. SQL代理作业可能是导致它:检查代理的历史记录,看看是否有任何作业的事件过程中始终运行。 记住要检查维修工作也象外之象重建索引,而他们正在运行常常被视为性能问题。 这是不可能的人选,现在,只是因为他们通常不会被探查的影响。

为什么它看起来像一个内存问题:

如果那些不显示任何东西,那么你应该检查内存问题。 我怀疑记忆在你的情况,因为原因:

  • 你有内存1 GB:虽然这在技术上是最小的SQL服务器上面,它低于推荐的SQL Server的方式,并且远低于在我的经验是什么生产可以接受的,即使是轻负荷的服务器。

  • 您在同一机器上运行IIS和SQL Server:这是不建议本身,因为在争夺内存导致的很大一部分,但只有1 GB内存,它导致IIS,应用程序,SQL Server中,操作系统和任何其他任务和/或维护的所有战斗很少的内存。 在Windows管理这一问题的方法是通过积极从非活动进程采取它拿走给内存的活动进程。 它可以采取许多秒,甚至分钟为一个大的工艺如SQL Server,以获得足够的回内存,以便能够完全服务于这个情况的请求。

  • 探查取得90%的问题消失:这是一个很大的线索,内存是有可能的问题,因为通常情况下,之类的东西探查对这一特定问题的正是这种效果:探查任务,保持了SQL Server的只是一点点的所有活动的时间。 通常情况下,这只是足够的活动要么保持它关闭操作系统的“清道夫”的名单,或者至少减少它的影响力一些。

如何检查内存的罪魁祸首:

  1. 关闭探查器:它具有对问题海森堡的效果,所以你必须把它关掉,否则您将无法可靠地看待这个问题。

  2. 从另一个盒子运行系统监视器(Perfmon.exe),即远程连接到perfomrance收集服务在您的SQL Server和IIS正在运行的箱。 你可以很容易地通过先删除三个默认的统计(它们只本地)做到这一点,然后在需要的统计(下同)增加,但要确保在第一个下拉更改计算机名连接到您的SQL框。

  3. 通过性能监视器创建“计数器日志”发送收集到的数据文件。 如果你不熟悉这一点,那么最容易做的事情可能是数据收集到你可以用Excel中打开来分析一个选项卡或逗号分隔的文件。

  4. 设置您的perfmon收集到一个文件,并添加以下计数器它:

    - 处理器\%处理器时间[总]

    -物理磁盘\%空闲时间[ 每个磁盘 ]

    - 物理磁盘\魅力。 磁盘队列长度[ 每个磁盘 ]

    - 内存\页/秒

    - 内存\页读取/秒

    - 内存\可用兆字节

    -网络接口\总字节数/秒[ 用于在使用中每个接口 ]

    -过程\%处理器时间[ 参见下文 ]

    -过程\页错误/秒[ 参见下文 ]

    -过程\工作集[ 参见下文 ]

  5. 对于过程的计数器(以上)要包括sqlserver.exe过程中,任何IIS进程,任何稳定的应用进程。 请注意,这将只为“稳定”的过程工作。 正在不断地重新创建需要过程,因为没有办法存在,才指定它们不能被捕捉这种方式。

  6. 在这个问题最频繁发生的时候运行这个收集到一个文件中。 设置收集时间间隔的东西接近10-15秒。 (此收集了大量的数据,但您将需要这项决议挑选出独立的事件)。

  7. 之后,你有一个或多个事件,停止收集,然后打开用Excel您colleced数据文件。 你可能将不得不重新格式化时间戳列是有益的可见光和显示时分秒。 用你的IIS日志,找到事故的确切时间,然后看看perfmon的数据看事件发生之前和之后发生了什么事情。 特别是要看看它的工作集小前和很大后,有很多网页之间断层英寸 这就是这个问题的最明显标志。

解决方案:

任一单独的IIS和SQL Server到两个不同的盒子(优选)或者添加更多的内存的框。 我认为3-4 GB应该是最小的。

那么,那些奇怪的EF东西?

这里的问题是,它是最有可能的任何外设或只分担你的主要问题。 请记住,探查取得90%的事件中去了,所以剩下, 可能是一个不同的问题,也可能是只是问题的最极端的aggravator。 由于其行为我猜想,这要么骑自行车的缓存或有应用程序服务器进程的一些其他的后台维护。



Answer 2:

我会比较你的夜间备份的执行时间超时的时间戳。 如果两者相符,你可以设置你的RSS源是静态的那段时间。

另一件事尝试(即使它不完全是一个答案)是立即运行sp_who的 ,当你得到一个超时异常。 它没有捕捉一切(有问题的进程可以通过运行这个时间来完成),但你可能会得到幸运。

当你回家的夜晚,如果你再看到错误通过活动,第二天早上步骤你也可以启动SQL事件探查器。 只要确保不从服务器本身运行它(我敢肯定,它提醒你的这一点,开始时)。

编辑:您的地址更新。

是EF更新/创建其缓存? 它可以在同一时间解释查询的丰度和为什么没有查询过的数据库后命中。

除此之外,看来你有一个heisenbug。 我能想到为你添加的唯一的事是一个很大的记录(文件或事件日志)。



Answer 3:

它的气味运行在同一时间cronned事情。 作为RBarryYoung说..一些夜间备份,也可能是别的东西你有服务器的root访问权限? 你能看到的crontab?

难道是在运行其接近你所遇到的问题的时候重新索引程序的SQL服务器的顶部部分全文索引插件?



Answer 4:

就我而言,当我安装SQLSERVER 2008 R2 SP3中,问题消失。

服务器:Windows 7 + SqlServer的2008 R2(开发版)客户端:树莓派3B +,Asp.net +酷睿核心EF



文章来源: Help troubleshooting SqlException: Timeout expired on connection, in a non-load situation