SQL Server останавливает обработку на 20 секунд - PullRequest
4 голосов
/ 16 декабря 2009

Я не могу понять это. На SQL Server у меня есть процесс, который выполняется десятки раз в секунду (данные отправляются на сервер). Процесс работает отлично, обработка запросов занимает от 50 до 200 мс. Затем примерно (но время от времени) каждые 1,5 минуты все запросы внезапно занимают от 15000 до 22000 мс (от 15 до 22 секунд). В то же время загрузка ЦП на сервере резко падает. Иногда (примерно в 70% случаев) средняя длина очереди диска возрастает непосредственно перед тем, как процессор падает, а запросы замедляются.

Я наблюдаю за процессором на perfmon, он обычно скачет между 20% и 70%, со средним процессором около 50%. Когда все останавливается, оно падает до 0% с парой 20% всплесков примерно на 20 секунд.

В то же время я наблюдаю за монитором активности SQL. Обычно в списке находится от 1 до 4 транзакций EXECUTE, но когда это происходит, транзакции EXECUTE начинают увеличиваться до 20 или 30 транзакций. Транзакции приходят, но не являются процессами.

Я проверяю блоки и никогда не вижу:

Select A.*
       From master.dbo.sysprocesses as A with (nolock)
       Where A.blocked <> 0

Обратите внимание, что я работаю в режиме "изоляции моментального снимка"

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

Я проверил агент SQL на другие запущенные процессы, ни один из которых не был запланирован на момент возникновения этих событий.

Я смотрю SQL Profiler, чтобы узнать о других событиях, ничего не было. Я также наблюдал за событиями File Growth, и он ничего не сообщает.

Даже если запросы занимают 20000 мс, отчеты SQL Profiler читаются как под 2000, а процессор - под 50. Сами процессы, похоже, не потребляют ресурсы. Однако события выхода из системы сообщают о высоких чтениях и процессоре (я не уверен, что это вообще актуально).

Во время этих событий в моем журнале событий также ничего нет.

Есть идеи? Любое другое место, чтобы посмотреть?

Запуск SQL Server 2005 Standard в Windows 2003 32-битной версии.

Ответы [ 8 ]

2 голосов
/ 16 декабря 2009

Вы проверили диск на наличие ошибок? Похоже, что-то там происходит. Если это массив RAID, проверьте работоспособность массива.

1 голос
/ 18 декабря 2009

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

dm_exec_requests, показывающий тип ожидания WRITELOG (время ожидания 0) означает, что запросы зафиксировали транзакцию и ожидают защиты журнала (записи на диск) --Remus Rusanu

Чтобы проверить это, я включил ведение журнала контрольных точек и записал сеанс perfmon во время нескольких инцидентов. Затем я сравнил журнал с perfmon и увидел, что инциденты всегда были связаны с контрольной точкой в ​​одной из моих баз данных.

DBCC TRACEON (3502, -1) - включить запись контрольной точки

DBCC TRACEOFF (3502, -1) - отключить запись контрольной точки

EXEC xp_readerrorlog - прочитать журнал

SELECT DB_Name ([dbid]) как [Имя базы данных] - проверить идентификатор базы данных, указанный в журнале

Эта конкретная база данных имеет один процесс, который производит много вставок и удалений. Решение состоит в том, чтобы переписать этот процесс, чтобы уменьшить объем записываемых данных. Другой вариант - добавить оборудование.

Спасибо всем, кто внес свой вклад.

0 голосов
/ 16 декабря 2009

Один вариант: обновление статистики. Если вы пишете достаточно часто, вы можете достичь порога повторного вычисления.

Посмотрите на эту статью "Статистика индекса на MSDN" и опция "AUTO_UPDATE_STATISTICS_ASYNC"

Хотя каждые 90 секунд это немного много ...

0 голосов
/ 16 декабря 2009

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

Попробуйте установить сетевой анализатор, такой как Wireshark , чтобы узнать, происходит ли что-нибудь интересное в момент начала паузы.

0 голосов
/ 16 декабря 2009

Вы проверили потребление памяти? Windows Server 2003 R2 иногда в основном перезапускает все выделения памяти при интенсивной нагрузке. Когда это происходит, SQL Server принудительно сокращается до минимального объема памяти (4 МБ или около того) и затем медленно перераспределяет память на сервер до тех пор, пока он не вернется к относительно нормальному уровню. Мы видели, как это происходит, когда по нашей сети SAN копируются очень большие файлы. Я слышал, что это может быть вызвано процессом резервного копирования журнала транзакций, если журналы транзакций очень велики и сервер загружен очень интенсивно.

0 голосов
/ 16 декабря 2009

Что такое wait_type, wait_resource и wait_time, равные sys.dm_exec_requests для долгосрочных запросов (выборка периодически)? Эти запросы порождают подзадачи (sys.dm_os_tasks)? Что делают эти задачи?

0 голосов
/ 16 декабря 2009

Я бы добавил еще несколько счетчиков в вашем perfmon, например, читает и пишет в секунду. Отсюда вы можете увидеть, если это проблема ввода-вывода. Также проверьте эту запись MSDN о производительности SQL . Это действительно дало некоторые хорошие идеи о вещах, чтобы проверить по крайней мере для меня.

0 голосов
/ 16 декабря 2009

Вы используете полнотекстовый поиск?

Я думаю, что время от времени может происходить некоторая перестройка индекса.

Возможно, попробуйте автоматизировать полное перестроение индексов или перейти на некластеризованные индексы?

...