문제 해결 SQLEXCEPTION 문제 해결 : 비로드 상황에서 연결에서 시간 초과가 만료되었습니다.

StackOverflow https://stackoverflow.com/questions/1421978

문제

나는 거의 트래픽이없는 나의 웹 사이트를 호스팅하는 서버를 가지고 있습니다.
소수의 사람들 (<20)이 매일 사이트에 들어가고 몇몇 RSS 리더는 우리가 내놓은 일부 피드에 가입합니다.

거의 매일 밤, RSS 리더는 한밤중에 우리를 때리고 웹 사이트가 연결 시간 초과로 인해 SQL 서버에 연결할 수 없다는 예외를 얻을 것입니다. 세부 사항은 매우 이상합니다. 그래서 나는 더 이상 어디에서 찾아야할지 모르기 때문에 문제가 될 수있는 것에 대한 도움을 찾고 있습니다.

우리는 Windows Server 2008을 통해 ASP.NET MVC, Entity Framework 및 SQL Server 2008을 사용하고 있습니다.이 기계는 정확히 최상위 계층 제공 업체로부터 얻은 전용 상자이므로 상황이 최적으로 구성되지 않거나 무엇을 알고 있는지 아는 사람이 있습니다. 또 다른.
상자는 또한 꽤 작고 1GB RAM이 있지만 지금은 우리가 가지고있는 부하를 가져 가야합니다 ...

아래에서 전체 통화 스택을 복사하고 있지만 먼저 우리가 아는 것 중 일부는 다음과 같습니다.

  • iTunes가 사이트를 쿼리 할 때 항상 오류가 발생합니다. 나는 이것이 아무 관련이 없어야한다고 믿지만, 진실은 우리가 iTunes에서만 그것을 얻는다는 것입니다. 내 가장 좋은 추측은 다른 사람이 우리를 때리지 않을 밤에 아이튠즈 만 우리를 쿼리하기 때문에 이런 일이 발생한다는 것입니다.
  • 우리의 이론 중 하나는 SQL Server와 II가 메모리를 위해 싸우고 있으며 그 중 하나는 사용되지 않아 디스크를 구분하고 누군가 "깨어날 때"디스크를 다시 읽는 데 너무 오래 걸리는 것입니다. 메모리로. 이것이 잠재적으로 일어날 수있는 일입니까? (가능하다면 SQL Server에서 설계 문제처럼 들리기 때문에 이것을 버리고 있습니다)
  • 또한 EF 엔티티를 적절하게 처분하지 않을 수 있기 때문에 연결을 유출 할 가능성에 대해서도 생각했습니다.여기 내 질문을 참조하십시오). 이것이 문제를 인터넷 검색하여 찾을 수있는 유일한 것입니다. 나는 우리가 가지고있는 매우 낮은 부하를 감안할 때 이것을 버리고 있습니다.
  • 이것은 항상 밤에 발생하기 때문에 한동안 아무 일도 일어나지 않았다는 사실과 관련이있을 것입니다. 예를 들어, 이러한 요청이 발생하면 웹 서버 프로세스가 재활용되고 모든 것을 시작 / 재 조정하고 있다고 확신합니다. 그러나 재 조정은 SQL 타임 아웃을 설명하지 않습니다.

