Проблема высокой загрузки памяти системным файловым кэшем на Windows Server 2008 R2

На одном из файловых серверов под управлением Windows Server 2008 R2 обнаружилась проблема с высокой загрузки оперативной памяти (RAM), выливающаяся в проблемы с производительностью сервера и запущенных на нем служб. Как оказалось, память забивалась системным файловым кэшем с метаданными файловой системы . Проблеме потенциально подвержены все файловые сервера с большим количеством файлов, к которым обращаются пользователя. Наиболее критична проблема для 64 битных версий Windows, на которых размер метафайла в памяти может занять практически всю емкость установленной оперативной памяти. В статье разберемся как проявляется проблема, выявим ее источники и способы решения.

Высокая загрузка оперативной памяти на файловом сервере Windows

Проблема проявляется следующим образом: в диспетчере задач (Task Manager) видим, что на сервере оперативная память занята на 95-99 %.

Высокая загрузка памяти на файловом сервере Windows Server 2008 R2 Перейдя на вкладку процессов, не удастся найти какой-то утекший процесс с аномально высоким потреблением памяти. Кроме того, если навскидку сложить память, занятую всеми процессами, отображаемыми в диспетчере задач, даже близко не удается приблизиться к 50% физической памяти, установленной на сервере. Так кто же съел всю память?

Потребление памяти процессами Реальный расклад по использованию оперативной памяти может дать утилита RAMMap (Марка Руссиновича). Качаем архив с утилитой и запускаем из архива файл RAMMap.exe с правами администратора. На вкладке Use Counts , видим, что больше всего физической памяти использует объектом Metafile (в нашем случае на него приходится 11 из 25 Гб оперативной памяти сервера).

Утилита rammap - метафайл в памяти (metafile)

Что такое метафайл в Windows?

Метафайл (Metafile) — это часть системного кэша, который содержит метаданные файловой системы NTFS и используется для увеличения быстродействия файловой системы при доступе к файлам. Метаданные NTFS включают в себя данные таблицы MFT (Master File Table). Для каждого файла/папки, к которому обращались пользователи, в метафайле создается соответствующий блок, размером как минимум 1 Кб (запись об атрибуте каждого файла занимает 1кб, и каждый файл имеет как минимум один атрибут). Таким образом, на файловых серверах с большим количеством файлов, к которым идут постоянные обращения, размер системного кэша NTFS (метафайла) может достигать нескольких гигабайт.

Отключить этот кэш или управлять им с помощью стандартных средств Windows не получится. Как решение, можно увеличить количество памяти на сервере, но реализуемо это далеко не всегда.

Если перезагрузить сервер, память используемая метафайлом освобождается, но со временем размер метафайла в памяти все равно начинает неконтролируемо расти.

К примеру, оценить размер MFT таблицы можно с помощью еще одной утилиты Руссиновича – ntfsinfo . К примеру, в нашем примере для 2 Тб диска размер MFT таблицы составляет 13 Гб.

ntfsinfo

Быстрая очистка метафайла MFT в памяти

Утилита RAMMap предоставляет возможность быстрой очистки используемой памяти от мусора без необходимости перезагрузки сервера. Для этого нужно в меню выбрать раздел Empty -> Empty System Working Set . RAMMAP Empty System Working Set После этой операции размер памяти под metafile уменьшился в десятки раз, а процент использования RAM сервером упал с 95% до 26%.

Использование памяти уменшилось за счет очистки метафайла ntfs Основной недостаток такого метода – процесс очистки ручной и никак не автоматизируется.

Служба Dynamic Cache Service для управления файловым кэшем

Другим, более кардинальным, решением проблемы высокой загрузки оперативной памяти метафайлом файловой системы является установка службы Dynamic Cache Service ( http://www.microsoft.com/en-us/download/details.aspx?id=9258 ). Данная служба через системные API позволяет управлять параметрами выделяемого кэша.

Важно . Используйте данное решение, только при наличии описанных выше проблем. Установка данного сервиса не будет универсальным решением для других причин исчерпания памяти на серверах.

Установка DynCache довольно простая (подробные инструкции есть в архиве с программой).

  1. Копируем файл в DynCache.exe в каталог %SystemRoot%System32
  2. Создадим службу DynCache командой sc create DynCache binpath= %SystemRoot%System32DynCache.exe start= auto type= own DisplayName= "Dynamic Cache Service" Установка службы DynCache в Windows Server 2008 R2
  3. Импортируем файл DynCache.reg в реестр (содержит дефолтные значения)
  4. Изменим значения следующих ключей реестра HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesDynCacheParameters
    • MaxSystemCacheMBytes : 4096 (dec) – максимальный размер кэша
    • MinSystemCacheMBytes : 100 (dec) – минимальный размер

    Параметры DynCache в реестре

    Примечание . Эти и другие параметры службы DynCache нужно отрегулировать в соответствии с количеством установленной памяти и нагрузкой на сервер, требуемой производительности и т.д. Как правило, не стоит задавать размер кэша больше, чем половина установленной на сервере RAM. После внесения изменения службу DynCache перезапускать не нужно, т.к. изменения отслеживаются динамически.
  5. Запустим службу командой sc start DynCache
Примечание . Если понадобится удалить службу, воспользуйтесь инструкцией .

В нашем случае, после установки службы DynCache, использование памяти метафайлом перестало превышать заданного нами значения 4 Гб. Пользователи каких-либо проблем с ухудшением производительности файлового сервера не выявили.

EnglishRussianUkrainian