Как заставить 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 символов.)

mrdenny
источник
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 больше памяти для кэширования и т. Д.

Ник ван Эш
источник