업데이트: 우리는 제안 된대로 프로파일 러를 첨부했으며 새로운 예외가 있기까지 시간이 걸렸습니다. 이것은 우리가 아는 새로운 것들입니다.

  • 프로파일 러가 부착되어 있습니다 엄청나게 우리가 얻은 오류 수를 줄였습니다. 실제로, 일반적으로 하루에 몇 번을받은 후에, 우리는이 일이 한 번 발생하기 위해 3 일 또는 4 일을 기다려야했습니다. 프로파일 러를 중단하면 정상 오차 빈도로 돌아갔습니다 (또는 심지어 악화). 프로파일 러가 있습니다 약간 이 문제를 어느 정도 숨기는 효과는 완전히 없지만 완전히는 아닙니다.
  • IIS 요청 로그 옆에있는 프로파일 러 추적을 살펴보면 요청과 쿼리 사이에 예상 1-1의 서신이 있습니다. 그러나 때때로, 나는 IIS 로그와 전혀 상관 관계가없는 많은 쿼리가 실행되는 것을 볼 수 있습니다. 사실, 실제 버그가 기록되기 직전에 3 분 안에 750 쿼리, 모두 IIS 로그와 완전히 관련이 없습니다. 쿼리 텍스트는 EF가 생성하는 읽을 수없는 쓰레기의 종류처럼 보이며 모두 동일하지 않으며 웹 사이트에서 나오는 쿼리처럼 보입니다 : 동일한 ApplicationName, User 등 이 사이트는이 과정에서 DB에 도달 한 약 370 개의 IIS 요청을 받았습니다. 2 일
  • 이 설명 할 수없는 쿼리는 이전 웹 사이트와 동일한 클라이언트 프로세서드에서 나오지 않았지만 그 동안 프로세스가 재활용 된 경우 웹 사이트에서 나왔을 수도 있습니다. 마지막 설명 된 쿼리와 첫 번째 설명 할 수없는 쿼리 사이에는 거의 한 시간의 활동이 없었습니다.
  • 그들이 어디에서 왔는지 모르는이 긴 쿼리 중 하나는 내가 로그인 한 오류 직전에 왔기 때문에 이것이 우리가 따라야 할 단서라고 생각합니다.
  • 원래 예상했듯이, 오류를 던진 쿼리가 실행되었을 때, 그것은 이전의 것과 다른 클라이언트 프로세스에서 나왔습니다 (이전에 설명 할 수없는 것보다 8 분 후, 이전 IIS보다 거의 정확히 1 시간 늦게). 이것은 나에게 근로자 과정이 실제로 재활용되었다는 것을 의미합니다.
  • 이것은 내가 절대 이해하지 못하는 것입니다. IIS 로그는 오류 요청 1 분 전에 4 개가 완벽하게 제공되었음을 보여줍니다. 사실, 잘 지낸 4 개의 예외가 발생한 후, 나는 4 개의 예외를 빠르게 발전 시켰습니다. 그 4는 흔적에 나타나지 않습니다 (쿼리가 실행되지 않았기 때문에 시간이 없어서 의미가 있습니다. 그러나 나는 추적의 연결 시도도 보이지 않는다)

요컨대, 나는 이것에 대해 완전히 단서가 없습니다. 나는 그 수백 개의 쿼리가 빠르게 연속적으로 실행되는 이유를 찾을 수 없지만 문제와 관련된 것이 있어야한다고 생각합니다.
또한 연결 문제를 진단하는 방법을 모르겠습니다 ...
또는 Profiler 추적이 어떻게 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)

모든 아이디어는 엄청나게 감사 할 것입니다.

도움이 되었습니까?

해결책

메모리가 충분하지 않습니다

이것은 아마도 기억 문제 일 가능성이 높으며 아마도 다른 것들에 의해 악화되거나 유발 될 수 있지만 여전히 본질적으로 메모리 문제입니다. 먼저 확인하고 제거해야 할 두 가지 (가능성이 적은) 가능성이 있습니다 (그렇게하기 쉽기 때문에).

가능성을 쉽게 확인할 수 있습니다.

  1. "자동 클로즈"가 가능할 수 있습니다. 자동 클로즈는 정확히이 동작을 가질 수 있지만 켜지는 경우는 드 rare니다. 이를 확인하려면 SSMS에서 응용 프로그램 데이터베이스를 마우스 오른쪽 버튼으로 클릭 한 다음 "Properties"를 선택한 다음 "옵션"창을 선택하십시오. "자동 닫기"항목을보고 거짓으로 설정되어 있는지 확인하십시오. tempdb도 확인하십시오.

  2. SQL 에이전트 작업으로 인해 발생할 수 있습니다. 이벤트 중에 일관되게 운영되는 작업이 있는지 확인하려면 에이전트의 기록 로그를 확인하십시오. 재건축 인덱스와 같은 것은 실행 중에 성능 문제로 자주 인용되므로 유지 보수 작업도 확인해야합니다. 이들은 현재 후보자가 될 가능성이 거의 없으며, 일반적으로 프로파일 러의 영향을받지 않기 때문입니다.

