导出 (0) 打印
全部展开

Azure SQL Database 引擎限制

更新时间: 2013年8月

注:本页面内容可能不完全适用中国大陆地区运营的 Windows Azure服务。如要了解不同地区 Windows Azure 服务的差异, 请参考本网站.

引擎限制通过阻止对系统整体健康有负面影响的客户端连接,来缩减资源用量。阻止订阅者连接的程度不同,从只阻止插入和更新、阻止所有写入到阻止所有读取和写入都有可能。引擎限制发生的时间范围称为“限制周期”,其默认值为 10 秒,且用户不能更改。

本主题内容

引擎限制的阶段

限制严重程度分为以下两个阶段:

  • 软限制:这是第一个阶段,此时事务日志、I/O 和存储空间等计算机资源超过了预定义的安全阈值。SQL Database 选择一小组耗用资源最多的数据库,然后限制它们的活动。并非计算机上的所有数据库都将受到限制,只是限制占用最多资源的数据库。如果使用率低于预先定义的阈值,则表明有足够的资源供服务器上的所有数据库使用。

  • 硬限制:这是第二个也是最后一个阶段,此时计算机因为过载受到了严重影响。在硬限制阶段,在释放资源前不允许再与计算机承载的数据库建立其他新连接。SQL Database 会为新的连接尝试返回错误消息,指示资源已经过度使用。

引擎限制的工作方式

下表提供有关引擎限制机制、返回的相应错误代码和建议的解决方法的信息。

 

引擎限制机制 返回的错误代码 建议

引擎限制按照以下步骤减少负载和保护系统的健康:

  1. 确定要使系统回到健康状态需要减少的负载。

  2. 将消耗过多资源的订阅者数据库标记为限制候选数据库。如果引擎限制由于某种轻微的超载而发生,则某些数据库可能不会被列为限制候选数据库。如果引擎限制由于某种严重的超载而发生,则所有订阅者数据库都会成为限制候选数据库,但在当前限制周期之前的那个限制周期内未收到任何负载的订阅者数据库除外。

  3. 通过评估候选数据库的历史资源使用模式,计算应当限制多少候选数据库才能使系统回到健康状态。

  4. 限制计算出的候选数据库数目,直到系统负载返回期望水平。根据限制是“硬限制”还是“软限制”,应用的限制程度或限制模式可能有所不同。你可以通过使用错误消息中的事件 ID 和代码值,确定所应用限制的程度和模式。受到限制的任何数据库会持续限制状态至少一个限制周期(10 秒)的时间,但是限制可能常常会持续多个限制周期,才能让系统回到健康状态。

40501: 服务当前正忙。请在 10 秒钟后重试请求。事件 ID:<ID>。代码:<代码>。

note注意
“事件 ID”和“代码”值可用于确定限制了哪些请求以及限制是软限制还是硬限制。有关详细信息,请参阅本主题后面的“限制事件 ID”和“对原因代码解码“部分。

后退并在 10 秒后重试请求。

限制事件 ID

错误 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>.

错误消息中的原因代码 (<code>) 是一个十进制数字,其中包含有关“限制模式”和超限的“资源类型”的信息:

  • “限制模式”将枚举拒绝的语句类型。

  • “资源类型”指定超出限制的资源。限制可在多个资源类型(例如 CPU 和 IO)上并行发生。

以以下示例错误消息为例,其中的原因代码为 131075:

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

下图演示如何对原因代码进行解码。

对原因代码解码

若要获取限制模式,请向原因代码应用模数 4。该取模运算返回两数相除后的余数。若要获取限制类型和资源类型,请将原因代码除以 256,如步骤 1 中所示。然后,将所得的商转换为其二进制等价值,如步骤 2 和 3 中所示。该图列出了所有限制类型和资源类型。将你的限制类型与资源类型位进行比较,如图中所示。

下表提供限制模式的列表。

 

限制模式代码 说明 拒绝的语句类型 仍然可以处理的语句

0

无限制

全部

1

拒绝更新/插入

INSERT、UPDATE、CREATE TABLE | INDEX

DELETE、DROP TABLE | INDEX、TRUNCATE

2

拒绝所有写入

INSERT、UPDATE、DELETE、CREATE、DROP

SELECT

3

全部拒绝

全部

若要获取限制模式,请向原因代码应用模数 4131075 % 4 = 3。结果 3 表示限制模式为“全部拒绝”。

若要获取限制类型和资源类型,请把原因代码除以 256。然后,将所得的商转换为其二进制等价值。131075 / 256 = 512(十进制),512(十进制)= 10 00 00 00 00(二进制)。这意味着由于 CPU(资源类型 4)和硬限制 (10) 对数据库进行限制。

对原因代码解码的示例代码

以下示例代码使用 Enterprise Library Integration Pack for Azure 中的暂时性故障处理应用程序块中的 ThrottlingCondition 类,来解码引擎限制错误 (40501) 中的原因代码。要下载暂时性故障处理应用程序块程序集和源代码以使用 ThrottlingCondition 类,请参阅 Enterprise Library 5.0 Integration Pack for Azure

此示例代码会提示你输入在引擎限制错误 (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 Database 弹性和性能指南中提供的示例代码,来对原因代码解码。此示例代码对暂时性故障处理应用程序块没有依赖性。

另请参见

社区附加资源

显示:
© 2014 Microsoft