У меня есть SQL Server 2008 (версия 10.0.1600), работающий на сервере Windows Server 2008 R2 Enterprise с 8 ГБ физической оперативной памяти. Если я открываю диспетчер задач, я вижу в разделе «Физическая память» вкладки «Производительность», что из 8191 всего доступно только 340 МБ, но я не вижу ни одного процесса, использующего такой объем памяти. Обратите внимание: объем памяти SQL Server ограничен 6 ГБ (максимальная память сервера = 6000).
Если я открою Sysinternals Process Explorer, я увижу sqlsrvr.exe
процесс имеет:
Private Bytes: 227.000 K
Working Set: 140.000 K
Virtual Size: 8.762.000 K
Что это значит? Есть ли способ освободить эту память для другого процесса? Почему виртуальный размер отображается как выделенная память? Я думал, что виртуальный размер - это только «зарезервированная память».
Это нормально. SQL-сервер всегда будет использовать всю доступную память и уменьшить масштаб, когда системе потребуется больше ресурсов.
ЭТОТ статья описывает происходящее.
Когда вы запускаете SQL Server, Использование памяти SQL Server может продолжать неуклонно увеличиваться, а не уменьшаться, даже когда активность на сервере низкая. Кроме того, диспетчер задач и системный монитор могут показать, что физическая память, доступная на компьютере, неуклонно уменьшается, пока доступная память не станет от 4 до 10 МБ.
Само по себе это поведение не указывает на утечку памяти. Такое поведение является нормальным и является предполагаемым поведением буферного пула SQL Server.
По умолчанию, SQL Server динамически увеличивает и уменьшает размер своего буферного пула (кеша) в зависимости от нагрузки физической памяти, сообщаемой операционной системой. Пока доступно достаточно памяти для предотвращения подкачки (от 4 до 10 МБ), буферный пул SQL Server будет продолжать расти. Поскольку другие процессы на том же компьютере, что и SQL Server, выделяют память, диспетчер буферов SQL Server будет освобождать память по мере необходимости. SQL Server может освобождать и получать несколько мегабайт памяти каждую секунду, что позволяет ему быстро адаптироваться к изменениям распределения памяти.
Из-за того, как SQL Server распределяет память (особенно при включенном AWE), диспетчер задач и обозреватель процессов не дадут вам точного представления о том, сколько оперативной памяти он фактически использует. Чтобы получить точные цифры, вам нужно напрямую спросить SQL Server. Самый простой способ сделать это - запустить perfmon и добавить счетчик SQLServer: Memory Manager / Total Server Memory. Этот счетчик сообщит об общем использовании памяти в КБ.
Теперь, если SQL Server использует полные 6000 МБ, которыми он ограничен, это совершенно нормальное (и желательное) поведение. Если он использует значительно больше, то может быть проблема.