Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

Мне нравится предложение @Nick Kavadias: следить за Память: ошибок страницы / сек счетчик производительности, чтобы показать, что SQL не подвергает память ОС нагрузке.

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

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

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

DBCC FREESYSTEMCACHE('<cache name>');

Откуда взято "имя кеша" sys.dm_os_memory_clerks. Спецификация DBCC FREESYSTEMCACHE упоминает только пулы губернаторов, но на самом деле можно удалить гораздо больше кешей.

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

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

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

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