Поскольку я разработчик, я являюсь пользователем SqlServer на своей машине разработчика, и мне редко удается увидеть, что происходит на сервере.
Но в этом проекте клиент также управляет собственным производственным SqlServer, и иногда мы видим, что машина «занята».
А с занятостью я имею в виду, что это дольше 30 секунд при 100% ЦП. Итак, прежде всего, это нормальное поведение, когда сервер работает нормально, он иногда устанавливает все ядра на 100%?
Поскольку мы (как не являющиеся экспертами по sql) пришли к выводу, что это не так, мы хотели проверить, «что делает sql server?»
Возможно, на одном сервере работает 6 приложений, некоторые будут запускаться каждые 5 минут, одно - это веб-сайт, который подключен постоянно, одно вычисляет данные каждую минуту и т. Д.
Итак, когда процессор на 100%, как мы можем проверить, какое приложение вызывает это?
Мы можем использовать профилировщик sql для проверки того, что отправляется на сервер sql, но он содержит так много строк, что мы не знаем, с чего начать анализ.
Есть ли способ начать?
(это похоже на то, что у вас иногда бывает дома на дестопе: вы ничего не делаете, процессор на 50%, вы слышите дребезжание жесткого диска и думаете: что вы делаете !?)
сервер является одним из двух машинных кластеров (один используется, один восстанавливается после сбоя), оба четырехъядерных с 16 ГБ ОЗУ.
Если вы используете SQL Server 2005 или отличный (что, я полагаю, вы основываете на своем теге), вы можете использовать представления управления данными SQL Server (часто называемые DMV). Это даст вам целый ряд представлений о том, что происходит в вашей системе. В вашем конкретном случае вы можете выполнить следующий запрос (или его ответвление):
ВЫБЕРИТЕ total_physical_reads, total_logical_reads, total_logical_writes, execution_count, total_worker_time, total_elapsed_time, total_elapsed_time / execution_count avg_elapsed_time, creation_time, last_execution_time, st.text
ИЗ sys.dm_exec_query_stats КАК qs ПЕРЕКРЕСТИТЬ ПРИМЕНИТЬ sys.dm_exec_sql_text (qs.sql_handle) st ORDER BY total_elapsed_time / execution_count DESC;
- в предложении order by сначала выполняется сортировка по наибольшему среднему затраченному времени.
HTH, Дэн
С помощью SQL Profiler может быть удобно отфильтровать шум - добавьте фильтр, чтобы показывать только те запросы, выполнение которых заняло больше x секунд. Таким образом, вы сможете обнаружить более длительные операции и пропустить все транзакции, которые завершаются успешно.
Во многих случаях даже более простой подход - взглянуть на монитор активности SQL (или выполнить процедуру sp_who2), когда вы находитесь в одном из этих периодов 100% процессорного времени. Просмотрите список подключений, чтобы увидеть, что активно. Вы видите что-то в ожидании? Есть ли там предметы, которые блокируются, и если да, то что делает блокировка?
Если вы не можете решить проблему с конкретным приложением или набором операторов, вы можете начать копаться в работающем мониторе производительности, чтобы посмотреть на некоторые счетчики, чтобы попытаться определить узкое место в оборудовании или, возможно, назревает неисправность.
Динамические представления также предлагают удобный способ узнать, что происходит.
Тогда, может быть, просмотрите несколько советов Вот.
Итак, прежде всего, это нормальное поведение, когда сервер работает нормально, он иногда устанавливает все ядра на 100%?
Как разработчик вы должны и должны знать, что единственный ответ на этот вопрос - «это зависит от обстоятельств». Возможно ли, что процесс использует весь ЦП в течение значительного количества времени - угадайте, ответ - да.
Итак, вопрос в основном заключается в том, что там за SQL Server (и есть инструменты, чтобы это выяснить). Подключайтесь, посмотрите какие SQL операторы как долго выполняются.
Итак, когда процессор на 100%, как мы можем проверить, какое приложение вызывает это?
Подключитесь с помощью учетной записи SA, просмотрите динамические представления, чтобы узнать, что SQL Server обрабатывает в данный момент. Возможно прикрепить след.
Но сначала убедитесь, что это SQL Server. очень редко SQL Server может быть привязан к ЦП. Первым узким местом обычно является дисковая подсистема.
Может быть, это не так, но в MySQL есть функция, называемая журналом медленных запросов, который регистрирует любые запросы, выполнение которых занимает более 1 секунды (настраивается). Возможно, у SqlServer есть такая же функция?
Используя журнал медленных запросов, вы можете определить, есть ли у вас какие-либо запросы, которые медленно выполняются в вашей системе, или, по крайней мере, вы можете проверить, что у вас их нет.