2015-09-16 2 views
3

В настоящее время я тестирую тесты на пропитание и продолжаю сталкиваться с проблемой, которую я никогда не видел в прошлом. Я потратил немало времени на изучение проблемы и до сих пор не получил ее.SQL Server Plan Cache неожиданно не работает

В какой-то момент во время тестирования (иногда в течение 1 часа, в другое время 4 часа) машина SQL Server запускает максимальный процессор. Это всегда соответствует резкому уменьшению кеш-памяти БД и увеличению свободной памяти.

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

Я могу понять, почему кэш плана смывания однако аспектов этого, что путает меня является:

  • После кэша плана промывается и мой мясистые запрос заканчивается есть много свободной память (даже после дальнейшего увеличения объема памяти SQL Server допускается) кэш плана, похоже, не восстанавливается. Я остался с множеством свободной памяти, которая никому не помогает.
  • Если я остановлю свой тест на выдержку, а затем снова запустите его, то все вернется в норму, кеш плана будет расти, как ожидалось. SQL Server не требует перезапуска или изменения настроек.

После того, как кеш-флеш, соотношение кэш-памяти все еще ОК-иш, ~ 90%, но это намного ниже, чем 99%, которое я вижу перед флешем и действительно наносят ущерб ЦП.

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

Post flush Я вижу очень большое количество вставок, за которыми следуют многочисленные промахи на одном и том же объекте (т. Е. Хранимые процедуры), и поэтому потребление памяти для кеша остается низким.

Вы можете видеть из желтой линии в кадре моих счетчиков ниже, что использование кэш-памяти падает и остается низким, но свободная память (королевский синий) остается довольно высокой.

Performance Counters

EDIT

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

Количество подключений к серверу резко увеличивается, когда оно достигает максимального давления (я предполагаю, что он не может справляться с запросами достаточно быстро, поэтому необходимы новые соединения для работы с «постоянными», поток запросов). Это отставание затем оказывает дополнительное давление на сервер, который, по-видимому, не может восстановиться.

Теперь я все еще озадачен метрикой. Я мог бы принять это как проблему с серверным ресурсом, если новые подключения, казалось, сжигали память, замедляли обработку, вызывают новые подключения и т. Д. Я вижу, что есть много свободной памяти, но SQL Server не используя его для кеша плана.Из-за этого он тратит больше времени на компиляцию, повышая производительность процессора и вещи из-под контроля.

Похоже, что соединения являются ключевой частью этой проблемы. Как упоминалось ранее, если я перезапущу тест, все вернется к норме. С тех пор я обнаружил, что помещать БД в однопользовательский режим на несколько секунд, чтобы все связанные с тестированием соединения погибали, ожидая несколько секунд, а затем возвращаясь к многопользовательскому режиму, разрешает проблему. Я попытался просто убить все активные соединения на основе SPID, но кажется, что для восстановления сервера и правильного использования кеша плана потребуется пауза в несколько секунд.

Смотрите снимок экрана ниже моих счетчиков. Я пытаюсь довести сервер до верхней части до ~ 02: 33: 15, и я установил режим одиночного пользователя в ~ 02: 34: 30, а затем многопользовательский режим через несколько секунд после.

Purple line - это пользовательские соединения, толстый красный - это компиляции p/s, ярко-зеленый - кэш-память, память для подключения к aqua, серовато-коричневая - свободная память.

Caching Issue with Reset

+0

Можете ли вы разместить ссылку на изображение? Кто-то, вероятно, отредактирует его. –

+0

Выполнено, спасибо – govule

ответ

0

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

Я скорректировал тест на выдержку, так что, если сервер БД находится под давлением, он немного потянет себя и прекратит некоторые соединения до тех пор, пока сервер не вернется под контроль и дополнительные соединения не будут восстановлены. Процесс восстановления SQL Server по порядку может занять несколько минут, но это произойдет!

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

В моем конкретном случае очень высокий коэффициент попадания в кеш (выше 99,5%), и из-за теста на впитывание, в основном повторяющего одно и то же многократно для часов для пользователей, кеш очень хорошо используется. Если бы кеш был не так хорошо использован, SQL Server вполне мог бы сделать правильный выбор, отказавшись от планов, но я не думаю, что он здесь.

Смежные вопросы