Один из файловых серверов под управлением Windows Server 2008 R2 столкнулись с проблемой высокой загрузки оперативной памяти, что привело к проблемам с производительностью сервера и приложений. Оказалось, что память была завалена кэш системных файлов содержащая файловая система метаданные. Проблема потенциально затрагивает все файловые серверы с большим количеством файлов, к которым обращаются пользователи. Наиболее критична она для x64-версий Windows, в которых размер файла метаданных в памяти может увеличиваться почти до всего объема оперативной памяти.
Высокая загрузка оперативной памяти на файловом сервере Windows
Проблема проявляется следующим образом: в диспетчере задач мы видим, что физическая память занята на 95-99%.
В Процессы вкладке, нет ни одного просочившегося процесса с аномально высоким потреблением памяти. Более того, если вы просуммируете приблизительные значения памяти, используемой всеми процессами, то не получите и 50 % физической памяти, имеющейся на вашем сервере. Что же тогда съедает память?
Фактические данные об использовании оперативной памяти можно получить с помощью небольшой утилиты — RAMMap (автор Марк Руссинович). Скачайте архив с инструментом и запустите RAMMap.exe с правами администратора. В Использовать графы вкладка, мы видим, что Метафайл использует наибольший объем оперативной памяти. (В нашем случае он использует 11 из 25 ГБ оперативной памяти сервера).
Что такое метафайл в Windows?
Метафайл — это часть системного кэша, содержащая метаданные NTFS и используемая для повышения производительности файловой системы при доступе к файлам. Метаданные NTFS включают в себя данные MFT (Master File Table). Для каждого файла или папки, к которым обращаются пользователи, в метафайле создается соответствующий блок размером не менее 1 КБ (запись атрибута каждого файла составляет 1 КБ, а каждый файл имеет хотя бы один атрибут). Таким образом, на файловых серверах с большим количеством файлов размер метафайла (кэша NTFS) может превышать несколько десятков гигабайт.
Отключить этот кэш или управлять им с помощью встроенных средств Windows невозможно. В качестве решения можно увеличить объем памяти на сервере, но это не всегда возможно.
Чтобы освободить память, можно перезапустить сервер, но через некоторое время размер метафайла в памяти начнет невероятно расти.
Например, вы можете оценить размер MFT с помощью другого инструмента Руссиновича — ntfsinfo. В нашем случае размер MFT на диске объемом 2 ТБ составляет 13 ГБ.
Как быстро очистить метафайл
RAMMap позволяет быстро очистить используемую память от мусора MFT без перезагрузки сервера. Для этого выберите Empty -> Empty System Working Set в меню.
После этого размер метафайла в памяти уменьшился в десятки раз, а процент использования оперативной памяти процессором снизился с 95 % до 26 %.
Основным недостатком этого метода является то, что очистка производится вручную и не может быть выполнена автоматически.
Служба динамического кэша для управления файловым кэшем
Другим, более кардинальным решением проблемы высокой нагрузки на память со стороны метафайла файловой системы является установка Dynamic Кэш Сервис (http://www.microsoft.com/en-us/download/details.aspx?id=9258). Этот сервис позволяет управлять параметрами выделенного кэша MFT с помощью системных API.
Установить DynCache довольно просто (подробные инструкции есть в архиве).
- Скопируйте файл DynCache.exe на %SystemRoot%\System32 папка
- Создать DynCache сервис с помощью этой команды:
sc create DynCache binpath= %SystemRoot%\System32\DynCache.exe start= auto type= own DisplayName= "Dynamic Cache Service"
- Импорт DynCache.reg в реестр (он содержит значения по умолчанию)
- Измените значения следующих ключей реестра: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\DynCache\Parameters
- MaxSystemCacheMBytes: 4096 (dec) — максимальный размер кэша (Мб)
- MinSystemCacheMBytes: 100 (dec) — минимальный размер кэша (МБ)
Примечание. Эти и другие настройки сервиса DynCache необходимо редактировать в зависимости от объема оперативной памяти, нагрузки на сервер, требуемой производительности и т. д. Как правило, не рекомендуется устанавливать размер кэша более половины физического объема оперативной памяти, установленной на сервере. После внесения изменений перезапускать DynCache не нужно, так как все изменения применяются динамически. - Запустите службу с помощью этой команды:
sc start DynCache
В нашем случае после установки службы DynCache использование памяти метафайлом перестало превышать установленные 4 ГБ. Пользователи не сообщали о каких-либо проблемах с производительностью файлового сервера.