메모리 문제처럼 보이는 이유 :

그것들이 아무것도 표시되지 않으면 메모리 문제를 확인해야합니다. 나는 당신의 경우 당신의 경우 원인으로 기억을 의심합니다.

  • 당신은 1GB의 메모리를 가지고 있지만 : 이것은 기술적으로 SQL Server의 최소값보다 높지만 SQL Server에 권장되는 것보다 낮으며 가볍게로드 된 서버의 경우 심지어 내 경험에 허용되는 것보다 낮습니다.

  • 동일한 상자에서 IIS 및 SQL Server를 실행하고 있습니다. 이는 메모리에 대한 경합으로 인해 자체적으로 권장되지 않지만 1GB의 메모리 만 있으면 IIS, 앱, SQL 서버, OS 및 기타 작업 및/또는 유지 보수는 모두 기억이 거의 없기 위해 싸우고 있습니다. Windows가이를 관리하는 방식은 비활성 프로세스에서 적극적으로 빼앗아 활성 프로세스에 메모리를 제공하는 것입니다. SQL Server와 같은 대규모 프로세스 가이 상황에서 요청을 완전히 서비스 할 수 있도록 충분한 메모리를 되 찾을 수 있도록 몇 초, 또는 몇 분이 걸릴 수 있습니다.

  • Profiler는 문제의 90%가 사라졌습니다. 이것은 메모리가 문제 일 가능성이 높다는 큰 단서입니다. 일반적으로 프로파일 러와 같은 것은이 특정 문제에 정확히이 영향을 미치기 때문입니다. 프로파일 러 작업은 SQL Server를 유지합니다. 작은 항상 조금 활성화됩니다. 종종 이것은 OS의 "Scavenger"목록에서 벗어나거나 적어도 영향을 줄 수있는 충분한 활동입니다.

