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

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

зміст:

  • Високе завантаження оперативної пам'яті на файловому сервері Windows
  • Що таке метафайл в Windows?
  • Швидке очищення метафайлу MFT в пам'яті
  • Служба Dynamic Cache Service для управління файловим кешем

Високе завантаження оперативної пам'яті на файловому сервері Windows

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

Перейшовши на вкладку процесів, не вдасться знайти якийсь витекли процес з аномально високим споживанням пам'яті. Крім того, якщо навскидку скласти пам'ять, зайняту усіма процесами, відображеними в диспетчері завдань, навіть близько не вдається наблизитися до 50% фізичної пам'яті, встановленої на сервері. Так хто ж з'їв всю пам'ять?

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

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

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

Відключити цей кеш або керувати ним за допомогою стандартних засобів Windows не вийде. Як рішення, можна збільшити кількість пам'яті на сервері, але піддається реалізації це далеко не завжди.

Якщо перезавантажити сервер, пам'ять використовувана метафайли звільняється, але з часом розмір метафайлу в пам'яті все одно починає неконтрольовано зростати.

Наприклад, оцінити розмір MFT таблиці можна за допомогою ще однієї утиліти Руссиновича - ntfsinfo. Наприклад, в нашому прикладі для 2 Тб диска розмір MFT таблиці складає 13 Гб.

Швидке очищення метафайлу MFT в пам'яті

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

Основний недолік такого методу - процес очищення ручної і ніяк не автоматизується.

Служба 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% \ System32 \ DynCache.exe start = auto type = own DisplayName = "Dynamic Cache Service"
  3. імпортуємо файл DynCache.reg до реєстру (містить дефолтні значення)
  4. Змінимо значення наступних ключів реєстру HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ DynCache \ Parameters
    • MaxSystemCacheMBytes: 4096 (dec) - максимальний розмір кешу
    • MinSystemCacheMBytes: 100 (dec) - мінімальний розмір

    Примітка. Ці та інші параметри служби DynCache потрібно відрегулювати відповідно до кількості встановленої пам'яті і навантаженням на сервер, необхідної продуктивності і т.д. Як правило, не варто ставити розмір кешу більше, ніж половина встановленої на сервері RAM. Після внесення зміни службу DynCache перезапускати не потрібно, тому що зміни відслідковуються динамічно.
  5. Запустимо службу командою sc start DynCache
Примітка. Якщо знадобиться видалити службу, скористайтеся інструкцією.

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