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

У меня есть SQL Server 2014 с max memory , установленным на 6 ГБ (физическая память - 8 ГБ).

Память целевого сервера иногда составляет 6 ГБ, а затем возвращается к Общая память сервера (около 5,3 ГБ, никогда не достигает 6 ГБ). Я использовал commit_kb в sys.dm_os_sys_info для проверьте память, используемую SQL Server.

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

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

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

Может кто-нибудь попробует объяснить это поведение?

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

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

  • Используемая память - от 7,0 ГБ -> 7.2GB -> 7,0 ГБ -> 7.2GB -> ...
  • Sqlservr.exe перешел от 5.3GB -> 5,5 ГБ -> 5.3GB -> 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 Сервер должен вернуть некоторые. Но доступно около 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.

10 голосов | спросил Frederik Vanderhaegen 25 PMpMon, 25 Apr 2016 18:06:36 +030006Monday 2016, 18:06:36

2 ответа


3

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

  

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

Память целевого сервера означает, сколько памяти требуется SQL Server для правильной работы в идеальном случае. Память целевого сервера составляет 6 ГБ, потому что вы установили значение max server memory на 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 . Счетчик OS Available Mbytes сообщит вам объем физической памяти в байтах, доступный для процессов, выполняющихся на компьютер. Я предлагаю вам также увидеть Что такое детерминированный метод оценки разумного размера пула буферов? , а также читать Требуется ли SQL Server больше ОЗУ , чтобы узнать, сколько требуется RAM SQL Server, и если SQL Server сталкивается с давлением памяти. Из того, что вы упомянули, если вы уверены, что страницы удаляются из пула буферов, тогда да, SQL Server считает, что страницы нужно перемещать, потому что для размещения новых страниц требуется пространство. Я не уверен, как вы рассчитали 700 МБ бесплатно.

Еще одна вещь, пожалуйста, не смотрите на Диспетчер задач для использования памяти SQL Server. Это не всегда дает вам правильное значение, особенно если учетная запись службы SQL Server имеет блокировку страниц в памяти . В вашем случае, даже если SQL Server имеет максимальную память сервера 6 ГБ, OS предоставляется всего 2 ГБ, что заставляет SQL Server не увеличивать потребление, потому что 2 ГБ для SQL Server является низким. Есть ли что-то помимо 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 также выгружается вдиск, который представляет собой виртуальную память или файл страницы, и поэтому, если вы собираетесь видеть TOTAL-память, потребляемую SQL Server, это будет сумма физической памяти и файла страницы.

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

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

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

ответил Shanky 26 PMpTue, 26 Apr 2016 19:05:29 +030005Tuesday 2016, 19:05:29
5

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

Выдержка из христианского Болтона seminal Профессиональный внутренний 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 не сможет увеличить буферный пул из-за давления памяти, и в этом случае вы сможете продолжить исследование.
  •   
ответил Mark Broadbent 25 PMpMon, 25 Apr 2016 18:14:04 +030014Monday 2016, 18:14:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132