Как заставить SQL Server освободить память?


19

Я знаю, что SQL любит RAM, но выпускает его, когда Windows спрашивает. Я знаю, что так SQL должен работать. Но у меня есть администратор Windows, который не уверен, что SQL на самом деле вернет ОЗУ, и на этом (виртуальном) сервере SQL не понадобится много, как только службы Analysis Services будут завершены, но на этом сервере больше ничего не мешает. спросите SQL за многое.

Поэтому я пытаюсь заверить администраторов Windows, что проблемы с виртуальной средой не «потому что SQL использует слишком много ОЗУ», но я не могу убедить SQL выпустить его без перезапуска службы.

При обработке кубов служба SQL с радостью отнимает 8 ГБ ОЗУ, но, поскольку на нее нет давления, большая часть этого не высвобождается в течение обычного дня. Ребята из Windows кричат, и было бы намного лучше, если бы SQL выпустил это.

Я не хочу использовать параметр max memory, потому что на самом деле я хочу, чтобы SQL использовал столько памяти при обработке. Я просто хочу, чтобы потом снова вернуться вниз.

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

Я хочу знать, как заставить Windows просить это назад ...


2
Что ... системный администратор жалуется на использование оперативной памяти? Я становлюсь дерьмовым, когда ОЗУ не используется, потому что, если оно не используется, оно просто потратит впустую ...
— Марк Хендерсон

Я тоже не понимаю, если машине не нужна память - в чем проблема? Вот как обычно работает операционная система и ее приложения ... учитывая, что рабочая нагрузка, связанная с тем, что служба SQL в режиме ожидания сохраняет большую часть памяти, когда больше ничего не нужно, может увеличить время отклика и / или производительность для следующего задания SQL?
— Оскар Дюверборн

Администратор Windows чувствует, что SQL нагружает машину, потому что процесс имеет так много оперативной памяти. Я знаю, что окно не испытывает стресса от SQL, и могу продемонстрировать это, перезапустив службу SQL, показав, что она потребляет только много оперативной памяти при получении данных для обработки SSAS. Поэтому я хочу, чтобы SQL освободил память, чтобы показать объем оперативной памяти, которую SQL использует остаток дня. Речь идет не о том, чтобы заставить их предоставлять больше оперативной памяти, а о том, чтобы они перестали обвинять SQL во всем.
— Роб Фарли

2
Согласитесь с Farseeker, сисадмин должен быть рад, что используется ОЗУ. Если он не восстанавливается, то серверу это не нужно. Может быть, попросить системного администратора проверить ошибки страниц, чтобы показать, что система не загружена?
— Ник Кавадиас

2
Если ваш системный администратор не понимает, что представляют собой ошибки страницы, и почему не потребляется память, но не происходит никаких реальных ошибок страницы, я не знаю, как вам помочь. Ты не можешь исправить глупость. Однако вы можете использовать одну из процедур sp_configure, чтобы сконфигурировать максимальный объем памяти, когда вы не используете систему, и настроить ее резервное копирование, когда вам это нужно. Это кажется довольно глупым, однако. sp_configureэто обычно то, что вы должны установить один раз и оставить в покое.
— Беконные биты

Ответы:


12

Я считаю, что ваш единственный вариант - перезапустить службу SQL или запустить приложение, которое потребляет много памяти, чтобы заставить SQL выпустить его.

Мне нравится предложение @Nick Kavadias: следить за счетчиком производительности Memory: Page Faults / Sec, чтобы показать, что SQL не подвергает память операционной системы давлению.


2
Спасибо, Митч ... Позвольте мне найти текстовый файл 10 Гб для Блокнота.
— Роб Фарли

лол !, на самом деле это неплохая идея!
— Митч Уит

возможно используйте файл на 2 ГБ ...
— Митч Уит

5

