Mapped file занимает всю память

Очень важно без перезагрузки сервера суметь освободить оперативную память, особенно когда ее не много

Вот, как это можно сделать:

Перейду сразу к решению проблемы:

Из сайта Microsoft скачиваете утилитку RAMMap:

При запуске она покажет все процесы, даже системние, которих не увидите в диспетчере задач:

Если какой-то софт не освобождает память после себя, чтобы не перегружать из-за этого сервер, в RAMMap нужно по очереди выбрать следуюющие функции:

Empty -> Standby List
Empty -> SystemWorkingSet

И нажать F5 чтобы увидить разницу.

Вот, что получиться после этого:

Видим, что системние ресурси (Metafile, Mapped File), которие использовались системой освободили память. На скриншоте из диспетчером задач видно, что освободилось больше, чем полтора ГБ на сервере, которий и так нре был загружен под завязку.
Собственно, что и было нужно!

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.

Программа RAMMap представляет собой утилиту, которая позволяет увидеть как Windows действительно распределяет оперативную память. Благодаря программе на оперативную память компьютера можно взглянуть как не на абстрактную сущность, а действительно составить представление о том, для чего и какими файлами она используется. Работает в версиях от Windows Vista и позднее.

Наиболее интересными для рядового пользователя, наверное, окажутся лишь некоторые из вкладок. Это Use Counts и File Details. Однако для полноты понимания как программа работает, от пользователя требуется понимание работы RAM в принципе.

Теоретические абзацы

Все процессы пользовательского режима и большинство процессов от имени ядра получают доступ к данным через адреса виртуальной памяти. Эти данные и исполняемый код могут находиться как в ячейках физической памяти планок RAM, так и в файле подкачки жёсткого диска, но все они объединены одним условием – в момент запуска система приклеивает их к рабочему набору конкретного процесса, который в данный момент чем-то занимается (то есть читает, записывает и выполняет). И утилита RAMMap подходит к памяти как к общесистемному источнику памяти, который распределяется между запущенными в Windows процессами.

Интерфейс RAMMap

Окно программы представляет из себя интерфейс, напоминающий чем-то Диспетчер задач Windows NT, и включает в себя вкладки (во время работы обновляем состояние позиций клавишей F5):

  • Use counts (постраничная разбивка памяти)
  • Processes (размеры рабочих наборов памяти)
  • Priority summary (размеры памяти для процессов, ранжируемых по приоритету)
  • Physical pages (объём затрачиваемой памяти на страницу)
  • Physical Ranges (адреса физической памяти)
  • File summary (данные файлов в RAM поимённо)
  • File Details (данные памяти для конкретных физических страниц поимённо)

Посмотрим на каждую из вкладок RAMMap внимательнее.

