SQL Server не освобождает память после ежедневной загрузки - PullRequest
0 голосов
/ 27 апреля 2018

У нас есть SQL Server 2012 Enterprise Edition, 128 ГБ ОЗУ, Windows 2008R2. Задание SQL Server выполняется каждый день в 3 часа утра и занимает 5 часов для загрузки данных в базу данных. Во время этого процесса SQL Server использует 123 ГБ (макс. Выделенная память).

После завершения задания SQL Server не освобождает ОЗУ.

Запрошено использование памяти, где буферный пул показывает 97 ГБ. Пользователи не имеют доступа к базе данных в течение этого времени. Я перезапустил службы SQL Server, чтобы остановить ОЗУ. Я не нашел правильный ответ, связанный с этой проблемой. Почему не освобождает ОЗУ? Как мы можем снизить использование ОЗУ?

Задание SQL Server -> Пакет служб SSIS -> Импорт данных из Mysql в базу данных SQL Server

Спасибо

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

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

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

Настройки ОЗУ здесь определяют минимальную память сервера и максимальную память сервера . Тщательная настройка максимальной памяти позволяет освободить место для других процессов. В статье цитируется сложная формула для определения, сколько места оставить:

  • Из общего объема памяти ОС зарезервируйте 1ГБ-4ГБ для самой ОС.
  • Затем вычтите эквивалент потенциального выделения памяти SQL Server. вне максимального контроля памяти сервера, который состоит из стека размер 1 * рассчитан максимум рабочих потоков 2 + -g параметр запуска 3 (или 256 МБ по умолчанию, если не указан параметр -g). То, что остается, должно быть Параметр max_server_memory для настройки одного экземпляра.

На наших серверах мы обычно просто включаем его и устанавливаем параметр максимальной памяти на несколько ГБ ниже общей физической памяти. Это оставляет много места для ОС и других приложений.

Если объем памяти сервера SQL Server превышает мин памяти сервера , а ОС находится под давлением памяти, SQL Server может освобождать память до тех пор, пока она не будет установлена ​​на мин памяти сервера .

Ссылка: Руководство по архитектуре управления памятью .

Одной из основных целей проектирования всего программного обеспечения для баз данных является свести к минимуму дисковый ввод-вывод, потому что чтение и запись диска являются одними из самых ресурсоемкие операции. SQL Server создает буферный пул в память для хранения страниц, прочитанных из базы данных. Большая часть кода в SQL Сервер предназначен для минимизации количества физических чтений и пишет между диском и буферным пулом. SQL Server пытается достичь баланс между двумя целями:

  • Не допускайте, чтобы буферный пул становился настолько большим, что всей системе не хватало памяти.
  • Минимизируйте физический ввод-вывод в файлы базы данных, увеличив размер пула буферов.

Когда SQL Server использует память динамически, он запрашивает систему периодически определять объем свободной памяти. Поддержание этого свободная память не позволяет операционной системе (ОС) выполнять подкачку. Если меньше память свободна, SQL Server освобождает память для ОС. Если больше памяти свободен, SQL Server может выделить больше памяти. SQL Server добавляет память только когда его рабочая нагрузка требует больше памяти; сервер в состоянии покоя не увеличить размер своего виртуального адресного пространства.

...

Поскольку все больше пользователей подключаются и выполняют запросы, SQL Server получает дополнительная физическая память по требованию. Экземпляр SQL Server продолжается получать физическую память, пока она не достигнет своего максимального сервера цель выделения памяти или Windows указывает, что больше нет избыток свободной памяти; освобождает память, когда у нее больше, чем минимум настройки памяти сервера, а Windows указывает, что существует нехватка свободной памяти.

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

Если по какой-либо причине:

  1. Вы абсолютно ДОЛЖНЫ вернуть эту память
  2. Вы знаете, что вам это не нужно какое-то время
  3. Вы готовы заплатить штраф за выделение виртуальной памяти и физический ввод-вывод для извлечения данных с диска в следующий раз, когда вам понадобится эта память

Затем вы можете временно перенастроить базу данных max server memory , установив меньшее значение. Это можно сделать через пользовательский интерфейс SSMS, или вы можете использовать sp_configure 'max server memory' с последующим reconfigure для внесения изменений программно.

0 голосов
/ 28 апреля 2018

Полное раскрытие: сам не пробовал. Вы не должны пробовать это в своей производственной среде перед тестированием где-либо еще.

Это ответ DBA :

sp_configure 'show advanced options', 1;  
GO  
RECONFIGURE;  
GO  
sp_configure 'max server memory', 4096;  
GO  
RECONFIGURE;  
GO 

4096 следует заменить значением, которое вы считаете приемлемым как минимум.

Следует аналогичная команда для увеличения памяти до исходного максимума.

0 голосов
/ 27 апреля 2018

Это сделано специально, когда SQL Server использует память, он сохраняет ее и не возвращает обратно в ОС.

Ваш диспетчер задач может отображать всю / почти всю память, используемую SQL Server, но если вы хотите узнать, сколько памяти фактически использует SQL Server, вы можете использовать следующий запрос.

SELECT    (physical_memory_in_use_kb/1024) AS Memory_usedby_Sqlserver_MB
FROM sys.dm_os_process_memory;  
...