Я пытаюсь придумать разумный способ понять, max server memory (mb)
подходит ли настройка (должна быть ниже или выше, или не изменяться). Я знаю, что max server memory (mb)
всегда должно быть достаточно низким, чтобы оставить место для самой операционной системы и т. Д.
Среда, на которую я смотрю, имеет несколько сотен серверов; Мне нужна надежная формула, которую я могу использовать, чтобы определить, подходит ли текущий размер пула буферов, поскольку ОЗУ стоит на ГБ, выделенный каждому серверу. Вся среда виртуализирована, и «физическая» оперативная память, выделенная виртуальной машине, может быть легко изменена вверх или вниз.
У меня есть конкретный экземпляр SQL Server, на который я сейчас смотрю, с PLE 1100 052 секунд, что соответствует 12,7 дням (время работы сервера). Сервер имеет максимальный параметр памяти сервера 2560 МБ (2,5 ГБ), из которых только 1380 МБ (1,3 ГБ) фактически выделено.
Я прочитал несколько статей, в том числе один от Джонатана Кейхия ( пост ), другой от Пола Рэндала ( пост ) и несколько других. Джонатан рекомендует, чтобы мониторинг PLE ниже 300 на 4 ГБ пула буферов был слишком низким. Для экземпляра SQL Server, приведенного выше, 300 * (2.5 / 4) = 187
приводит к действительно очень низкому целевому значению PLE ниже 300. Этот экземпляр имеет 290 ГБ данных SQL Server (не включая файлы журналов) и используется только для интеграционного тестирования. Предполагая, что последние 12 дней представляют типичное использование для этого сервера, я бы сказал, что max server memory (mb)
настройка может быть снижена.
На другом конце шкалы у меня есть другой сервер тестирования интеграции с PLE 294, который имеет max server memory (mb)
настройку только 1 ГБ. Этот сервер имеет только 224 МБ данных SQL Server, не включая журналы, и работает с некоторыми базами данных BizFlow. Этот сервер может выиграть от более высокой max server memory (mb)
настройки.
Я думаю, что хорошей отправной точкой для целей, которым может быть выделено слишком много памяти, может стать просмотр:
SELECT
RamMB = physical_memory_in_bytes / 1048576
, BufferPoolCommittedMB = bpool_committed * 8192E0 / 1048576
, BufferPoolCommitTargetMB = bpool_commit_target * 8192E0 / 1048576
, PercentOfDesiredSizeMB = CONVERT(INT,(CONVERT(DECIMAL(18,2),bpool_committed)
/ bpool_commit_target) * 100)
FROM sys.dm_os_sys_info;
Если BufferPoolCommitTargetMB / BufferPoolCommittedMB
больше 1, сервер не использует весь пул буферов. Если рассматриваемая машина также имеет PLE больше «x», то это может быть хорошим кандидатом для уменьшения max server memory (mb)
.
Поскольку Buffer Manager:Lazy writes/sec
счетчик производительности отслеживает, сколько раз SQLOS записывал страницы на диск между контрольными точками из-за нехватки памяти, это может быть еще одним хорошим моментом, на который стоит обратить внимание.
DECLARE @WaitTime DATETIME;
SET @WaitTime = '00:00:15';
DECLARE @NumSeconds INT;
SET @NumSeconds = DATEDIFF(SECOND, 0, @WaitTime);
DECLARE @LazyWrites1 BIGINT;
DECLARE @LazyWrites2 BIGINT;
SELECT @LazyWrites1 = cntr_value
FROM sys.dm_os_performance_counters dopc
WHERE (
dopc.counter_name LIKE 'Lazy writes/sec%' COLLATE SQL_Latin1_General_CP1_CI_AS
)
AND dopc.object_name = 'MSSQL$' + CONVERT(VARCHAR(255),
SERVERPROPERTY('InstanceName')) + ':Buffer Manager';
WAITFOR DELAY @WaitTime;
SELECT @LazyWrites2 = cntr_value
FROM sys.dm_os_performance_counters dopc
WHERE (
dopc.counter_name LIKE 'Lazy writes/sec%' COLLATE SQL_Latin1_General_CP1_CI_AS
)
AND dopc.object_name = 'MSSQL$' + CONVERT(VARCHAR(255),
SERVERPROPERTY('InstanceName')) + ':Buffer Manager';
SELECT LazyWritesPerSecond = (@LazyWrites2 - @LazyWrites1) / @NumSeconds;
Приведенный выше код предполагает, что сервер находится под нагрузкой в течение 15 секунд, необходимых для запуска, в противном случае он выдаст 0; что может быть ложным отрицательным обманом.
Должен ли я также рассматривать PAGELATCHIO_*
статистику ожидания или какой-либо другой тип ожидания как индикатор нехватки памяти или ее отсутствия?
У меня вопрос, как я могу надежно определить «хорошее» целевое значение для PLE и max server memory (mb)
?
источник
max server memory (mb)
, и поэтому я не очень хочу их уменьшать. Тем не менее, некоторые другие экземпляры имеют более 1000000 PLE, и, как таковые, являются довольно очевидными потенциальными кандидатами на падение оперативной памяти. Очевидно, что уменьшение ОЗУ приведет к увеличению числа операций ввода-вывода, и я не уверен, сколько это будет стоить.max server memory
сеттингом - это нечто вроде курицы и яйца; чем нижеmax server memory
настройка, тем ниже будет минимальный «приемлемый» PLE, чтобы я мог застрять в постоянно понижающейся спирали. Я уверен, что, как вы упомянули, производительность пользователя в какой-то момент будет затронута.Текущий T-SQL, который я использую для оценки PLE
max server memory
:Этот код сравнивает PLE с минимальным «приемлемым» PLE для количества
max server memory
сконфигурированной системы. Если PLE заметно выше, чем допустимое число, это означает максимум на 10% нижеmax server memory
. Если значение PLE ниже допустимого значения PLE, оно предполагает максимум на 10% большеmax server memory
.Если фактический объем выделенного пула буферов меньше, чем размер целевого пула буферов, рекомендуется уменьшить его
max server memory
до этого, плюс немного дополнительной памяти для потоков, отложенной записи и т. Д.Код также просматривает различные счетчики производительности для таких вещей, как Lazy Writes / second, Free List Stalls и Batch Requests.
Код не идеален, я делюсь им здесь, чтобы получить информацию и для будущих пользователей SO.
источник