Use counts

  • Total – (самый нижний) – общий размер RAM “полагающийся” Windows; этот размер совпадает с тем, что вы видите в Свойствах системы как размер установленной ОЗУ
  • Process Private – часть оперативной памяти, используемая исключительно отдельным процессом
  • Mapped File – нанесённые на карту памяти отпечатки файлов, сохраняемые в виртуальную её часть. Это может быть и сам процесс нанесения снимков файлов (запись или чтение) или для кэша системных файлов
  • Shareble – страницы памяти, которые могут использоваться сразу несколькими процессами
  • Page Table – содержит в себе элементы таблицы страниц, которые описывают использование виртуального адреса
  • Paged Pool – объединённая часть памяти ядра, которая может быть сохранена на диск
  • Nonpaged Pool – часть памяти ядра, которую на диск нанести нельзя и которая должна оставаться в физической памяти всегда
  • System PTE – элементы таблицы страниц позволяют наносить виртуальные адреса памяти в области физической памяти. Системные (System) элементы – это область памяти, используемая для динамической прорисовки системных страниц (диапазон адресов памяти для подключения устройств ввода-вывода, стеков ядра и прорисовки списков дескриптора памяти).
  • Session Private – часть памяти, которая видима только конкретными драйверами или устройствами в текущей сессии. Эту часть памяти забирает себе Win32k.sys или системные драйверы (мышка, клавиатура, видео).
  • Metafile – это часть системного кэша, состоящая из метаданных NTFS. Метаданные NTFS включают в себя MFT, а также другие файлы метаданных. Учитывая, что в базе MFT есть запись о каждом атрибуте, а каждый файл имеет как минимум один атрибут, и затем приплюсовать сюда остальные метаданные NTFS, можно составить представление о том, до каких размеров MFT может разрастись при большом количестве файлов в Windows.
  • AWE – часть памяти, используемая интерфейсом AWE, который позволяет программам использовать физическую память с выходом за пределы 4-Гбайт виртуального адресного пространства.
  • Driver Locked – это страницы, которые на некоторое время могут заблокированы в физической памяти определённым драйвером. Речь идёт опять же об устройствах ввода-вывода или целых логических дисках.
  • Kernel Stack – память, закреплённая за областями оперативной памяти для потоков системного ядра.
  • Unused – размер памяти, которая сейчас не используется. Она также видна в списках Zeroed, Free и Bad.
  • Large Page – память, отведённая для поддержки страниц памяти большого объёма. Такая поддержка обеспечивает более эффективный доступ для программ, требующих соответствующих запросов к установленной в Windows памяти.

Посмотрим на столбцы вкладки Use Counts

  • Total – общий размер памяти для группы страниц
  • Active – (активные страницы) размер памяти, уже использующейся или готовой для немедленного использования без опасения за то, что возможно появление ошибки. Он составляется из того набора памяти, который уже находится в рабочем наборе одного или нескольких процессов или в одном из системных рабочих наборов (системный кэш) , а также той части главной памяти (main memory), которую нельзя выделять под страницы виртуальной памяти.
  • Standby (страницы ожидания) – страницы памяти, которая сейчас не используется. Они в физической памяти “присутствуют”, но перед тем, как к ним обратятся, менеджер памяти сначала их перенаправит (вернёт в список Active, запишет в нулевую память Zeroed). По сути, это и есть кэш памяти – тот объём памяти, что хранится в RAM “на всякий пожарный”; лучше, чем выгружать всю память на диск полностью, когда она в полном объёме не требуется
  • Modified – память, перенесённая из рабочего набора страниц и изменённая вовремя работы. Схожа с предыдущими страницами, но это страницы физической памяти, которые были скорректированы и потому перед повторным использованием должны быть сначала записаны на диск
  • Modified no write – те же страницы изменённой в процессе работы памяти, но помеченные как “запрещённые к автоматической записи” на диск
  • Transition – временное состояние страницы памяти, которая заблокирована в памяти в данный момент неким драйвером
  • Zeroed – память, помеченная как пустая и готовая к перемещению. Во время загрузки величина в этом столбце примечательная, однако когда система “устаканится”, большая часть страниц отсюда перебежит куда-то в сторону Standby в виде кэша
  • Free – свободные страницы пригодны к использованию, однако содержат в себе некие остаточные данные и потому, перед тем как попасть к пользователю, должны быть помечены как нулевые (Zeroed) в целях безопасности. Обычно это та часть памяти, которая высвобождается после остановки какой-то задачи.
  • Bad – эти страницы помечены как дефектные, так как вызвали ошибки в работе оборудования.
Читайте также:  Мосналог личный кабинет налогоплательщика для физических лиц

Processes

Вкладка содержит анализ страниц физической памяти, которые ассоциируются с конкретным процессом. Здесь мы можем увидеть номер сессии процесса в текущем сеансе (Session), присвоенный процессу номер (PID). Остальные столбцы вдоль каждого процесса показывают какую часть RAM, выделяемого для этого процесса, занимают страницы пользователя или/и системы: по показаниям в этой вкладке можно судить о том, от чьего имени процесс запущен, не “кривит” ли память. Столбец Page Table показывает общее количество памяти, выделяемой ядром этому процессу. Total суммирует показания по столбцам с Private по Page Table (именно показатель Total и отображается в Windows-ском Диспетчере задач). Однако Диспетчер в окне по умолчанию суммирует всё, что запущено от имени одной службы/программы. Надо лишь развернуть характерный столбец:

