null

Краткий анализ производительности MS SQL Server, часть 1

В рамках решения задачи у одного из заказчиков по устранению падения производительности сервера 1С, потребовалось произвести оценку производительности компонентов системы. В этой заметке будет кратко рассмотрен метод оценки производительности MS SQL Server в части, касающейся утилизации  процессора.. Ошибки в коде, также могущие влиять на производительность, не будут рассматриваться в данной заметке. Также полагается, что сервер, на котором развернут MS SQL не выполняет сторонние высоконагруженные расчетные задачи.

Основными компонентами, влияющими на производительность SQL Server, являются:

  • процессоры;
  • память;
  • диски;
  • сеть.

Оценить загрузку по любой из этих компонент можно, возспользовавшись Task Manager  или Performance Monitor и сравнить текущие значения с пороговыми, однако  возникает вопрос, подошла система к своему пределу производительности и текущее состояние вызвано недостаточностью имеющихся ресурсов, или же работа системы неоптимальна(в этом случае возможна оптимизация системы для работы на имеющихся мощностях).

В случае, если загрузка компонентов не превышает критических значений, проблема с наибольшей вероятностью лежит в неоптимальности внутренней структуры SQL Server, и потребуется анализ с помощью SQL Profiler Trace, DMV, DBCC, а также наличие специальных знаний.

Загрузка процессора

Используется счетчик Processor:%Processor Time. Критическими показателями для данного счетчика можно считать загрузку 80-85%, причем перегружены могут быть как все процессоры системы, так и часть из них.

Счетчик Processor:%Processor Time учитывает User Time и Privilege Time, т.е. т.е. это сумма времени работы процессора в режиме пользователя и в режиме ядра, однако в данном случае для упрощения считается, что процессор работает только в пользовательском режиме, время на обслуживание ядра не учитывается.

Предположим, мы видим такую картину(искомая область выделена синим):

Далее следует найти процесс, загружающий систему. Для этого смотрим на счетчик Process(…): %Processor Time для каждого процесса(кроме процесса Idle, отражающего время простоя процессоров).

Видимо, что среднее значение счетчика составляет примерно 1577, и, поделив на общее количество процессоров(в данном примере -16, иллюстрация взята из сети Internet для конкретного примера), получаем загрузку процессора данным процессом 1577/16=98,6%, что превышает пороговое значение в 80-85%.

Таким образом, в данном примере sqlsrv.exe оказался причиной выской загрузки системы.

В дальнейшем необходимо будет найти причину, по которой sqlsrv.exe потребляет настолько значительное процессорное время. В случае, если причина найдена не будет, это означает что система просто потребляет значительные ресурсы CPU, и подошла к пределу своей производительности.

Процессорная подсистема в наибольшей степени нагружается операциями:

  • Компиляции и рекомпиляции планов выполнения;
  • Операциями сортировки;
  • Операциями хеширования.

Согласно материалам technet и другим статьям, опубликованным в сети Internet, описывающих работу SQL Server, основными соотношениями, позволяющими определить прчину перегрузки процессора, являются:

  • Соотношение между SQL Compilations/sec и Batch Requests/sec
  • Соотношение между SQL ReCompilations/sec и SQL Compilations/sec
  • Соотношение между Workfiles Created/sec и Batch Requests/sec

Нормой для данных соотношений можно считать:

  • SQL Compilations/sec/Batch Requests/sec = 0,1 (10%)
  • SQL ReCompilations/sec/SQL Compilations/sec = 0,1 (10%)
  • Workfiles Created/sec/Batch Requests/sec = 0,2 (20%)

Остановившись на последнем пункте, стоит пояснить, что Workfile – это часть страниц файла данных выделенных для внутренних нужд SQL Server. Отличие Workfile от Worktable состоит в том, что Worktable содержит страницы файла связанные структурами метаданных (IAM) и зарегистрированными в системных таблицах, а Workfile это просто страницы файла данных не объединенные воедино метаданными (IAM). SQL Server активно использует Workfiles для выполнения операций хеширования и хранения промежуточных результатов хеширования (например Hash Backet-ов). (Цитируется по материалам microsoft technet)

Ввиду указанного, большое количество Workfile-ов может свидетельствовать об отстутствии индексов, которые необходимы для операций соединения страниц, и SQL Server вынужден выполнять операции соединения через хеширование, загружая процессор.

В случае, когда основной причиной загрузки процессора является первый пункт(Компиляции и рекомпиляции планов выполнения), это может указывать на использование приложением динамического TSQL кода. Для подтверждения этого предположения необходимо просмотреть состав процедурного кэша. Сделать это можно используя объект Plan Cache и счетчик Cache Pages(счетчики  Performance Monitor).

Cache Pages измеряет количество 8-ми килобайтных страниц  выделенных под хранение различных типов планов выполнения. Типы планов(отображаемые через Instance) могут быть:

  • Bound Trees (Результаты алгебраизации View, алгоритмы выборки данных из View)
  • Extended Storage procedures (Планы выполнения расширенных хранимых процедур)
  • Object Plans (Планы выполнения хранимых процедур, триггеров и некоторых видов функций)
  • SQL Plans (Планы выполнения динамического TSQL кода, сюда же попадают автопараметризованные запросы) 
  • Temporary Tables & Tables Variables (Кэшированные метаданные по временным таблицам и табличным переменным).

Анализируя показания этих счетчиков, в случае если SQL Plans составляет значительную часть объема процедурного кэша, предположение подтверждается. Дальнейшие действия потребуют анализа кода и его оптимизации.

В дальнейшем будут рассмотрены остальные пункты из перечисленных в начале заметки и их анализ.

Используемые материалы:

Microsoft Technet

Жуков М.А., "Проблема с производительностью старта портала в IBM WebSphere"
 

Коротко о себе:

Работаю инженером в компании Tune IT.

Ничего не найдено. n is 0