
У нас Windows Server 2019 Standard (x64) с 64 ГБ памяти.
На снимке экрана ниже показано использование памяти на уровне 96% приSQL-сервер Windows NTработает и использует 344,5 МБ.
Это диспетчер задач после остановки службыSQL-сервер Windows NT. Использование памяти снизилось до 8%.
Я начинаю обслуживаниеSQL-сервер Windows NTснова. Диспетчер задач показывает очень низкий показатель в 9%, но сервер SQL теперь использует больше памяти, чем когда использование памяти составляло 96%.
Два вопроса:
- Что за проблема с памятью?
- Как можно снизить использование памяти без перезапуска экземпляра SQL-сервера?
решение1
Здесь вы упускаете важную деталь: диспетчер задач показывает, что SQL Server использует только 344,5 МБ оперативной памяти, но на самом деле он зарезервировал гораздо больше, почти всю, для собственного использования. Диспетчер задач этого не покажет. Цифры в диспетчере задач на самом деле не составляют 97% системной памяти, потому что зарезервированная память там не отображается.
Ваше предположение, что почти вся ваша память занята чем-то другим, и SQL Server не может использовать больше 344,5 МБ, просто неверно. Это так не работает. Диспетчер задач может быть довольно обманчивым, взгляните на фактические счетчики производительности.
Обновите, чтобы попытаться объяснить это лучше.
SQL-серверпо дизайнукэширует данные в памяти и со временем использует почти всю доступную память в системе; но эта память не отображается (или, по крайней мере, не вся) в диспетчере задач, потому что SQL Server пытается вести себя хорошо и говорит ОС: «Мне нужно столько-то памяти, но она нужна только для кэширования, я смогу обойтись и без нее, так что смело возвращайте ее, если нужно». Это приводит к тому, что диспетчер задач показывает гораздо меньше памяти, используемой SQL Server, чем он фактически зарезервировал.
Этони в коем случаепроблема; это сделано намеренно и по замыслу. "Проблема", которую вы видите, не существует, только то, что вы видите в диспетчере задач, вводит в заблуждение.
Если вы остановите SQL Server, он, конечно, освободит всю выделенную ему память, как ту, что отображается в диспетчере задач, так и ту (гораздо большую), которая не отображается. Когда вы снова запустите его, он будет использовать очень мало памяти: использование снова вырастет со временем, поскольку SQL Server загружает данные в память и кэширует их. Но большая часть этой памяти, опять же, будетнетотображаться в диспетчере задач, поскольку этот конкретный инструмент не может его увидеть.
Я также добавлю, что если SQL Server на самом деленужныйпамять, он распределил бы ее по-другому изатемДиспетчер задач покажет это; вы увидите 60 ГБ памяти, используемой SQL Server, если он действительнонеобходимыйстолько памяти, а не использовать ее только для кэширования.
решение2
На этой машине запущен SQL Server, поэтому он делает то же, что и SQL Server — резервирует (почти) всю доступную в ОС память, так что при получении больших запросов или других операций ему не нужно выделять оперативную память, она у него уже есть.
У вас есть несколько вариантов.
- Примите это. Если вы используете только SQL Server на этой машине, то он работает так, как задумано. Оставьте его в покое.
- Ограничьте его. Если вам необходимо запускать другие рабочие нагрузки на этом сервере, вы можете ограничить объем оперативной памяти, который SQL будет резервировать.
Я бы категорически не стал использовать вариант 2, если только SQL никогда не использует ОЗУ, которую он поглощает. Вы узнаете об этом, только если будете измерять счетчики производительности SQL на уровне ОС и динамические представления управления SQL на уровне.
Общая картина, какую проблему вы на самом деле пытаетесь решить? «Освобождение памяти» в этом сценарии — бессмысленная задача, если вы не знаете, что освобождаете ее для чего-то другого. У вас проблемы с производительностью SQL, и если да, как вы определили, что узкое место — оперативная память, а не, например, плохой дизайн индекса или неоптимизированные запросы?
Я веду вас к тому,используйте надлежащий мониторинг для диагностики проблем производительности.Вам нужно много знать о SQL и прилично о Windows, чтобы сделать это. Если вы не DBA, наймите его или заключите с ним контракт, или работайте с вашим поставщиком программного обеспечения, если это SQL для купленного продукта. Если это то, что ваша компания написала сама без DBA, идите и найдите его.
По умолчанию экземпляр SQL Server может со временем потреблять большую часть доступной памяти операционной системы Windows на сервере. После того, как память получена, она не будет освобождена, если только не будет обнаружено давление памяти. Это сделано намеренно и не указывает на утечку памяти в процессе SQL Server.
/Изменить на основе ваших правок:
Хоть я и не системный администратор, мне кажется, что SQL Server использует мало памяти, поскольку все остальное потребляет Windows.
Вы почти наверняка ошибаетесь. Как я уже упоминал выше, SQL-сервер со временем выделит почти всю системную оперативную память. Объем ОЗУ, используемый процессом sqlserver.exe, НЕ говорит вам, сколько ОЗУ SQL фактически выделил. DMV и счетчики производительности вам это скажут.
Я использую SSMS для работы с базами данных, и я лично замечаю, насколько все медленно. Даже такие простые вещи, как открытие панели таблиц для просмотра всех моих таблиц, требуют времени и иногда тайм-аута.
Не запускайте его на сервере SQL, запустите его со своей рабочей станции.