Priority Summary

Вкладка отображает объёмы памяти, выделяемые/выделяемых на процессы по присвоенному системой приоритету с момента включения компьютера. Самая интересная здесь вкладка – Repurposed. Она показывает, сколько памяти было отозвано у других задач для удовлетворения нужд более приоритетных процессов с момента запуска Windows. Идеальный вариант с эффективно работающей системой – этот столбец по “нолям”. Этого достичь, однако, почти нереально. Более того, высокие числа в этом столбце с процессами в высоком приоритете (с 5-го и выше) говорят о том, что ресурсов системе либо не хватало, либо не хватает до сих пор: впору задуматься о приобретении дополнительной планки:

установленного объёма RAM явно недостаточно для выполнения некоторых задач

Physical Ranges

Следующая вкладка (чисто информационная) отображает эффективные диапазоны адресов физической памяти. Разрывы в диапазонах отображают физические адреса, закреплённые за определёнными устройствами.

File Summary

В этой вкладке отображается полный путь к файлам, отнесённым системой в память. Столбцов несколько: Total – общая сумма, Active – на данный момент, Standby – готовая примкнуть и т.д. Сюда попадает всё: от файлов загрузчика до драйверов для мыши и клавиатуры. Можно взглянуть пристальнее, проранжировав столбцы по имени, месту запуска и т.п.

File Details

Одна из самых информативных. Именно здесь можно увидеть информацию из предыдущих вкладок, но для каждого отнесённого в память системой файла. Здесь и диапазон адресов, и рабочий набор страниц и назначенный приоритет. Стоит лишь развернуть крестик слева от имени файла:

Как работать с RAMMap ?

Помимо информативной части вкладок, по которым можно судить о том, как Windows справляется с запускаемыми процессами, разнося задачи по страницам памяти, и выискивая пропажу гигабайт оперативки, в шапке RAMMap имеется кнопка действий, позволяющая принудительно “изымать” страницы памяти. Как вы понимаете, этот процесс ничего общего с принудительной остановкой какого-то процесса через Диспетчер задач не имеет. Так, нажав по кнопке Empty (Очистить) программы:

взору откроются пять основных команд очистки страниц памяти RAM, работа с которыми сейчас конкретными процессами не ведётся, и которым после очистки может быть присвоен иной статус, что, в свою очередь, позволит им включиться в работу уже в составе приложения, которому, быть может, как раз сейчас памяти и не хватает. Далее по списку вниз:

  • Empty Working Sets – очистит работающие наборы. Освобождает память в системных и пользовательских наборах (процессы ядра останутся нетронутыми – система “не упадёт”), перенося высвободившуюся память на страницы Stanby и Modified.
  • Empty System Working Set – очистит только системный кэш
  • Empty Modifed Page List – очистит память из страниц списка Modifed, записывая несохранённые данные на жёсткий диск и сразу перенесёт их на страницы Standby
  • Empty Standby List – избавится, в свою очередь, от страниц из списка Standby, добавляя в свободную память (список Free)
  • Empty Priority 0 Standby List – очистит страницы памяти из списка страниц для процессов с низким приоритетом, отправляя их в список Free.

Помните, что выполнение задач по очистке потребует загрузки процессора и переорганизации памяти, что может занять некоторое время. Обновлённые данные по результатам оптимизации можно наблюдать во всех вкладках по нажатию, напомню, клавиши F5.

RAMMap – анализ и сохранение результатов

Для работы с системой не обязательно работать с окном непосредственно до эксперимента и после. Разработчики предлагают поместить исполнительный файл программы в папку с другими системными утилитами Windows/System32 и запускайте через cmd от имени администратора:

