我有一台托管我的网站的服务器,该网站的流量几乎为零。
每天有少数人(<20)进入该网站,一些RSS阅读器也订阅了我们发布的一些供稿。
几乎每天晚上,RSS阅读器都会在深夜打到我们,并得到一个异常(exception),该网站由于连接超时而无法连接到SQL Server。
这些细节非常怪异,所以我正在寻找可能的问题方面的帮助,因为我不知道从哪里开始。
我们正在Windows Server 2008上使用ASP.Net MVC,Entity Framework和SQL Server2008。这台机器是我们从一个不完全顶级的提供商处获得的专用设备,因此可能无法进行最佳配置,或者谁知道呢?其他。
盒子也很小,只有1Gb RAM,但它应该承担我们目前的负载...
我要复制下面的完整调用堆栈,但首先,我们要了解一些事情:
更新:我们根据建议连接了探查器,并且花了一段时间才有了新的异常(exception)。这是我们知道的新内容:
简而言之,我对此一无所知。我找不到数百个快速连续运行的查询的原因,但我相信这些查询一定与问题有关。
我也不知道如何诊断连接问题...
或者探查器跟踪可能会丢失一些根据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)
任何想法将不胜感激。
最佳答案
内存不足
这很可能是一个内存问题,可能由于其他原因而加剧或触发,但本质上仍然是内存问题。还有其他两种(可能性较小)的可能性,您应该首先检查并消除(因为这样做很容易):
易于检查的可能性:
为什么看起来像是记忆问题:
如果这些都不显示,则应检查内存问题。我怀疑内存是您的情况的原因,因为:
如何检查记忆作为罪魁祸首:
-处理器\处理器时间百分比[总计]
-PhysicalDisk \%Idle Time [对于每个磁盘]
-PhysicalDisk \ Avg。磁盘队列长度[每个磁盘]
-内存\页面/秒
-内存\页面读取数/秒
-内存\可用兆字节
-网络接口(interface)\总字节数/秒[对于使用中的每个接口(interface)]
-处理\%处理器时间[见下文]
-Process \ Page Faults / sec [请参见下文]
-Process \ Working Set [见下文]
解决方案:
可以将IIS和SQL Server分别放在两个不同的框中(首选),或者在框中增加更多的内存。我认为3-4 GB应该是最小的。
那奇怪的EF东西呢?
这里的问题是,它很可能是外围问题,或者仅是主要问题的起因。请记住,探查器使您90%的事件消失了,所以剩下的问题可能是另一个问题,或者可能只是问题的最严重加剧。由于其行为,我想它可能正在循环其缓存或对应用程序服务器进程进行一些其他后台维护。
关于sql-server-2008 - 帮助解决SqlException:在非负载情况下,连接超时超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1421978/