Вопрос

У меня есть производственная версия "Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64)", которая показывает странные симптомы буфера и ожидаемого срока службы страницы (PLE).

Я запускаю это каждую минуту на своем сервере (чтобы отследить эту проблему):

SELECT @ple = CAST([cntr_value] AS VARCHAR(20))
FROM sys.dm_os_performance_counters
WHERE [object_name] LIKE '%Manager%'
AND [counter_name] = 'Page life expectancy'

SELECT @usedBufferPages = CAST(COUNT(*) /128 AS VARCHAR(20)) 
FROM sys.dm_os_buffer_descriptors

DECLARE @StartDate VARCHAR(8) = Convert(VARCHAR(8), GETDATE(), 14)
RAISERROR ('%s. PLE at %s and Used Buffers at %s at %s ', 0, 
            1,@runCountString ,@ple, @usedBufferPages, @StartDate) WITH NOWAIT  

Это некоторый пример вывода:

16. PLE at 858 and Used Buffers at 7290 at 09:51:42 
17. PLE at 918 and Used Buffers at 7342 at 09:52:42 
18. PLE at 978 and Used Buffers at 7408 at 09:53:43 
19. PLE at 1039 and Used Buffers at 7547 at 09:54:43 
20. PLE at 1100 and Used Buffers at 7697 at 09:55:44 
21. PLE at 1160 and Used Buffers at 7901 at 09:56:45 
22. PLE at 1221 and Used Buffers at 7961 at 09:57:46 
23. PLE at 1282 and Used Buffers at 8012 at 09:58:46 
24. PLE at 11 and Used Buffers at 313 at 09:59:46 
25. PLE at 31 and Used Buffers at 966 at 10:00:46 
26. PLE at 90 and Used Buffers at 1580 at 10:01:47 
27. PLE at 151 and Used Buffers at 3072 at 10:02:47 
28. PLE at 211 and Used Buffers at 3152 at 10:03:47 
29. PLE at 271 and Used Buffers at 3729 at 10:04:47  

В пункте # 24 SQL Server сообщает о том, что PLE переходит из с 1,282 по 11.SQL Server также сообщает, что используемые буферы поступают из от 8 012 до 313.

Сначала я искал плохо выполняемые запросы и нашел несколько исправленных (никак не повлиявших на проблему).Но я не нахожу никаких проблемных запросов, которые соотносились бы со временем, когда у меня возникали проблемы с PLE / буфером.Кроме того, если бы это был плохо выполняемый запрос, то я бы подумал, что буферы были бы заполнены данными этого запроса, а не пустыми / отсутствующими / с ошибкой.

Затем я подумал, что Виртуальная машина была ограничена в объеме памяти, когда это произошло.Но я спросил своего системного администратора, и он заверил меня, что память не является динамической или каким-либо образом разделяемой.(То, что ему назначено, он получает постоянно.) Кроме того, я запускаю этот скрипт каждые 10 минут, и когда PLE сообщает менее 50:

  SELECT * FROM sys.dm_os_sys_memory

И он сообщает об одних и тех же / похожих значениях, когда PLE / Буферы высокие и когда они низкие.Для полноты картины, вот пример значений до и после #24 выше:

total_physical_memory_kb    available_physical_memory_kb    total_page_file_kb  available_page_file_kb  system_cache_kb kernel_paged_pool_kb    kernel_nonpaged_pool_kb   system_high_memory_signal_state   system_low_memory_signal_state   system_memory_state_desc
20970996                    4758672                         24378868            7929404                 4844160         686076                  182752                    1                                 0                                Available physical memory is high
20970996                    4743468                         24378868            7892632                 4845000         686580                  182688                    1                                 0                                Available physical memory is high

