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

Как быстро SQL Server освободит оперативную память, если ОС сигнализирует о нехватке памяти?

Из электронной документации по SQL Server 2008 R2:

Параметры памяти сервера

Когда SQL Server динамически использует память, он периодически опрашивает систему, чтобы определить объем свободной физической памяти. SQL Server использует API уведомления о памяти QueryMemoryResourceNotification чтобы определить, когда буферный пул может выделять память и освобождать память.

Из электронной документации по SQL Server 2005/2008:

Параметры памяти сервера

Когда SQL Server динамически использует память, он периодически опрашивает систему, чтобы определить объем свободной физической памяти. В Microsoft Windows 2000 SQL Server увеличивает или уменьшает буферный кеш, чтобы оставить свободную физическую память от 4 до 10 МБ в зависимости от активности сервера. Сохранение этой свободной памяти предотвращает подкачку Windows 2000. Если свободной памяти меньше, SQL Server освобождает память для Windows 2000.

В Windows Server 2003 SQL Server использует API уведомления о памяти. QueryMemoryResourceNotification чтобы определить, когда буферный пул может выделять память и освобождать память.

Я понимаю, что SQL Server управляет собственным использованием памяти. Если на сервере не хватает свободной памяти, SQL Server освобождает часть памяти (истощая себя). Это идеальное и предпочтительное поведение по умолчанию. Но я видел много ситуаций, когда SQL Server не освобождает память, когда являются другие "голодные" приложения (т.е. страдающие от большого количества сбоев подкачки).

Затем я нашел упоминание, что это может занять дней чтобы SQL Server фактически освободил память:

Профессиональное администрирование Microsoft SQL Server 2008, использование памяти

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

Это звучит правильно? SQL Server - это серверное приложение с хорошим поведением, которое выйдет из строя за дней?

Есть ли возможность (помимо установки верхнего предела использования памяти SQL Server) увеличить скорость, с которой SQL освобождает память?

Сначала разберитесь, как работает память Windows (см. Как узнать, что мой сервер Windows меняет местами?).

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

Это не займет «дней», потребуется несколько дней для SQL страдать; не другое приложение. Это другое приложение, которому потребуются часы, чтобы получить достаточно свободных страниц в памяти для работы с приемлемой скоростью (при условии запроса большой страницы памяти).

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

Мне очень нравится цитата о том, что SQL Server "хорошо себя ведет". На самом деле он ведет себя хорошо; это займет целую вечность (условно говоря).

SQL Server использует два типа памяти, которую можно освободить:

  • страницы данных (буферный пул)
  • тайники

Пока сигнализируется ситуация нехватки памяти, оба будут агрессивно обрезаны.

В тайники описаны в Вопросы и ответы: стрелки часов - для чего они нужны?
В буферный пул механизм описан в Управление буфером

  • Кеши можно обрезать, пока они не используются.
  • Чистые страницы пула буферов могут быть немедленно обрезаны (грязные страницы необходимо сначала сбросить на диск)

В общем, SQL Server может освободить всю память, которая может быть освобождена немедленно (чистые страницы, незакрепленные кеши) за считанные секунды. Грязные страницы могут быть освобождены, как только завершится очистка ввода-вывода. Я понятия не имею, откуда взялась идея «на это нужны дни» ...