Один из способов показать им, что это будет сделано, - заставить SQL Server проверять всю память. Затем скопируйте огромный файл по сети (для этого отлично подойдут большие файлы SQL Backup). Это приведет к заполнению системного кэша, и Windows начнет запрашивать у SQL память. SQL начнет возвращать память обратно в ОС, пока не достигнет минимального значения памяти.

(Извините, я не получил весь вопрос через Twitter, очевидно, понадобилось более 140 символов.)


1
Я надеюсь, что какой-то процесс, который я смогу использовать, будет запрашивать у SQL память (после того, как буферы будут очищены и удалены), но без необходимости делать это.
— Роб Фарли

Я не думаю, что есть способ заставить диспетчер памяти Windows запросить память обратно, не форсируя проблему другими способами. Вероятно, вы могли бы написать что-то, что напрямую обращается к Win32 API, но, насколько мне известно, единственный способ заставить Windows запросить память обратно - заставить ее потребовать больше памяти для другого процесса. Уточните у Боба или Пола, они могут получить больше информации.
— Мрденни

3
Это делает именно драйвер всплывающих окон VMware - он запрашивает у Windows все больше и больше памяти, чтобы заставить SQL Server (или любое другое приложение) отказаться от своей памяти.
— Брент Озар

Да, я надеялся, что мне не придется делать что-то подобное.
— Роб Фарли

@BrentOzar, баллонный драйвер VMware восстанавливает только память из системного кэша , а не фактическую память процесса; он предназначен для того, чтобы сказать ОС «не использовать всю доступную память для тривиальных вещей», а не для того, чтобы ее сломать.
— Массимо

2

Вы упоминаете «кубы», поэтому неясно, говорите ли вы о движке AS или реляционном движке. Реляционный движок может освободить память по требованию:

DBCC FREESYSTEMCACHE('<cache name>');

Где 'имя кеша' берется из sys.dm_os_memory_clerks . В спецификации DBCC FREESYSTEMCACHE упоминаются только пулы управляющих, но на самом деле гораздо больше кэшей можно удалить.

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


1
Привет Ремус, реляционный буферный кеш большой после обработки куба. После этого я действительно хочу очистить, сбросить кеш и вернуть память в Windows. DBCC DROPCLEANBUFFERS и FREESYSTEMCACHE очищают кеш, но не возвращают память в Windows, так что это не совсем то, что я хочу.
— Роб Фарли

2
Теоретически вы могли бы подделать давление памяти (например, вы могли бы батут QueryMemoryResourceNotification msdn.microsoft.com/en-us/library/aa366799%28VS.85%29.aspx ), но я действительно действительно не пошел бы туда. Если SQL не освобождает выделенную память, это потому, что ОС не нуждается в этом. Операционная система не нуждается в памяти, потому что SQL является единственным приложением на хосте ( stackoverflow.com/questions/1401834/… ), верно? Если вы запускаете какое-то другое приложение вместе с SQL, оно у вас появится.
— Ремус Русану

2

Как с двигателями AS, так и с двигателями DS вы можете ограничить память, чтобы они оставались ниже безопасного порога; это рекомендуется на 64-битных машинах с большим количеством оперативной памяти и / или несколькими экземплярами SQL. По крайней мере, для ядра базы данных, если вы измените ограничение памяти ниже текущего использования, это уменьшит объем памяти на лету без перезапуска службы, хотя и не уверен насчет SSAS.


С крышкой все в порядке, но я думаю, что я захочу вытащить максимальный объем памяти после обработки, а затем вытолкнуть ее обратно, когда я предпочитаю очистить буферы, сбросить их и попросить Windows о некотором снижении памяти.
— Роб Фарли

1

Самое простое, что я нашел, это перейти к свойствам памяти сервера, ввести меньшее значение, применить, подождать несколько минут и настроить резервную копию конфигурации.

Мы также обнаружили, что регулирование использования памяти серверами sql может фактически повысить производительность сервера, поскольку это дает Windows больше памяти для кэширования и т. Д.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.