Продажи: 1-800-867-1389

Регулирование ресурсов в ядре базы данных SQL Azure

Обновлено: Июнь 2014 г.

Регулирование ресурсов в ядре сокращает использование ресурсов, блокируя соединения клиентов, отрицательно воздействующих на общее состояние системы. Степень блокирования соединений подписчика изменяется от блокирования только вставок и обновлений до блокирования всех операций записи или даже всех операций чтения и записи. Промежуток времени, на который вводится в действие регулирование, называется циклом регулирования. Он по умолчанию равен 10 секундам и не может изменяться пользователями.

Степень серьезности регулирования подразделяется на следующие два этапа.

  • Программное регулирование. Это первый этап, когда ресурсы машины, такие как журнал транзакций, ввод-вывод, хранилище, превышают стандартные пороги безопасности. База данных SQL выбирает подмножество баз данных, потребляющих больше всего ресурсов, и регулирует их активность. Принудительному регулированию ресурсов подвергаются не все базы данных, а только те, которые используют большую часть ресурсов. Если степень использования ресурсов находится ниже стандартного порогового значения, это означает, что на сервере имеется достаточно ресурсов для всех баз данных.

  • Аппаратное регулирование. Это второй и последний этап, когда перегрузка значительно воздействует на компьютер. При использовании аппаратного регулирования не допускается создание новых соединений с базами данных, размещенными на компьютере, до тех пор, пока не освободятся ресурсы. В ответ на попытки создания новых соединений база данных SQL возвращает сообщения об ошибке, указывающие, что потребление ресурса превышено.

В следующей таблице представлены: информация о механизме регулирования ресурсов в ядре, соответствующий возвращаемый код ошибки и рекомендации по исправлению ситуации.

 

Механизм регулирования ресурсов в ядре Возвращаемый код ошибки Рекомендация

В целях регулирования ресурсов в ядре для снижения нагрузки и защиты работоспособности системы выполняются следующие шаги.

  1. Определение снижения нагрузки, необходимого для возврата системы в нормальное состояние.

  2. Обозначение баз данных подписчиков, потребляющих избыточные ресурсы, в качестве кандидатов на регулирование. Если регулирование ресурсов ядра происходит из-за небольшого превышения, определенные базы данных могут быть исключены из рассмотрения как кандидаты на регулирование. Если регулирование ресурсов ядра вызвано значительным превышением, все базы данных подписчиков могут стать кандидатами на регулирование, за исключением баз данных подписчиков, не получавших нагрузки в цикле регулирования, непосредственно предшествующем текущему циклу регулирования.

  3. Вычисление того, сколько баз данных-кандидатов следует подвергнуть регулированию для возврата системы в нормальное состояния, оценив типичное использование ресурсов базами данных-кандидатами.

  4. Регулирование рассчитанного количества баз данных-кандидатов, пока нагрузка системы не вернется к требуемому уровню. В зависимости от того, является регулирование ресурсов ядра аппаратным или программным, уровень регулирования и режим регулирования могут изменяться. Уровень и режим применяемого регулирования можно вычислить, используя идентификатор инцидента и значения кода в сообщении об ошибке. Все подвергнутые регулированию базы данных остаются отрегулированными в течение как минимум продолжительности одного цикла регулирования (10 секунд), но для возврата системы в нормальное состояние регулирование часто может повторяться в течение многих циклов регулирования.

40501. В данный момент служба занята. Повторите запрос через 10 секунд. Идентификатор инцидента: <Идентификатор>. Код <код>.

noteПримечание
Идентификатор инцидента и значения кода можно использовать для определения того, какие запросы подверглись регулированию и было оно программным или аппаратным. Дополнительные сведения см. в разделах «Идентификатор инцидента регулирования» и «Расшифровка кодов причин» далее в этом разделе.

Введите задержку и повторите запрос через 10 секунд.

Идентификатор инцидента регулирования при возникновении ошибки 40501 представляет собой значение GUID, которое уникальным образом определяет инцидент регулирования.

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

Если причину возникновения регулирования не удается определить либо если оно сохраняется и вы не знаете, как это устранить, обратитесь в службу технической поддержки Майкрософт и укажите идентификатор инцидента (<ID>) из сообщения об ошибке. С помощью этого идентификатора инцидента служба технической поддержки Майкрософт сможет получить дополнительные сведения, связанные с инцидентом регулирования. Идентификатор инцидента можно использовать для получения следующих сведений:

  • Время начала инцидента регулирования.

  • Тип регулирования (программное или аппаратное регулирование).

  • Тип ресурса (например, ЦП), в связи с которым возник инцидент регулирования.

  • В какой программе работал пользователь, когда возник инцидент регулирования?

Узнав основную причину в службе поддержки пользователей Microsoft, можно внести соответствующие изменения в свое приложение.

В настоящем разделе приведено описание того, как расшифровать коды причины, возвращаемые следующим кодом ошибки регулирования ресурсов ядра:

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

Код причины (<code>) в сообщении об ошибке — это десятичное число, содержащее сведения о режиме регулирования и типе ресурса, квота по которому превышена.

  • Режим регулирования перечисляет типы отклоненных инструкций.

  • Тип ресурса указывает ресурсы, потребляемые сверх лимита. Регулирование может одновременно выполняться для ресурсов различных типов, например ЦП и устройств ввода-вывода.

Рассмотрим следующий пример сообщения об ошибке с кодом причины 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

Отклонить все операции

Все

Нет

Чтобы получить режим регулирования, примените операцию деления по модулю 4 к коду причины. 131075 % 4 = 3. Результат 3 означает, что задействован режим регулирования «Отклонить все операции».

Чтобы узнать тип регулирования и тип ресурса, разделите код причины на 256. Затем преобразуйте частное результата в его двоичный эквивалент. 131075 / 256 = 512 (десятичное значение) и 512 (десятичное значение) = 10 00 00 00 00 (двоичное значение). Это означает, что база данных подверглась регулированию из-за ЦП (тип ресурса 4) и аппаратного регулирования (10).

В следующем примере кода используется класс ThrottlingCondition в блоке приложения для обработки непостоянных ошибок (также известном как «Topaz») в пакете интеграции Enterprise Library для Azure для расшифровки кода причины в ошибке регулирования ресурсов ядра (40501). Для загрузки сборок и исходного кода блока приложения для обработки непостоянных ошибок для использования класса ThrottlingCondition см. раздел Пакет интеграции Enterprise Library 5.0 для 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();
        }
    }
}

Кроме того, можно использовать пример кода, доступный в руководстве по производительности и эластичности базы данных SQL Azure на TechNet Wiki для расшифровки кодов причин. Этот пример кода не имеет зависимостей от блока приложения для обработки непостоянных ошибок.

См. также

Была ли вам полезна эта информация?
(1500 символов осталось)
Спасибо за ваш отзыв
Показ:
© 2014 Microsoft