Читайте также:  Wake up event setup что это

RAMMap фоном проверит состояние памяти и сохранит данные в файл 1.rmp в той же директории. Чтобы открыть сохранённый вами или присланный на анализ файл, можно запустить cmd с таким скриптом:

или для владельцев Windows 64-x, помогающим 32-х битным соратникам (а вот из 32-х битной версии файлы с 64-х-“битки” уже не прочитать):

Впрочем, команды чтения и записи в файл доступны из окна самой команды.

Отображаемый в память файл содержит содержимое файла в виртуальной памяти. A memory-mapped file contains the contents of a file in virtual memory. Отображение файла в области памяти позволяет приложению, содержащему несколько процессов, взаимодействовать с файлом путем чтения этой памяти и записи в нее. This mapping between a file and memory space enables an application, including multiple processes, to modify the file by reading and writing directly to the memory. Начиная с версии .NET Framework 4, вы можете использовать управляемый код для доступа к отображенным в память файлам тем же способом, что и собственные функции Windows. Описание этого механизма можно найти на странице Managing Memory-Mapped File (Управление отображенными в память файлами). Starting with the .NET Framework 4, you can use managed code to access memory-mapped files in the same way that native Windows functions access memory-mapped files, as described in Managing Memory-Mapped Files.

Есть два типа отображенных в память файлов: There are two types of memory-mapped files:

Постоянные отображенные в память файлы. Persisted memory-mapped files

В контексте отображения в память постоянными называются файлы, сопоставленные с исходным файлом на диске. Persisted files are memory-mapped files that are associated with a source file on a disk. Когда последний процесс завершит работу с таким файлом, все данные сохраняются в исходный файл на диске. When the last process has finished working with the file, the data is saved to the source file on the disk. Такие отображенные в память файлы удобны для работы с очень большими исходными файлами. These memory-mapped files are suitable for working with extremely large source files.

Непостоянные отображенные в память файлы. Non-persisted memory-mapped files

Непостоянными называются отображенные в память файлы, которые не сопоставлены с файлом на диске. Non-persisted files are memory-mapped files that are not associated with a file on a disk. Когда последний процесс закончит работу с таким файлом, данные не сохраняются, а файл удаляется при сборке мусора. When the last process has finished working with the file, the data is lost and the file is reclaimed by garbage collection. Такие файлы позволяют создать общую область памяти для межпроцессного взаимодействия (IPC). These files are suitable for creating shared memory for inter-process communications (IPC).

Процессы, представления и управление памятью Processes, Views, and Managing Memory

Отображенные в память файлы можно сделать общими для нескольких процессов. Memory-mapped files can be shared across multiple processes. Процессы могут обращаться к одному отображенному в память файлу по единому имени, которое назначается процессом, создающим этот файл. Processes can map to the same memory-mapped file by using a common name that is assigned by the process that created the file.

Для работы с отображенным в память файлом следует создать представление всего файла или его части. To work with a memory-mapped file, you must create a view of the entire memory-mapped file or a part of it. Также вы можете создать несколько представлений для одной части отображенного в память файла, фактически применяя одновременно используемую память. You can also create multiple views to the same part of the memory-mapped file, thereby creating concurrent memory. Чтобы два представления оставались согласованными, их нужно создавать из одного отображенного в память файла. For two views to remain concurrent, they have to be created from the same memory-mapped file.

Несколько представлений потребуются еще и в том случае, если размер файла превышает размер пространства логической памяти, доступной приложению для отображения в память (например, 2 ГБ на 32-разрядном компьютере). Multiple views may also be necessary if the file is greater than the size of the application’s logical memory space available for memory mapping (2 GB on a 32-bit computer).

