영업: 1-800-867-1380

Azure SQL 데이터베이스 엔진 제한

업데이트 날짜: 2014년 6월

엔진 제한은 시스템의 전반적인 상태에 부정적인 영향을 미치는 클라이언트의 연결을 차단하여 리소스 사용량을 다시 확장합니다. 구독자의 연결이 차단되는 정도는 삽입 및 업데이트만 차단하는 수준에서 모든 쓰기를 차단하거나 모든 읽기 쓰기를 차단하는 수준까지 가능합니다. 제한이 발생하는 시간 범위를 제한 주기라고 하며, 기본값이 10초로 사용자가 변경할 수 없습니다.

제한 심각도는 다음 두 단계 중 하나로 분류됩니다.

  • 소프트 제한: 이는 첫 번째 단계로, 트랜잭션 로그, I/O, 저장소 등의 컴퓨터 리소스가 미리 정의된 안전성 임계값을 초과하는 경우입니다. SQL 데이터베이스는 대부분의 리소스를 사용하는 데이터베이스의 하위 집합을 선택한 다음 해당 작업을 제한합니다. 즉, 컴퓨터의 모든 데이터베이스에 대해 제한이 수행되는 것이 아니라 리소스를 가장 많이 사용하는 데이터베이스에 대해서만 제한이 수행됩니다. 미리 정의된 임계값 범위 내에서만 리소스를 사용하면 서버의 모든 데이터베이스에서 충분한 리소스를 사용할 수 있습니다.

  • 하드 제한: 이는 두 번째 및 마지막 단계로, 오버로드로 인해 컴퓨터가 치명적인 영향을 받는 경우입니다. 하드 제한에 걸리면 리소스가 해제될 때까지 컴퓨터에서 호스팅되는 데이터베이스에 더 이상 새로운 연결을 만들 수 없습니다. SQL 데이터베이스는 제한을 초과한 리소스를 나타내는 새로운 연결 시도에 대한 오류 메시지를 반환합니다.

다음 표에서는 엔진 제한 메커니즘, 반환되는 해당 오류 코드, 오류 해결을 위한 권장 사항에 대한 정보를 제공합니다.

 

엔진 제한 메커니즘 반환된 오류 코드 권장 사항

엔진 제한은 다음 단계에 따라 부하를 줄이고 시스템 상태를 보호합니다.

  1. 시스템을 정상 상태로 되돌리는 데 필요한 부하 감소량을 결정합니다.

  2. 과도한 리소스를 사용하는 구독자 데이터베이스를 제한 후보로 표시합니다. 약간의 초과로 인해 발생하는 엔진 제한인 경우 특정 데이터베이스가 제한 후보 고려 대상에서 면제될 수 있습니다. 많이 초과되어 발생한 엔진 제한인 경우 현재 제한 주기 직전 제한 주기에 부하가 전혀 걸리지 않은 구독자 데이터베이스를 제외하고 모든 구독자 데이터베이스가 제한 후보가 될 수 있습니다.

  3. 후보 데이터베이스의 이전 리소스 사용 패턴을 확인하여 시스템을 정상 상태로 되돌리기 위해 제한되어야 하는 후보 데이터베이스 수를 계산합니다.

  4. 시스템 부하를 원하는 수준으로 되돌릴 때까지 계산된 개수의 후보 데이터베이스를 제한합니다. 제한이 하드 제한인지 소프트 제한인지 여부에 따라 적용되는 제한의 정도 또는 제한 모드가 다를 수 있습니다. 오류 메시지의 인시던트 ID 및 코드 값을 사용하여 적용되는 제한의 정도 및 모드를 확인할 수 있습니다. 제한된 모든 데이터베이스는 최소 1 제한 주기(10초) 동안은 제한된 상태로 유지되지만, 종종 시스템을 정상 상태로 되돌리기 위해 제한 상태가 여러 제한 주기 동안 유지되기도 합니다.

40501: 서비스가 현재 사용 중입니다. 10초 후 요청을 다시 시도하십시오. 인시던트 ID: <ID>. 코드: <코드>.

note참고
인시던트 ID코드 값은 제한되는 요청의 종류와 소프트 제한 또는 하드 제한 여부를 확인하는 데 사용할 수 있습니다. 자세한 내용은 이 항목의 뒷부분에 나오는 "제한 인시던트 ID" 및 "이유 코드 디코딩" 섹션을 참조하십시오.

백오프하고 10초 후에 다시 요청하십시오.

오류 40501의 제한 인시던트 ID는 제한 인시던트를 고유하게 식별하는 GUID 값입니다.

40501: The service is currently busy. Retry the request after 10 seconds. Incident ID: <ID>. Code: <code>.

제한이 발생한 이유나 제한이 지속되는지 여부를 확인할 수 없는 경우 문제를 해결하는 방법을 모르면 Microsoft 지원에 문의하고 오류 메시지의 인시던트 ID(<ID>)를 알려주십시오. Microsoft 지원에서는 이 인시던트 ID를 사용하여 사용자의 제한 인시던트와 관련된 추가 정보를 검색합니다. 인시던트 ID는 다음 정보를 얻는 데 사용할 수 있습니다.

  • 제한 인시던트의 시작 시간

  • 제한 유형(소프트 제한 및 하드 제한)

  • 제한 인시던트 도달로 인한 리소스 유형(예: CPU)

  • 이 제한 인시던트가 발생했을 때 사용자는 무엇을 실행하고 있었습니까?

Microsoft 고객 지원으로부터 근본 원인을 확인한 후 응용 프로그램에서 적절히 변경할 수 있습니다.

이 섹션에서는 다음 엔진 제한 오류 코드에서 반환되는 이유 코드를 디코딩하는 방법에 대해 설명합니다.