Я проверил сеанс работоспособности системы, и он не показывает ничего связанного.(Все, что у него есть, - это ошибки олицетворения, и их время не коррелирует со временем, когда в PLE / буферах возникают проблемы.

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

Вот график, который показывает PLE и буферизацию за 21 час:

PLE and Buffers Over 21 Hours

Так что я в тупике.Я думаю, что суть проблемы заключается в буферах, а не в PLE.(Я думаю, что PLE получает ложное сообщение о низком уровне, потому что все буферы каким-то образом исчезли.)

Но я не могу придумать, каким образом это могло произойти.Или что делать дальше.

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

Обновления по вопросам в комментариях:

Итак, сколько памяти выделено серверу? Виртуальная машина имеет 20 ГБ оперативной памяти.
Какова максимальная память сервера?

name                    value   value_in_use  description
max server memory (MB)  13000   13000         Maximum size of server memory (MB)
min server memory (MB)  0       16            Minimum size of server memory (MB)

ПРИМЕЧАНИЕ:Я только что немного почитал об этом, и, похоже, эти настройки неверны для моего сервера.

Насколько велика база данных? На этом сервере запущены две транзакционные базы данных (я нахожусь в процессе получения серверов для их изоляции). Их размеры составляют 383 ГБ и 378 ГБ.

Какие еще приложения и службы запущены на этом сервере? На этом сервере хранятся данные для моего приложения.В него не попадают никакие другие предметы.(У меня есть реплицированное хранилище оперативных данных для отчетов и тому подобного.

Что такое технология виртуальной машины Программное обеспечение виртуальной машины.
Работает ли эта виртуальная машина на хосте, на котором размещены только виртуальные машины с аналогичным распределением ресурсов? В нашей компании много виртуальных машин.Все разного размера.Однако это один из самых больших.

Можете ли вы подтвердить то, что ваш Системный администратор говорит вам о распределении памяти, не просто веря ему? Я не могу.У меня нет доступа к этим инструментам.

(По моему опыту, системные администраторы скажут много чего, чтобы переложить вину на приложение или кого-либо еще, если это означает, что им ничего не нужно делать.) Я могу полностью понять это чувство.

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

Статистика времени ожидания

WaitType               Wait_S      Resource_S  Signal_S  WaitCount  Percentage   AvgWait_S  AvgRes_S  AvgSig_S 
---------------------- ----------- ----------- --------- ---------- ------------ ---------- --------- ---------
PAGEIOLATCH_SH         16250.10    16219.14    30.96     2171649    29.59        0.0075     0.0075    0.0000   
CXPACKET               14214.03    13238.56    975.47    1187935    25.88        0.0120     0.0111    0.0008   
PAGEIOLATCH_EX         6814.59     6806.21     8.38      638725     12.41        0.0107     0.0107    0.0000   
WRITELOG               5157.42     4873.44     283.98    3588476    9.39         0.0014     0.0014    0.0001   
BACKUPIO               2569.51     2538.12     31.39     1704119    4.68         0.0015     0.0015    0.0000   
LCK_M_IX               2477.15     2477.10     0.05      113        4.51         21.9217    21.9213   0.0004   
ASYNC_IO_COMPLETION    2079.99     2079.66     0.33      836        3.79         2.4880     2.4876    0.0004   
BACKUPBUFFER           1807.75     1759.11     48.64     380189     3.29         0.0048     0.0046    0.0001   
IO_COMPLETION          986.23      985.84      0.39      116112     1.80         0.0085     0.0085    0.0000   
Это было полезно?

Решение

Как обсуждалось на Этот поток SE и подтверждено OP.

Проблема связана с ошибкой в SQl Server 2012.Эта ошибка была исправлена в SQL Server 2012 с пакетом обновления 1 CU4.Или, чтобы быть в большей безопасности, сказал, что я бы порекомендовал вам подать заявку SQL Server 2012 с пакетом обновления 2 вместо того, чтобы выбирать CU4.

Согласно деталям исправления ошибки Microsoft

Вы можете столкнуться с низкой производительностью SQL Server 2012.При проверке Средства мониторинга производительности SQL Server вы увидите следующее:

• Быстрое сокращение SQLServer: менеджер буферов \ Ожидаемый срок службы страницы значения счетчика производительности.Когда возникает эта проблема, счетчик близок к 0.

Другие советы

Ваш буферный пул равен всего 13 ГБ а ваши базы данных составляют 383 ГБ и 378 ГБ, которые вы классифицировали как OLTP - небольшие транзакции, выполняемые слишком часто.

Описанная выше ситуация, если я могу себе представить, выглядит следующим образом :

enter image description here (источник :Фотографии в Google)

Вы должны понимать, как SQL Server хранит информацию :

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

Вы наверняка испытываете нехватку памяти из-за огромного размера базы данных и недостаточного пула буферов.Обратитесь к - Как, например, определить идеальную память?

Собирать статистика ожидания и проверьте, нет ли проблем с производительностью, возникающих из-за потери памяти буферного пула

Рекомендация:

Добавьте больше памяти экземпляру сервера и разделите две базы данных на разных виртуальных машинах с достаточным объемом памяти.

Здесь очень мало что нужно отлаживать - вам нужно добавить память, логически разделить вашу базу данных на несколько виртуальных машин или понять, что перетасовка, которую вам приходится выполнять с ограниченной памятью, приведет к проблемам с производительностью и нестабильной работе.Пытаться уместить 800 ГБ данных в 13 ГБ оперативной памяти - все равно что пытаться спрятать их в рюкзаке.

Присмотритесь повнимательнее к выполняемым запросам.Использование памяти в базах данных само по себе, как правило, является слишком грубым показателем для улучшения ситуации.Предполагая, что вы не можете повлиять на запросы (приложение "черный ящик"), все же стоит понять, что влияет на использование памяти.Например, пакетный процесс может использовать все буферное пространство за один заход, запрашивая все данные из огромной таблицы.

В частности, ищите любые отсутствующие индексы, которые вызывают полное сканирование таблицы, поскольку они могут эффективно очистить кэш на сервере.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top