Есть два типа представлений: представление потокового доступа и представление произвольного доступа. There are two types of views: stream access view and random access view. Представления потокового доступа удобны для последовательного доступа к файлу (чаще всего это непостоянные файлы и IPC). Use stream access views for sequential access to a file; this is recommended for non-persisted files and IPC. Представления произвольного доступа предпочтительны для работы с постоянными файлами. Random access views are preferred for working with persisted files.

Доступ к отображенным в память файлам осуществляется через диспетчер памяти операционной системы, который автоматически разделяет файл на несколько страниц и предоставляет их по мере необходимости. Memory-mapped files are accessed through the operating system’s memory manager, so the file is automatically partitioned into a number of pages and accessed as needed. Вам не придется самостоятельно осуществлять управление памятью. You do not have to handle the memory management yourself.

На следующем изображении показано, как несколько процессов могут одновременно использовать несколько перекрывающихся представлений для одного отображенного в память файла: The following illustration shows how multiple processes can have multiple and overlapping views to the same memory-mapped file at the same time.

На следующем рисунке показано несколько перекрывающихся представлений для отображенного в память файла: The following image shows multiple and overlapped views to a memory-mapped file:

Программирование с использованием отображенных в память файлов Programming with Memory-Mapped Files

В следующей таблице содержатся инструкции по использованию объектов и элементов для отображенных в память файлов. The following table provides a guide for using memory-mapped file objects and their members.

Читайте также:  Как исправить ошибку 502 плохой шлюз
Задача Task Применимые методы или свойства Methods or properties to use
Получение объекта MemoryMappedFile, который представляет постоянный файл, отображенный в память из файла на диске. To obtain a MemoryMappedFile object that represents a persisted memory-mapped file from a file on disk. Метод MemoryMappedFile.CreateFromFile. MemoryMappedFile.CreateFromFile method.
Получение объекта MemoryMappedFile, который представляет непостоянный файл, отображенный в память из файла на диске. To obtain a MemoryMappedFile object that represents a non-persisted memory-mapped file (not associated with a file on disk). Метод MemoryMappedFile.CreateNew. MemoryMappedFile.CreateNew method.

Метод MemoryMappedFile.CreateOrOpen. MemoryMappedFile.CreateOrOpen method.

Получение объекта MemoryMappedFile для уже существующего отображенного в память файла (постоянного или непостоянного). To obtain a MemoryMappedFile object of an existing memory-mapped file (either persisted or non-persisted). Метод MemoryMappedFile.OpenExisting. MemoryMappedFile.OpenExisting method. Получение объекта UnmanagedMemoryStream для представления последовательного доступа для отображенного в память файла. To obtain a UnmanagedMemoryStream object for a sequentially accessed view to the memory-mapped file. Метод MemoryMappedFile.CreateViewStream. MemoryMappedFile.CreateViewStream method. Получение объекта UnmanagedMemoryAccessor для представления произвольного доступа для отображенного в память файла. To obtain a UnmanagedMemoryAccessor object for a random access view to a memory-mapped fie. Метод MemoryMappedFile.CreateViewAccessor. MemoryMappedFile.CreateViewAccessor method. Получение объекта SafeMemoryMappedViewHandle для использования с неуправляемым кодом. To obtain a SafeMemoryMappedViewHandle object to use with unmanaged code. Свойство MemoryMappedFile.SafeMemoryMappedFileHandle. MemoryMappedFile.SafeMemoryMappedFileHandle property.

Свойство MemoryMappedViewStream.SafeMemoryMappedViewHandle. MemoryMappedViewStream.SafeMemoryMappedViewHandle property.

Задержка распределения памяти до момента, когда будет создано представление (только для непостоянных файлов). To delay allocating memory until a view is created (non-persisted files only).

(Чтобы определить текущий размер системной страницы, используйте свойство Environment.SystemPageSize.) (To determine the current system page size, use the Environment.SystemPageSize property.)

Метод CreateNew со значением MemoryMappedFileOptions.DelayAllocatePages. CreateNew method with the MemoryMappedFileOptions.DelayAllocatePages value.

