SQL Server не использует всю память


10

У меня SQL Server 2014 с максимальной памятью 6 ГБ (физическая память 8 ГБ).

Сервер памяти Target иногда 6GB , а затем падает обратно Общий сервер памяти (приблизительно 5.3GB, никогда не достигает 6GB). Я использовал committed_kb в sys.dm_os_sys_info , чтобы проверить память , используемую SQL Server.

Когда я наблюдаю за sys.dm_os_buffer_descriptors , я вижу, что страницы удаляются из кэша - но все еще остается 700 МБ памяти. Если бы ничто не требовало памяти, как бы вы объяснили тот факт, что страницы удаляются из кэша? Я ожидаю, что SQL Server удаляет страницы только тогда, когда ему нужна память.

Нераспределенные временные таблицы не являются проблемой на этом сервере. Мой PLE - 3632. Кэш процедуры - 2182 МБ.

Я ожидал бы, что страницы будут отбрасываться только тогда, когда не останется памяти, но у меня свободно 700 МБ, или я неправильно понял это?

Может кто-нибудь, пожалуйста, попытайтесь объяснить это поведение?

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

Я провел еще несколько исследований и прочитал огромное количество страниц с диска в память и заметил что-то в диспетчере задач во время чтения:

  • Объем используемой памяти составлял 7,0 ГБ -> 7,2 ГБ -> 7,0 ГБ -> 7,2 ГБ -> ...
  • Sqlservr.exe вышел из 5,3 ГБ -> 5,5 ГБ -> 5,3 ГБ -> 5,5 ГБ -> ...

Это так же, как Windows не позволяет sqlservr.exe расти до 6 ГБ.

Я выполнил запрос, предоставленный Shanky:

select
(physical_memory_in_use_kb/1024) Physical_Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 )Locked_pages_used_Sqlserver_MB,
(Virtual_address_committed_kb/1024 )Total_Memory_in_MB,--RAM+ Pagefile
process_physical_memory_low,
process_virtual_memory_low
from sys. dm_os_process_memory

Это дало следующий результат:

Physical_Memory_usedby_Sqlserver_MB: 5247
Locked_pages_used_Sqlserver_MB: 0
Total_Memory_in_MB: 5625
process_physical_memory_low: 0
process_virtual_memory_low: 0

Я не понимаю, почему Total_Memory_in_MB не равно 6144 (максимальный объем памяти)?

В sys.dm_os_ring_buffers я обнаружил RESOURCE_MEMPHYSICAL_LOW, так что я думаю, что Windows не хватает памяти и SQL Server должен вернуть некоторые. Но доступно около 1 ГБ памяти => почему Windows сообщает, что у нее мало памяти?

<Record id="13861" type="RING_BUFFER_RESOURCE_MONITOR" time="20635079241">   
   <ResourceMonitor>
        <Notification>RESOURCE_MEMPHYSICAL_LOW</Notification>
        <IndicatorsProcess>0</IndicatorsProcess>
        <IndicatorsSystem>2</IndicatorsSystem>
        <NodeId>0</NodeId>
        <Effect type="APPLY_LOWPM" state="EFFECT_OFF" reversed="0">0</Effect>
        <Effect type="APPLY_HIGHPM" state="EFFECT_IGNORE" reversed="0">85827186</Effect>
        <Effect type="REVERT_HIGHPM" state="EFFECT_OFF" reversed="0">0</Effect>   
   </ResourceMonitor>   
   <MemoryNode id="0">
        <TargetMemory>6050080</TargetMemory>
        <ReservedMemory>67208656</ReservedMemory>
        <CommittedMemory>5423548</CommittedMemory>
        <SharedMemory>0</SharedMemory>
        <AWEMemory>0</AWEMemory>
        <PagesMemory>4975656</PagesMemory>   
   </MemoryNode>   
   <MemoryRecord>
        <MemoryUtilization>100</MemoryUtilization>
        <TotalPhysicalMemory>8387608</TotalPhysicalMemory>
        <AvailablePhysicalMemory>1048452</AvailablePhysicalMemory>
        <TotalPageFile>11142348</TotalPageFile>
        <AvailablePageFile>2887916</AvailablePageFile>
        <TotalVirtualAddressSpace>137438953344</TotalVirtualAddressSpace>
        <AvailableVirtualAddressSpace>137371168056</AvailableVirtualAddressSpace>
        <AvailableExtendedVirtualAddressSpace>0</AvailableExtendedVirtualAddressSpace
   </MemoryRecord> 
</Record>

Обновление
После еще одного исследования, почему всегда было доступно 1 ГБ памяти, я думаю, что-то нашел.
Возможно ли, что SQL Server может выделять только свободную память, а доступная память игнорируется? При запуске Process Explorer (Sysinternals) я увидел, что свободной памяти было 0.

Ответы:


3

Для начала я должен сказать, что вы установили максимальный объем памяти сервера в 6 ГБ, а общий объем памяти - 8 ГБ, поэтому вы просто оставили 2 ГБ для ОС, что во многих случаях, даже если на компьютере с Windows ничего не установлено, кроме SQL Server слишком мало памяти для ОС. Для правильной работы в системе с установленным антивирусом ОС должно быть выделено не менее 4 ГБ. Я сразу оставляю 2 ГБ для ОС и 1,5 Г для AV.

Память целевого сервера иногда составляет 6 ГБ, а затем возвращается к общей памяти сервера (около 5,3 ГБ, никогда не достигает 6 ГБ).

Память целевого сервера показывает, сколько памяти требуется SQL Server для правильной работы в идеальном случае. Объем памяти целевого сервера составляет 6 ГБ, поскольку вы установили максимальное значение памяти сервера на 6 ГБ. Он пытается использовать всю память, которой ему позволено.

