SQL Server Максимальная и минимальная конфигурация памяти

8

Каковы правильные настройки минимальной памяти и максимальной памяти в этом случае использования?

Сервер имеет 8 ГБ оперативной памяти, два процессора Intel Xeon и Windows Server 2008 R2 / Sql Server 2008 Standard Edition. Он работает с несколькими базами данных размером от 30 до 5 ГБ.

Первоначально использование памяти было установлено по умолчанию (минимум = 0, максимум = 2 147 483 647). При этих настройках большая часть использования памяти была занята sqlservr.exe, и сервер в конечном итоге должен был бы перезагружаться каждый день или два. Сначала он будет работать нормально, но в течение дня начнется время ожидания для простых операций, таких как поиск записи с использованием первичного ключа.

Я изменил мин = 4,096 и макс = 6,144. Это приводит к использованию только 1,4 ГБ памяти. Однако теперь все четыре процессора работают с частотой загрузки процессора 50-60%. Задачи выполняются примерно на 1/3 больше времени, хотя сервер гораздо стабильнее.

sa555
источник
Купите больше оперативной памяти и оставьте максимум по умолчанию.
Ремус Русану
4
@RemusRusanu Я полагаю, вы имели в виду мин по умолчанию!
Кин Шах
У нас очень похожие варианты использования и похожие проблемы (в ОС нет памяти из-за того, что все это захватывает SQL), когда люди забывают о методах. Наша практика - использовать 0 в качестве минимального значения, а половину - в качестве максимального.
Пол
@ нет, я имею в виду макс . Я должен сказать, что оставьте как min, так и max при значениях по умолчанию, но я так и не понял, зачем кому-то когда-либо менять min ...
Remus Rusanu
1
@RemusRusanu Я предположил, что это была опечатка, так как с количеством внутренних знаний у вас есть + ваши отличные ответы. Я бы, однако, не согласился с тем, чтобы оставить память Max по умолчанию.
Кин Шах

Ответы:

10

Если посмотреть на доступность вашей оперативной памяти для этого конкретного сервера и вы используете несколько баз данных размером от 30 до 5 ГБ , вам определенно нужно больше оперативной памяти на этом сервере.

Вы не упомянули, что это автономный экземпляр или на этом сервере запущено несколько экземпляров сервера sql.

Ваши настройки MAX Memory в порядке для сервера с 8 ГБ ОЗУ. Посмотрите эти рекомендуемые настройки от Glenn Berry .

Я настоятельно рекомендую вам выполнить базовую оценку вашей среды, используя приведенные ниже счетчики PERFMON, чтобы получить хорошее значение конфигурации вашей памяти:

  • SQL Server: менеджер буфера \ ожидаемая продолжительность жизни страницы
  • SQL Server: менеджер буфера \ чтение страниц / сек
  • Физический диск \ чтения диска / сек
  • Память \ Доступно Мбайт
  • SQL Server: диспетчер памяти - общий объем памяти сервера
  • SQL Server: диспетчер памяти - целевая память сервера

Общая память сервера: объем памяти, выделенный в настоящее время для пула буферов, а не общий объем памяти для сервера SQL

Память целевого сервера: идеальный размер пула буферов, соответствующий максимальному объему памяти для экземпляра.

Примечание. Если «Общая память сервера»> «Целевая память сервера», то это говорит о нехватке памяти.

Нижеприведенный скрипт поможет вам найти уведомления о низком или высоком уровне памяти из sys.dm_os_ring_buffersсеанса работы системы:

SELECT CONVERT (varchar(30), GETDATE(), 121) as [RunTime],
dateadd (ms, (rbf.[timestamp] - tme.ms_ticks), GETDATE()) as [Notification_Time],
cast(record as xml).value('(//Record/ResourceMonitor/Notification)[1]', 'varchar(30)') AS [Notification_type],
cast(record as xml).value('(//Record/MemoryRecord/MemoryUtilization)[1]', 'bigint') AS [MemoryUtilization %],
cast(record as xml).value('(//Record/MemoryNode/@id)[1]', 'bigint') AS [Node Id],
cast(record as xml).value('(//Record/ResourceMonitor/IndicatorsProcess)[1]', 'int') AS [Process_Indicator],
cast(record as xml).value('(//Record/ResourceMonitor/IndicatorsSystem)[1]', 'int') AS [System_Indicator],
cast(record as xml).value('(//Record/MemoryNode/ReservedMemory)[1]', 'bigint') AS [SQL_ReservedMemory_KB],
cast(record as xml).value('(//Record/MemoryNode/CommittedMemory)[1]', 'bigint') AS [SQL_CommittedMemory_KB],
cast(record as xml).value('(//Record/MemoryNode/AWEMemory)[1]', 'bigint') AS [SQL_AWEMemory],
cast(record as xml).value('(//Record/MemoryNode/SinglePagesMemory)[1]', 'bigint') AS [SinglePagesMemory],
cast(record as xml).value('(//Record/MemoryNode/MultiplePagesMemory)[1]', 'bigint') AS [MultiplePagesMemory],
cast(record as xml).value('(//Record/MemoryRecord/TotalPhysicalMemory)[1]', 'bigint') AS [TotalPhysicalMemory_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailablePhysicalMemory)[1]', 'bigint') AS [AvailablePhysicalMemory_KB],
cast(record as xml).value('(//Record/MemoryRecord/TotalPageFile)[1]', 'bigint') AS [TotalPageFile_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailablePageFile)[1]', 'bigint') AS [AvailablePageFile_KB],
cast(record as xml).value('(//Record/MemoryRecord/TotalVirtualAddressSpace)[1]', 'bigint') AS [TotalVirtualAddressSpace_KB],
cast(record as xml).value('(//Record/MemoryRecord/AvailableVirtualAddressSpace)[1]', 'bigint') AS [AvailableVirtualAddressSpace_KB],
cast(record as xml).value('(//Record/@id)[1]', 'bigint') AS [Record Id],
cast(record as xml).value('(//Record/@type)[1]', 'varchar(30)') AS [Type],
cast(record as xml).value('(//Record/@time)[1]', 'bigint') AS [Record Time],
tme.ms_ticks as [Current Time]
FROM sys.dm_os_ring_buffers rbf
cross join sys.dm_os_sys_info tme
where rbf.ring_buffer_type = 'RING_BUFFER_RESOURCE_MONITOR' 
--and cast(record as xml).value('(//Record/ResourceMonitor/Notification)[1]', 'varchar(30)') = 'RESOURCE_MEMPHYSICAL_LOW'
ORDER BY rbf.timestamp ASC

Несколько хороших ссылок:

Кин Шах
источник
2
У вас есть общее и целевое сравнение неправильно, но в любом случае есть лучшие способы определить, находится ли сервер под давлением внешней памяти.
Пол Уайт 9
@paulwhite не могли бы вы уточнить немного, чтобы я мог улучшить свой ответ? Спасибо за просмотр.
Кин Шах
Это отдельный экземпляр
sa555