2013-09-06 2 views
13

나는 최근에 출시 한 화이트 레이블 (동일한 사이트의 여러 버전) 사이트를 가지고 있습니다. 아직 많은 트래픽이 발생하지 않지만 주로 봇이지만 하루에 약 800 명의 사용자가 있습니다. Azure에 호스팅 된 관리 패널 이외에 Azure 데이터베이스가 있습니다. 두 사이트 모두 동일한 Azure 데이터베이스에 연결됩니다. 또한 데이터를 처리하기 위해 실행중인 일부 작업자 역할 - 99 %는 아무것도하지 않지만 정기적으로 확인합니다.Azure SQL 데이터베이스 연결 문제 - 연결이 너무 많습니까?

나는 항상 같은 몇 초가 지난 다음 다시 괜찮아 무작위 오류, 경험이 아침

A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

을하지만, 우리는 더 심각한 문제가 있었다. 이것은 (구글, 바이두, AhrefsBot & Wiseguys.nl)이 사이트 색인을 생성 봇 동안 발생

System.ComponentModel.Win32Exception: An existing connection was forcibly closed by the remote host

:로 시작했다. 나는 이것들에서 하나 이상의 오류가있다. 그렇다면 :

System.Data.SqlClient.SqlException: The service has encountered an error processing your request. Please try again. Error code 40143. A severe error occurred on the current command. The results, if any, should be discarded.

이것은 ExecuteReader 단계에서 발생했습니다.

10 분 후에 실질적인 문제가 발생했습니다. 아무도 관리자 인터페이스에 로그인 할 수 없지만 Azure가 호스팅 한 웹 사이트는 봇이 여전히 오류를 발생 시켰지만 테스트했을 때 괜찮아 보였습니다. 문제는이었다

System.ComponentModel.Win32Exception: The wait operation timed out

이 약 한 시간 동안 임의의 연결 작업과 오프 계속했다. 그럼 난 또 다른 문제 타격이 마지막 시간 동안 ON과 OFF 발생

System.Data.SqlClient.SqlException: Resource ID : 1. The request limit for the database is 180 and has been reached. See ' http://go.microsoft.com/fwlink/?LinkId=267637 ' for assistance.

을 - 주로 작업자 역할. 그때 나는 이러한 요청을 모두 차지 있었는지 알아 시도하고 나는이 명령을 발견 : 나는 그것을 통해 실행되었을 때 그것은 단지 1 개 또는 2 요청을 반환

SELECT * FROM sys.dm_exec_requests

합니다.

내 질문은 다음과 같습니다. 1) 다른 어느 누구도 Azure에서 호스팅되는 서버와의 임시 연결이 비교적 규칙적입니까? 2) 위의 이벤트 목록에 특정 문제가 있습니까? 이것은 많은 관리자가 동시에 로그인 할 때 모두 발생할 수 있습니다. 3) 180 제한 메시지를 받았을 때 데이터베이스에 대한 요청 수를 어떻게 디버그하는 것이 좋습니까?

미리 감사드립니다.

답변

6

나는 몇 년 전에이 질문을 썼고 그 제목에 사소한 변화를 알렸다. Azure SQL 데이터베이스를 더 많이 경험 했으므로 이제이 문제에 대한 해답을 알고 있습니다. 다른 사용자를 위해 데이터베이스가 너무 낮은 계층으로 설정되어 있습니다.

Azure는 성능에 큰 차이가있는 가격 책정 단계를 가지고 있습니다. 이러한 목표를 달성하기 위해 많은 실적 측정 기준을 조정합니다. CPU 전력, 분당 요청 등이 포함됩니다.

즉, 계층을 밀어 올리면 CPU 전력/요청 볼륨이 너무 높아 처리 요청이 대기열에 들어가기 시작합니다. 이로 인해 시간 초과가 발생하고 요청이 처리 대기 중일 때 요청 제한이 커집니다. 결국 데이터베이스가 근본적으로 중단되는 지점에 도달합니다.

내 경험에 비추어 볼 때, S0와 S1 같은 낮은 데이터베이스 레벨은 실제로는 전력 소모가 적기 때문에 개발이나 매우 기본적인 사이트 이외에는 사용해서는 안됩니다.

Azure 포털에는 CPU 그래프, 인덱스 어드바이저 및 쿼리 성능 정보와 같이 데이터베이스에서 발생하는 일을 디버깅 할 수있는 몇 가지 유용한 도구가 있습니다.

0

dm_exec_requests DMV를 보면서 올바른 길을 걷는 것처럼 들립니다. 나는 당신이 벌써 이것을 보았다고 생각한다. 그러나 documented here 인 180의 스로틀 한도에 관한 공정한 조금 더 많은 정보가있다. 그리고 그것에 대한 약간의 주요 이유를 개설한다.

귀하의 질문에 도움이 될 수있는 Cotega이라는 서비스가 있습니다. 첫 번째는 DMV's against your database 키를 모두 실행하여 DB를 분석하는 데 도움이되는 상황을 보여 주며 throttling limits에 가까이 갈 때 (전자 메일, SMS) 알릴 수도 있습니다.

0

A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

System.ComponentModel.Win32Exception: An existing connection was forcibly closed by the remote host

은 모두 무시해도됩니다. 연결이 외부에서 중단 될 때마다 발생합니다. 사용자가 응답을 받으면 브라우저를 닫거나 다른 네트워크 문제로 인해 연결이 끊어 질 때 발생할 수 있습니다. 해당 조건이 감지 될 때 다른 프레임 워크 코드가 활성화되어 있기 때문에 다른 유사한 예외가있을 수 있습니다. 이러한 예외는 발신자가 더 이상 수신 대기하지 않기 때문에 요청 처리를 중지하기 위해 발생합니다.

활성 요청 수를 추적하려면 모든 SQL 연결에 사용하는 래퍼를 만들고 연결이 사용 중일 때 인터 로크 된 증분 및 감소 (IDisposable 사용)를 수행하고 그 값에 대한 최고 수위 표시. 특별한 숨겨진 또는 관리 페이지에서이를보고 할 수 있습니다. 이렇게하면 문제가 발생했을 때 시스템에 연결할 수없는 경우에도 가장 많은 수의 활성 연결이 문제가 아닌지 확인할 수 있습니다. 이것은 또한 모든 연결을 처분하지 않는지 발견하는 데 도움이 될 수 있습니다.

관련 문제