5 главных заблуждений о счётчиках производительности SQL Server

5 главных заблуждений о счётчиках производительности SQL Server

Перевод статьи: Top 5 Misleading SQL Server Performance Counters

Счётчики производительность превосходный инструмент для мониторинга и выявления проблем Microsoft SQL Server. Но некоторые счётчики могут ввести вас в заблуждение, потому что они означают не то, что многие думают. Предлагаю рассмотреть некоторые из них.

SQLServer: Buffer Manager\Buffer cache hit ratio

Идея: Процент чтений данных из памяти (вместо диска)

Проблема: Этот счётчик не учитывает «упреждающее чтение». Упреждающее чтение — важный тип физического чтение, который используется для поднятия данных с диска в память. У вас может быть множество чтений с диска и этот счётчик не покажет вам их.

Решение: Собирайте LogicalDisk: Avg Disk Bytes/Read and Write и Avg Disk sec/Read and Write. Они помогут вам понять задержки доступа к диску. Avg Disk bytes поможет определить ситуации очень больших и очень малых операций. Так же для понимания задержек чтений/записи по файлам БД, вы можете иногда собирать информацию из DMV sys.dm_io_virtual_file_stats.

LogicalDisk\Avg. Disk Queue Length

Идея: Оповещение о проблемах диска (появление очередей)

Проблема: Современные хранилища могут работать с большими очередями и в то же время с маленьким временем отклика.

Решение: Собирайте всё те же LogicalDisk: Avg Disk Bytes/Read and Write и Avg Disk sec/Read and Write и sys.dm_io_virtual_file_stats.

SQL Server: Access Methods\Page Splits/sec

Есть несколько видов разрывов страниц:

  1. Необходимо добавить большую запись в середину страницы
  2. Нужна новая страница, чтобы добавить запись в конец индекса

Идея: Мониторить первый тип разрывов страниц

Проблема: Счётчик производительности показывает оба типа

Решение: Вы можете собирать определённое событие Extended Events (англ). Так же вы можете собирать информацию о скорости фрагментации ваших индексов и с помощью FILLFACTOR достигнуть компромисса между занимаемым пространством и скоростью образования фрагментации.

SQL Server: Access Methods\Full Scans/sec

Идея: Оповещение о большом количестве полного сканирования таблицы

Проблема: Не все сканирования являются полными. Например, оператор TOP может просканировать только то количество строк, которое указано после него. И не важно сколько просканировал запрос, 15 строк или 15 000 000, счётчик отразит его как «полное сканирование»

Решение: С помощью следующего скрипта вы можете получить информацию о запросах, которые выполняют множество логических чтений

SELECT TOP 20
 	(SELECT CAST(SUBSTRING(st.text, (qs.statement_start_offset/2)+1,
 	((CASE qs.statement_end_offset
 	WHEN -1 THEN DATALENGTH(st.text)
 	ELSE qs.statement_end_offset
 	END
 	- qs.statement_start_offset)/2) + 1) AS NVARCHAR(MAX)) FOR XML PATH(''),TYPE) AS [TSQL],
 	qs.execution_count AS [#],
 	qs.total_logical_reads as [logical reads],
 	CASE WHEN execution_count = 0 THEN 0 ELSE
 	CAST(qs.total_logical_reads / execution_count AS numeric(30,1))
 	END AS [avg logical reads],
 	CAST(qs.total_worker_time/1000./1000. AS numeric(30,1)) AS [cpu sec],
 	CASE WHEN execution_count = 0 THEN 0 ELSE
 	CAST(qs.total_worker_time / execution_count / 1000. / 1000. AS numeric(30,1))
 	END AS [avg cpu sec],
 	CAST(qs.total_elapsed_time/1000./1000. AS numeric(30,1)) AS [elapsed sec],
 	CASE WHEN execution_count = 0 THEN 0 ELSE
 	CAST(qs.total_elapsed_time / execution_count / 1000. / 1000. AS numeric(30,1))
 	END AS [avg elapsed sec],
 	qp.query_plan AS [query execution plan]
 	FROM sys.dm_exec_query_stats AS qs
 	OUTER APPLY sys.dm_exec_sql_text (plan_handle) as st
 	OUTER APPLY sys.dm_exec_query_plan (plan_handle) AS qp
 	ORDER BY qs.total_logical_reads DESC
 	OPTION (RECOMPILE);

SQLServer: Locks – Average Wait Time (ms); Lock Wait Time (ms);  Lock Waits/sec

Идея: Оповещения о высоком времени ожиданий блокировок

Проблема: Эти счётчики обновляются только тогда, когда ожидание блокировки уже закончилось, не во время самого ожидания. Предложим что вы ожидали 5 минут и вы сможете увидеть эти проблемы только по окончанию ожидания.

Эти счётчики могут привести в замешательство:

Мы видим, что 4 сессии испытывают блокировки, но счётчики показывают нулевые значения

Решение: Собирайте счётчик SQL Server: General Statistics \ Processes Blocked. Он покажет количество сессий, который заблокированы в данный момент.

Если вы хотите узнать больше о блокировках, то можете посмотреть следующий курс Troubleshooting Blocking & Deadlocks for Beginners.

Запись опубликована в рубрике Мониторинг с метками . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Войти с помощью: