- Проблема высокой загрузки памяти системным файловым кэшем на Windows Server 2008 R2
- Высокая загрузка оперативной памяти на файловом сервере Windows
- Что такое метафайл в Windows?
- Быстрая очистка метафайла MFT в памяти
- Служба Dynamic Cache Service для управления файловым кэшем
- Устранение проблем с производительностью кэша и диспетчера памяти Troubleshoot Cache and Memory Manager Performance Issues
- Счетчики для мониторинга Counters to monitor
- Системный кэш файлов содержит структуры данных метафайлов NTFS System file cache contains NTFS metafile data structures
- Системный кэш файлов содержит файлы, сопоставленные с памятью System file cache contains memory mapped files
- Улучшения кэша и диспетчера памяти Cache and Memory Manager Improvements
- Улучшения диспетчера кэша в Windows Server 2016 Cache Manager improvements in Windows Server 2016
- Улучшения диспетчера кэша в Windows Server 2012 Cache Manager improvements in Windows Server 2012
- Улучшения диспетчера памяти в Windows Server 2012 Memory Manager improvements in Windows Server 2012
Проблема высокой загрузки памяти системным файловым кэшем на Windows Server 2008 R2
На одном из файловых серверов под управлением Windows Server 2008 R2 обнаружилась проблема с высокой загрузки оперативной памяти (RAM), выливающаяся в проблемы с производительностью сервера и запущенных на нем служб. Как оказалось, память забивалась системным файловым кэшем с метаданными файловой системы. Проблеме потенциально подвержены все файловые сервера с большим количеством файлов, к которым обращаются пользователя. Наиболее критична проблема для 64 битных версий Windows, на которых размер метафайла в памяти может занять практически всю емкость установленной оперативной памяти. В статье разберемся как проявляется проблема, выявим ее источники и способы решения.
Высокая загрузка оперативной памяти на файловом сервере 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 довольно простая (подробные инструкции есть в архиве с программой).
- Копируем файл в 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, использование памяти метафайлом перестало превышать заданного нами значения 4 Гб. Пользователи каких-либо проблем с ухудшением производительности файлового сервера не выявили.
Устранение проблем с производительностью кэша и диспетчера памяти Troubleshoot Cache and Memory Manager Performance Issues
До выхода Windows Server 2012 две основные потенциальные проблемы приводят к увеличению размера кэша системных файлов до тех пор, пока объем доступной памяти не будет почти исчерпан при определенных рабочих нагрузках. Before Windows Server 2012, two primary potential issues caused system file cache to grow until available memory was almost depleted under certain workloads. Если эта ситуация приводит к медленной работе системы, можно определить, является ли сервер одной из этих проблем. When this situation results in the system being sluggish, you can determine whether the server is facing one of these issues.
Счетчики для мониторинга Counters to monitor
\Время существования долгосрочного резервного кэша памяти (в байтах), Memory\Long-Term Average Standby Cache Lifetime (s)
\Нехватка доступной памяти, МБ Memory\Available Mbytes is low
\Резидентные байты в системном кэше памяти Memory\System Cache Resident Bytes
Если объем \ доступной памяти (в МБ) слишком мал и в течение одного \ байта память, резидентная в кэш, занимает значительную часть физической памяти, можно использовать раммап , чтобы узнать, для чего используется кэш. If Memory\Available Mbytes is low and at the same time Memory\System Cache Resident Bytes is consuming significant part of the physical memory, you can use RAMMAP to find out what the cache is being used for.
Системный кэш файлов содержит структуры данных метафайлов NTFS System file cache contains NTFS metafile data structures
Эта проблема обозначается очень большим числом активных страниц метафайлов в выходных данных РАММАП, как показано на следующем рисунке. This problem is indicated by a very high number of active Metafile pages in RAMMAP output, as shown in the following figure. Эта проблема могла быть замечена на занятых серверах, к которым обращаются миллионы файлов, что приводит к кэшированию данных метафайлов NTFS, которые не освобождаются из кэша. This problem might have been observed on busy servers with millions of files being accessed, thereby resulting in caching NTFS metafile data not being released from the cache.
Проблема, используемая для устранения проблемы с помощью средства динкаче . The problem used to be mitigated by DynCache tool. В Windows Server 2012 + архитектура была переработана, и эта проблема больше не должна существовать. In Windows Server 2012+, the architecture has been redesigned and this problem should no longer exist.
Системный кэш файлов содержит файлы, сопоставленные с памятью System file cache contains memory mapped files
Эта проблема обозначается очень большим числом активных страниц, сопоставленных с файлами, в выходных данных РАММАП. This problem is indicated by very high number of active Mapped file pages in RAMMAP output. Обычно это означает, что какое-либо приложение на сервере открывает много больших файлов с помощью API-интерфейса CreateFile с _FLAG_RANDOM_ACCESS. This usually indicates that some application on the server is opening a lot of large files using CreateFile API with FILE_FLAG_RANDOM_ACCESS flag set.
Эта проблема подробно описана в статье базы знаний 2549369. This issue is described in detail in KB article 2549369. _ _ Флаг случайного _ доступа к файлу — это указание для диспетчера кэша, которое сохраняет сопоставленные представления файла в памяти (до тех пор, пока диспетчер памяти не сообщит о нехватке памяти). FILE_FLAG_RANDOM_ACCESS flag is a hint for Cache Manager to keep mapped views of the file in memory as long as possible (until Memory Manager doesn’t signal low memory condition). В то же время этот флаг указывает диспетчеру кэша, что необходимо отключить предзагрузку файловых данных. At the same time, this flag instructs Cache Manager to disable prefetching of file data.
Эта ситуация была устранена в некоторой степени за счет улучшения работы с обрезками в Windows Server 2012 +, но сама по себе проблема должна быть решена поставщиком приложения без использования _ флага файла с _ произвольным _ доступом. This situation has been mitigated to some extent by working set trimming improvements in Windows Server 2012+, but the issue itself needs to be primarily addressed by the application vendor by not using FILE_FLAG_RANDOM_ACCESS. Альтернативным решением для поставщика приложения может быть использование приоритета нехватки памяти при доступе к файлам. An alternative solution for the app vendor might be to use low memory priority when accessing the files. Это можно сделать с помощью API сетсреадинформатион . This can be achieved using the SetThreadInformation API. Страницы, доступ к которым осуществляется с низким приоритетом памяти, более агрессивно удаляются из рабочего набора. Pages that are accessed at low memory priority are removed from the working set more aggressively.
Диспетчер кэша, начиная с версии Windows Server 2016, в дальнейшем устраняет эту возможность, игнорируя FILE_FLAG_RANDOM_ACCESS при выполнении обрезки, поэтому она обрабатывается так же, как и любой другой файл, Открытый без флага FILE_FLAG_RANDOM_ACCESS (диспетчер кэша по-прежнему учитывает этот флаг для отключения предварительной выборки данных файлов). Cache Manager, starting in Windows Server 2016 further mitigates this by ignoring FILE_FLAG_RANDOM_ACCESS when making trimming decisions, so it is treated just like any other file opened without the FILE_FLAG_RANDOM_ACCESS flag (Cache Manager still honors this flag to disable prefetching of file data). При наличии большого числа открытых файлов с этим флагом и доступе к ним по-настоящему случайным образом можно вызвать чрезмерное количество системных кэшей. You can still cause system cache bloat if you have large number of files opened with this flag and accessed in truly random fashion. Настоятельно рекомендуется FILE_FLAG_RANDOM_ACCESS не использовать приложения. It is highly recommended that FILE_FLAG_RANDOM_ACCESS not be used by applications.
Улучшения кэша и диспетчера памяти Cache and Memory Manager Improvements
В этом разделе описаны улучшения диспетчера кэша и диспетчера памяти в Windows Server 2012 и 2016. This topic describes Cache Manager and Memory Manager improvements in Windows Server 2012 and 2016.
Улучшения диспетчера кэша в Windows Server 2016 Cache Manager improvements in Windows Server 2016
Кроме того, диспетчер кэша добавил поддержку для истинных асинхронных операций чтения с кэшированием. Cache Manager also added support for true Asynchronous Cached Reads. Это потенциально может повысить производительность приложения, если оно сильно зависит от асинхронных операций чтения с кэшированием. This could potentially improve the performance of an application if it relies heavily on asynchronous cached reads. Хотя большинство встроенных файловых систем поддерживали асинхронные операции чтения в течение определенного времени, часто возникали ограничения производительности из-за различных вариантов проектирования, связанных с обработкой внутренних рабочих очередей пулов потоков и FileSystem. While most in-box filesystems have supported async-cached reads for a while, there were often performance limitations due to various design choices related to handling of thread-pools and filesystems’ internal work queues. Благодаря поддержке от ядра диспетчер кэша теперь скрывает все сложности управления пулом потоков и рабочих очередей из файловой системы, что делает его более эффективным при обработке асинхронных операций чтения с кэшированием. Диспетчер кэша имеет один набор структур данных управления для каждого из уровней вложенности виртуального жесткого диска (поддерживаемый системой) для максимального параллелизма. With support from kernel-proper, Cache Manager now hides all the thread-pool and work queue management complexities from filesystems making it more efficient at handling asynchronous cached reads.Cache Manager has one set of control datastructures for each of (system supported maximum) VHD-nesting levels to maximize parallelism.
Улучшения диспетчера кэша в Windows Server 2012 Cache Manager improvements in Windows Server 2012
В дополнение к усовершенствованиям диспетчера кэша для последовательной работы для последовательных рабочих нагрузок был добавлен новый API кксетреадахеадгрануларитекс , позволяющий драйверам файловой системы, таким как SMB, изменять параметры упреждающего чтения. In addition to Cache Manager enhancements to read ahead logic for sequential workloads, a new API CcSetReadAheadGranularityEx was added to let file system drivers, such as SMB, change their read ahead parameters. Это позволяет повысить пропускную способность для сценариев с удаленными файлами, отправляя несколько небольших запросов чтения с небольшим размером вместо отправки одного большого запроса на чтение вперед. It allows better throughput for remote file scenarios by sending multiple small-sized read ahead requests instead of sending a single large read ahead request. Программно настраивать эти значения для каждого файла могут только компоненты ядра, такие как драйверы файловой системы. Only kernel components, such as file system drivers, can programmatically configure these values on a per-file basis.
Улучшения диспетчера памяти в Windows Server 2012 Memory Manager improvements in Windows Server 2012
Включение объединения страниц может сократить использование памяти на серверах, имеющих большое количество частных страниц с одинаковым содержимым. Enabling page combining may reduce memory usage on servers which have a lot of private, pageable pages with identical contents. Например, серверы, на которых работает несколько экземпляров одного приложения, интенсивно использующего память, или одно приложение, которое работает с очень повторяющимися данными, могут быть хорошим кандидатом на попытку объединения страниц. For example, servers running multiple instances of the same memory-intensive app, or a single app that works with highly repetitive data, might be good candidates to try page combining. Недостаток функции объединения страниц повышает загрузку ЦП. The downside of enabling page combining is increased CPU usage.
Ниже приведены некоторые примеры ролей сервера, в которых объединение страниц вряд ли дает много преимуществ: Here are some examples of server roles where page combining is unlikely to give much benefit:
Файловые серверы (большая часть памяти потребляется страницами файлов, которые не являются частными и, следовательно, некомбинированными) File servers (most of the memory is consumed by file pages which are not private and therefore not combinable)
Серверы Microsoft SQL Server, настроенные для использования AWE или больших страниц (большая часть памяти является закрытой, но не подстраничной). Microsoft SQL Servers that are configured to use AWE or large pages (most of the memory is private but non-pageable)
Объединение страниц отключено по умолчанию, но его можно включить с помощью командлета Windows PowerShell Enable-сценарии mmagent . Page combining is disabled by default but can be enabled by using the Enable-MMAgent Windows PowerShell cmdlet. Объединение страниц было добавлено в Windows Server 2012. Page combining was added in Windows Server 2012.