Глобальное замедление SQL Server 2005
Два дня назад наш производственный сервер сильно замедлился, и основным симптомом было то, что необычайно большое количество запросов испытывало SQLTimeouts. Я быстро опишу нашу настройку, то, что я исследовал, наш обходной путь, а затем последую с моим вопросом.
Наша установка
Пара серверов содержит эту ветвь нашего приложения SAS. Один из них является сервером приложений, на котором запущено несколько приложений в IIS, а другой, который испытал замедление, представляет собой Windows Server 2008, работающий под управлением SQL Server 2005. В SQL размещается от 100 до 200 баз данных.
Проблема / расследование
Сервис в значительной степени останавливается. Некоторые запросы проходят, но большинство страдают тайм-аутами SQL. Процессор и оперативная память SQL-машины выглядят нормально, в среднем около 25% рабочей нагрузки процессора и 85% оперативной памяти. В то время я не думал проверять активность диска, так как пошел прямо к "EXEC sp_who2"
В результате были показаны сотни задач, заблокированных с помощью идентификатора 123, который был сам по себе и с сотней других, заблокированных с помощью идентификатора 456. Обычное выполнение обычно вообще не блокирует задачи. Когда я перезапустил sp_who2 через 15-20 секунд, появились разные идентификаторы блокировки, но количество заблокированных / блокирующих задач, похоже, осталось прежним. (не считал группы из-за аварийного режима)
Большинство задач блокировались с помощью таких операторов, как "SELECT INTO" или "CREATE INDEX on temptable".
Обходной путь
Убейте процесс SQL и перезапустите его, чтобы восстановить службу. Замедление не появилось снова, но мы знаем, что рискуем.
Мой вопрос
Что я могу сделать, чтобы исправить эту проблему, желательно до того, как она возникнет снова?
Суб-вопросы:
- Есть ли другой путь, который я могу исследовать во время нормальной деятельности?
- Если / когда проблема повторяется, какую информацию я должен собрать? (Нужно быть быстрым, чтобы получить, поскольку это означает, что у нас снова будет перерыв в обслуживании)
Что я сделал до сих пор
Судя по симптомам, мы подозревали, что проблема была в некотором роде спора о базе данных tempdb. (Другим симптомом было то, что щелчок правой кнопкой мыши на базе данных tempdb для просмотра свойств во время проблемы через некоторое время вызвал ошибку)
Ни в одном журнале не указано, что событие автоматического увеличения произошло в базе данных tempdb, хотя, насколько я знаю, успехи автоматического увеличения не регистрируются, а только ошибки.
С тех пор я прочитал много разных источников информации о разногласиях с tempdb, но не ограничиваясь ими:
http://www.sqlskills.com/blogs/paul/wait-statistics-or-please-tell-me-where-it-hurts/ http://www.sqlservercentral.com/blogs/robert_davis/2010/03/05/Breaking-Down-TempDB-Contention/
Исходя из того, что я понял, лучше всего иметь файлы tempdb с заданным начальным размером и по одному на ядро, до 8 файлов. Мы планируем внедрить это (8 ядер, 8 файлов) как можно скорее, так как это лучшая практика. Все они будут находиться на одном жестком диске (на данный момент), но мы считаем, что в худшем случае нет улучшения, а в лучшем случае мы получаем разницу между узким местом логического конфликта и узким местом дискового ввода-вывода.
Однако мы не можем быть уверены в корреляции с проблемой, которая у нас была. Из того, что я понимаю, разбиение на несколько временных файлов помогло бы при ожидании типа "PAGELATCH_XX", но при выполнении запроса Пола С. Рэндала (см. 1-я опубликованная ссылка) во время обычной деятельности этот тип ожидания отсутствует. Лучшие 3, которые я вижу во время нормальной деятельности:
CXPACKET 68,63%
LATCH_EX 18,46%
PAGEIOLATCH_SH 4,35%
У меня нет никакого способа узнать, какой тип блокировки происходил во время замедления, поскольку у нас тогда не было всей этой информации.
1 ответ
Проблема в конечном итоге возникла на следующий день после того, как я опубликовал этот вопрос.
Запустив запрос Пола С. Рэндала, я быстро обнаружил, что происходит некоторое время ожидания блокировки PAGELATCH_XX, поэтому с помощью sp_who2 я смог найти базы данных виновников и перезапустить только соответствующие пулы клиентских приложений с веб-сервера в качестве гораздо менее резкого обходного пути. восстановить сервис.
Мы также смогли проследить путь к фактическим операциям, которые выполняют гораздо больше работы с tempdb, чем они делали раньше, и постараемся исправить это с помощью другого подхода к этой проблеме.
Решение
Мы продвинулись в том, чтобы разделить файл tempdb на несколько файлов, как подсказывает лучшая практика, поскольку, похоже, именно этот тип конфликтов возникал для решения этой проблемы.