Методы CreateOrOpen, которые принимают в качестве параметра перечисление MemoryMappedFileOptions. CreateOrOpen methods that have a MemoryMappedFileOptions enumeration as a parameter.

Безопасность Security

При создании отображенного в память файла вы можете применить к нему права доступа. Для этого используйте следующие методы, которые принимают в качестве параметра перечисление MemoryMappedFileAccess: You can apply access rights when you create a memory-mapped file, by using the following methods that take a MemoryMappedFileAccess enumeration as a parameter:

Вы можете указать права доступа для открытия существующего отображенного в память файла, используя методы OpenExisting, которые принимают MemoryMappedFileRights в качестве параметра. You can specify access rights for opening an existing memory-mapped file by using the OpenExisting methods that take an MemoryMappedFileRights as a parameter.

Кроме того, можно включить объект MemoryMappedFileSecurity с предварительно определенными правилами доступа. In addition, you can include a MemoryMappedFileSecurity object that contains predefined access rules.

Чтобы применить к отображенному в память файлу новые или измененные правила доступа, используйте метод SetAccessControl. To apply new or changed access rules to a memory-mapped file, use the SetAccessControl method. Чтобы получить доступ или проверить правила для существующего файла, используйте метод GetAccessControl. To retrieve access or audit rules from an existing file, use the GetAccessControl method.

Примеры Examples

Постоянные отображенные в память файлы Persisted Memory-Mapped Files

Метод CreateFromFile позволяет создать отображенный в память файл из существующего файла на диске. The CreateFromFile methods create a memory-mapped file from an existing file on disk.

В следующем примере создается отображенное в память представление для части очень большого файла, с которым выполняются определенные действия: The following example creates a memory-mapped view of a part of an extremely large file and manipulates a portion of it.

В следующем примере тот же отображенный в память файл открывается для другого процесса: The following example opens the same memory-mapped file for another process.

Непостоянные отображенные в память файлы Non-Persisted Memory-Mapped Files

Методы CreateNew и CreateOrOpen позволяют создать отображенный в память файл, который не сопоставлен ни с каким файлом на диске. The CreateNew and CreateOrOpen methods create a memory-mapped file that is not mapped to an existing file on disk.

Приведенный ниже пример состоит из трех отдельных процессов (консольных приложений), при которых логические значения записываются в отображенный в память файл. The following example consists of three separate processes (console applications) that write Boolean values to a memory-mapped file. Последовательность действий следующая: The following sequence of actions occur:

Process A — создается отображенный в память файл и в него записывается значение. Process A creates the memory-mapped file and writes a value to it.

Process B — открывается отображенный в память файл и в него записывается значение. Process B opens the memory-mapped file and writes a value to it.

Process C — открывается отображенный в память файл и в него записывается значение. Process C opens the memory-mapped file and writes a value to it.

Process A — из отображенного в память файла считываются значения, затем значения отображаются. Process A reads and displays the values from the memory-mapped file.

Когда в Process A завершается работа с отображенным в память файлом, он немедленно уничтожается при сборке мусора. After Process A is finished with the memory-mapped file, the file is immediately reclaimed by garbage collection.

Чтобы выполнить этот пример, сделайте следующее: To run this example, do the following:

Скомпилируйте приложение и откройте три окна командной строки. Compile the applications and open three Command Prompt windows.

В первом окне командной строки выполните команду Process A . In the first Command Prompt window, run Process A .

Во втором окне командной строки выполните команду Process B . In the second Command Prompt window, run Process B .

Вернитесь к Process A и нажмите клавишу ВВОД. Return to Process A and press ENTER.

В третьем окне командной строки выполните команду Process C . In the third Command Prompt window, run Process C .

Вернитесь к Process A и нажмите клавишу ВВОД. Return to Process A and press ENTER.

Выходные данные Process A выглядят следующим образом: The output of Process A is as follows:

Process A Process A

Process B Process B

Process C Process C