40501: The service is currently busy. Retry the request after 10 seconds. Incident ID: <ID>. Code: <code>.

오류 메시지의 이유 코드(<코드>)는 제한 모드 및 초과된 리소스 유형에 대한 정보가 포함된 10진수입니다.

  • 제한 모드는 거부된 문 형식을 열거합니다.

  • 리소스 유형은 초과된 리소스를 지정합니다. CPU 및 IO와 같은 여러 개의 리소스 유형에서 제한 작업을 동시에 수행할 수 있습니다.

예를 들어, 이유 코드가 131075인 다음 샘플 오류 메시지를 살펴보십시오.

40501: The service is currently busy. Retry the request after 10 seconds. Incident ID: {5DE17AB8-A6E34BE5-A2E95BB5D4CC4155}. Code: 131075.

다음 다이어그램에서는 이유 코드를 디코딩하는 방법을 보여 줍니다.

이유 코드 디코딩

제한 모드를 확인하려면 이유 코드에 모듈로 4를 적용합니다. 모듈로 연산은 한 수를 다른 수로 나눈 나머지를 반환합니다. 제한 유형과 리소스 유형을 확인하려면 1단계에 표시된 대로 이유 코드를 256으로 나눕니다. 그런 다음 2단계와 3단계에 표시된 대로 결과의 몫을 이진 표현으로 변환합니다. 다음 다이어그램에서는 모든 제한 유형과 리소스 유형을 보여 줍니다. 확인된 제한 유형을 다이어그램에 표시된 리소스 유형 비트와 비교하십시오.

다음 표에서는 제한 모드의 목록을 제공합니다.

 

제한 모드 코드 설명 거부된 문 형식 처리 가능한 문

0

제한 없음

없음

모두

1

업데이트/삽입 거부

INSERT, UPDATE, CREATE TABLE | INDEX

DELETE, DROP TABLE | INDEX, TRUNCATE

2

모든 쓰기 거부

INSERT, UPDATE, DELETE, CREATE, DROP

SELECT

3

모두 거부

모두

없음

제한 모드를 확인하려면 이유 코드에 모듈로 4를 적용합니다. 131075 % 4 = 3. 결과 3은 제한 모드가 "모두 거부"임을 의미합니다.

제한 유형 및 리소스 유형을 가져오려면 이유 코드를 256으로 나눕니다. 그런 결과의 몫을 이진 표현으로 변환합니다. 131075/256 = 512(10진수) 및 512(10진수) = 10 00 00 00 00 (이진). 이는 CPU(리소스 유형 4) 및 하드 제한(10)으로 인해 데이터베이스가 제한되었다는 것을 의미합니다.

다음 샘플 코드는 Azure용 Enterprise Library 통합 팩의 임시 오류 처리 응용 프로그램 블록("Topaz"라고도 함)에 있는 ThrottlingCondition 클래스를 사용하여 엔진 제한 오류(40501)의 이유 코드를 디코딩합니다. 임시 오류 처리 응용 프로그램 블록 어셈블리 및 소스 코드를 다운로드하여 ThrottlingCondition 클래스를 사용하려면 Azure용 Enterprise Library 5.0 통합 팩을 참조하십시오.

이 샘플 코드는 엔진 제한 오류(40501)에 제공된 이유 코드를 입력하라는 메시지를 표시한 다음 지정한 이유 코드에 대한 제한 모드, 제한 유형 및 리소스 유형을 표시합니다.

using System;
using Microsoft.Practices.EnterpriseLibrary.TransientFaultHandling.Data;

namespace ThrottlingDecoder
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Enter a throttling code to be decoded: ");
            var rawCode = Console.ReadLine();
            int reasonCode;

            if (Int32.TryParse(rawCode, out reasonCode))
            {
                var throttlingCode = ThrottlingCondition.FromReasonCode(reasonCode);

                Console.WriteLine("\nBreakdown for throttling reason code {0}:\n", reasonCode);

                Console.WriteLine("Throttling mode: {0}", throttlingCode.ThrottlingMode);
                Console.WriteLine("Throttled On CPU: {0}", throttlingCode.IsThrottledOnCpu);
                Console.WriteLine("Throttled On DB Size: {0}", throttlingCode.IsThrottledOnDatabaseSize);
                Console.WriteLine("Throttled On DB Reads: {0}", throttlingCode.IsThrottledOnDataRead);
                Console.WriteLine("Throttled On DB Free space: {0}", throttlingCode.IsThrottledOnDataSpace);
                Console.WriteLine("Throttled On Log Free Size: {0}", throttlingCode.IsThrottledOnLogSpace);
                Console.WriteLine("Throttled On Log Writes: {0}", throttlingCode.IsThrottledOnLogWrite);
                Console.WriteLine("Throttled On Worker Threads: {0}", throttlingCode.IsThrottledOnWorkerThreads);
                
                Console.WriteLine("\nThrottled resources:");

                foreach (var res in throttlingCode.ThrottledResources)
                {
                   if (res.Item2 != ThrottlingType.None) Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Resource type {0} is throttled on {1}", res.Item1, res.Item2);
                    if (res.Item2 != ThrottlingType.None) Console.ResetColor();
                }
            }
            else
            {
                Console.WriteLine("Sorry, but the input you provided does not seem to be a valid number.");
            }
            Console.Read();
        }
    }
}

또는, TechNet Wiki의 Azure SQL 데이터베이스 유연성 및 성능 가이드에서 제공되는 샘플 코드를 사용하여 이유 코드를 디코딩할 수 있습니다. 이 샘플 코드는 임시 오류 처리 응용 프로그램 블록에 대한 종속성이 없습니다.

참고 항목

이 정보가 도움이 되었습니까?
(1500자 남음)
의견을 주셔서 감사합니다.
표시:
© 2014 Microsoft