범인으로서 메모리를 확인하는 방법 :

  1. 프로파일 러를 끄십시오 : 문제에 대한 Heisenberg 효과가 있으므로 문제를 끄십시오. 그렇지 않으면 문제를 안정적으로 볼 수 없습니다.

  2. SQL Server 및 IIS가 실행중인 상자의 Perfomrance Collection 서비스에 원격으로 연결되는 다른 상자에서 System Monitor (Perfmon.exe)를 실행하십시오. 먼저 세 가지 기본 통계를 제거하여 가장 쉽게 수행 할 수 있습니다 (로컬에만 해당) 한 다음 필요한 통계 (아래)를 추가 할 수 있지만 첫 번째 드롭 다운에서 컴퓨터 이름을 변경하여 SQL에 연결하십시오. 상자.

  3. Perfmon에서 "카운터 로그"를 만들어 수집 된 데이터를 파일로 보냅니다. 당신이 이것에 익숙하지 않다면, 가장 쉬운 일은 아마도 데이터를 탭 또는 쉼표로 분리 된 파일로 수집하여 분석 할 수있는 것입니다.

  4. Perfmon을 설정하여 파일로 수집하고 다음 카운터를 추가하십시오.

    - 프로세서 %프로세서 시간 [총

    - 물리 디스크 % 유휴 시간 [각 디스크에 대해]

    - 물리 디스크 avg. 디스크 큐 길이 [각 디스크에 대해]

    - 메모리 페이지/초

    - 메모리 페이지 읽기/초

    - 메모리 사용 가능한 mbytes

    - 네트워크 인터페이스 bytes total/sec [사용중인 각 인터페이스에 대해]

    - 프로세스 % 프로세서 시간 [아래를 참조하십시오]

    - 프로세스 페이지 결함/초 [아래를 참조하십시오]

    - 프로세스 작업 세트 [아래를 참조하십시오]

  5. 프로세스 카운터 (위)의 경우 sqlserver.exe 프로세스, 모든 IIS 프로세스 및 안정적인 응용 프로그램 프로세스를 포함하려고합니다. 이것은 "안정적인"프로세스에만 적용됩니다. 필요에 따라 지속적으로 재창조되는 프로세스는 존재하기 전에 지정할 방법이 없기 때문에 이러한 방식으로 캡처 할 수 없습니다.

  6. 문제가 가장 자주 발생하는 시간 동안이 컬렉션을 파일로 실행하십시오. 수집 간격을 10-15 초에 가까운 것으로 설정하십시오. (이것은 많은 데이터를 수집하지만 별도의 이벤트를 선택하려면이 해상도가 필요합니다).

  7. 하나 이상의 사고가 발생한 후에는 수집을 중지 한 다음 Excel로 모집단 데이터 파일을여십시오. 유용하게 보이도록 타임 스탬프 칼럼을 개조하고 몇 분, 초를 보여 주어야 할 것입니다. IIS 로그를 사용하여 사건의 정확한 시간을 찾은 다음 Perfmon 데이터를보고 사건 전후에 무슨 일이 있었는지 확인하십시오. 특히 작업 세트가 이전에 작고 그 이후에 컸는 지 확인하고 싶습니다. 이것이이 문제의 가장 분명한 징후입니다.

솔루션 :

IIS와 SQL 서버를 서로 다른 상자에 별도로 별도로 사용하거나 (선호) 또는 상자에 메모리를 더 추가합니다. 3-4GB가 최소값이어야한다고 생각합니다.

그 이상한 EF는 어떻습니까?

여기서 문제는 주변 장치이거나 주요 문제에만 기여할 가능성이 높다는 것입니다. Profiler는 사건의 90%가 사라 졌기 때문에 남아있는 것입니다. 5월 다른 문제이거나 가장 극단 일 수도 있습니다. Aggravator 문제의. 동작으로 인해 캐시를 순환하거나 응용 프로그램 서버 프로세스의 다른 배경 유지 관리가 있다고 생각합니다.

다른 팁

타임 아웃의 타임 스탬프를 야간 백업의 실행 시간과 비교합니다. 그들이 일치하면, 당신은 그 시간 동안 RSS 피드를 정적으로 설정할 수 있습니다.

시도해야 할 또 다른 것은 (정확히 답이 아니더라도) 즉시 실행하는 것입니다. SP_WHO 타임 아웃 예외를 얻을 때. 그것은 모든 것을 잡을 수는 없지만 (이를 실행할 때까지 불쾌한 과정이 이루어질 수 있음) 운이 좋을 수도 있습니다.

당신은 또한 당신이 밤을 위해 집으로 향할 때 SQL 프로파일 러를 발사하고 다음 날 아침에 오류가 다시 나타나면 활동을 진행할 수 있습니다. 서버 자체에서 실행하지 마십시오 (시작될 때이 사실을 상기시켜줍니다).

편집하다: 업데이트 해결.

EF가 캐시 업데이트/생성입니까? 한 번에 풍부한 쿼리를 설명 할 수 있으며 나중에 데이터베이스에 도달하지 않은 쿼리가없는 이유를 설명 할 수 있습니다.

그 외에는 Heisenbug가있는 것 같습니다. 내가 추가 할 수있는 유일한 것은 더 많은 로깅 (파일 또는 이벤트 로그)입니다.

그것은 동시에 달리는 크로네드 한 냄새가납니다. RBARRYYOUNG가 말한 것처럼 .. 야간 백업이거나 다른 것이 될 수 있습니까? 서버에 대한 루트 액세스가 있습니까? Crontabs를 볼 수 있습니까?

SQL 서버 위에 전체 텍스트 인덱싱 플러그인이 문제를 경험하는 시간에 가까운 순서 절차를 실행할 수 있습니까?

제 경우에는 SQLSERVER 2008 R2 SP3을 설치하면 문제가 사라집니다.

서버 : Windows 7+SQLServer 2008 R2 (Developer Edition) 클라이언트 : RaspberryPi 3B+, ASP.NET Core+EF Core

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top