Общий объем памяти сервера - это то, что SQL Server действительно может использовать прямо сейчас. Это выделенная память и подкрепленная физическим ОЗУ. Это максимум 5,5 ГБ в вашем случае.

SQL Server пытается увеличить потребление памяти, но после того, как он достигнет 5,3 или 5,5 ГБ, операционная система просит SQL Server не увеличивать потребление памяти и может фактически отмечать уведомление о нехватке памяти. Это происходит потому, что ОС может столкнуться с нехваткой памяти, как уже было сказано выше. SQLOS отвечает, если операционная система Windows сталкивается с нехваткой памяти, запрашивая свои кеши для сокращения их потребления. Вы можете запросить кольцевой буфер, чтобы проверить, не было ли уведомлено о нехватке памяти. Я должен добавить DMV sys.dm_os_ring_buffer без документов, но безопасно.

Я вижу, что страницы удаляются из кеша, но остается еще 700 МБ памяти. Если бы ничто не требовало памяти, как бы вы объяснили тот факт, что страницы удаляются из кэша? Я ожидаю, что SQL Server удаляет страницы только тогда, когда ему нужна память.

Если вы ищете свободную память, я бы не советовал вам просматривать DMV sys.dm_os_buffer_descriptors . Счетчик ОС Available Mbytes покажет вам количество физической памяти в байтах, доступной для процессов , запущенных на компьютере. Я предлагаю вам также посмотреть, что является детерминированным методом для оценки разумного размера пула буферов? а также прочитайте: Нужно ли SQL Server больше оперативной памяти, чтобы узнать, сколько оперативной памяти нужно SQL Server и сталкивается ли SQL Server с нехваткой памяти. Из того, что вы упомянули, если вы уверены, что страницы удаляются из пула буферов, то да, SQL Server чувствует, что страницы должны быть перемещены, потому что ему нужно место для размещения новых страниц. Я не уверен, как вы рассчитали 700 МБ бесплатно.

Еще одна вещь, пожалуйста, не смотрите в диспетчере задач для потребления памяти SQL Server. Это не всегда дает правильное значение, особенно когда учетная запись службы SQL Server имеет права на блокировку страниц в памяти . В вашем случае, даже если SQL Server имеет максимальный объем памяти сервера 6 ГБ, ОС выделяется всего 2 ГБ, что заставляет SQL Server не увеличивать потребление, поскольку для SQL Server 2 ГБ мало. Есть ли что-нибудь кроме SQL Server, работающего в системе?

Если вы хотите рассчитать потребление памяти SQL Server, используйте:

select
(physical_memory_in_use_kb/1024) Physical_Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 ) Locked_pages_used_Sqlserver_MB,
(virtual_address_space_committed_kb/1024 ) Total_Memory_in_MB,--RAM+ Pagefile
process_physical_memory_low,
process_virtual_memory_low
from sys.dm_os_process_memory

Я не понимаю, почему Total_Memory_in_MB не равно 6144 (максимальный объем памяти).

Столбец Total_Memory_in_MB обозначает общий объем памяти, используемый SQL Server (RAM + файл подкачки). ОЗУ - это фактически используемая физическая память или выделенная память. Некоторая часть процесса SQL Server также выгружается на диск и представляет собой виртуальную память или файл подкачки, поэтому, если вы увидите, что ОБЩАЯ память используется SQL Server, это будет сумма физической памяти и файла подкачки.

В то время как столбец Physical_Memory_usedby_Sqlserver_MB - это просто используемая физическая память (память, поддерживаемая физической или фиксированной памятью). Это причина, почему оба они разные. Если вы видите реальный столбец, то сначала используется физическая память, а другой - выделенная виртуальная память.

Если вы хотите увидеть выгружаемую память, это будет разница между Total_Memory_in_MB и Physical_Memory_usedby_Sqlserver_MB .

ПРИМЕЧАНИЕ. Общая используемая память будет больше, чем используемая физическая память.


5

SQL Server использует гораздо больше кешей, кроме буферного кеша, хотя это, безусловно, самый большой (очевидный пример - кеш плана). Вы можете поближе познакомиться с памятью DBCC MEMORYSTATUSи различными DMV. Целевая память и общая память относятся конкретно к пулу буферов / кэшу.

Выдержка из основополагающего документа по внутренним компонентам и устранению неполадок в SQL Server 2008 Кристиана Болтона :

  • MSSQL$<instance >:Memory Manager\Total Server Memory (KB):
    Указывает текущий размер пула буферов.
  • MSSQL$<instance >:Memory Manager\Target Server Memory (KB):
    Это указывает на идеальный размер для пула буферов. Total и Target должны быть практически одинаковыми на сервере без нагрузки памяти, которая была запущена некоторое время. Если Total значительно меньше Target , то, скорее всего, SQL Server не сможет увеличить буферный пул из-за нехватки памяти, и в этом случае вы можете продолжить исследование.

Просто добавьте, даже если общая и целевая память сервера одинаковы, мы не можем быть на 100% уверены, что в памяти нет нагрузки. В этом случае нам нужно запустить еще несколько счетчиков памяти и получить их данные, чтобы прийти к выводу.
Шэнки

«Total и Target должны быть практически одинаковыми на сервере без нагрузки памяти, которая работала некоторое время». Давайте подумаем об этом. Я встаю новый SQL Server с 128 ГБ оперативной памяти, и я поднимаю одну базу данных на 1 ГБ. Пусть работает месяц. Действительно ли я верю, что Total и Target будут почти одинаковыми в конце этого месяца? Если это не так, я должен верить, что сервер находится под давлением памяти? Я считаю, что трудно поверить.
Майк Шеррилл 'Cat Recall'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.