Память частный рабочий набор что это
Перейти к содержимому

Память частный рабочий набор что это

  • автор:

Рабочий набор

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

Если процесс ссылается на страницу памяти, которая в настоящее время не входит в рабочий набор, происходит ошибка страницы . Обработчик ошибки системной страницы пытается устранить ошибку страницы, и в случае успеха страница добавляется в рабочий набор. (Доступ к AWE или выделению больших страниц никогда не приводит к ошибке страницы, так как эти выделения не являются страничными.)

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

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

Страницы можно удалить из рабочего набора процесса в результате следующих действий:

  • Процесс уменьшает или очищает рабочий набор, вызывая функцию SetProcessWorkingSetSize, SetProcessWorkingSetSizeEx или EmptyWorkingSet .
  • Процесс вызывает функцию VirtualUnlock в не заблокированном диапазоне памяти.
  • Процесс отменяет сопоставление сопоставленного представления файла с помощью функции UnmapViewOfFile .
  • Диспетчер памяти обрезает страницы из рабочего набора, чтобы создать больше доступной памяти.
  • Диспетчер памяти должен удалить страницу из рабочего набора, чтобы освободить место для новой страницы (например, потому, что рабочий набор имеет максимальный размер).

Если несколько процессов совместно используют страницу, удаление страницы из рабочего набора одного процесса не влияет на другие процессы. После удаления страницы из рабочих наборов всех процессов, которые ее использовали, страница становится страницей перехода. Страницы перехода остаются кэшируемыми в ОЗУ, пока на страницу не будет повторно ссылаться какой-либо процесс или не будет перепрофилирована (например, заполнены нулями и передана другому процессу). Если страница перехода была изменена с момента последней записи на диск (т. е. если страница имеет значение «грязное»), то перед перепрофилированием страницу необходимо записать в ее резервное хранилище. Система может начать писать грязное переходных страниц в их резервное хранилище, как только такие страницы станут доступными.

Каждый процесс имеет минимальный и максимальный размер рабочего набора, который влияет на поведение процесса подкачки виртуальной памяти. Чтобы получить текущий размер рабочего набора указанного процесса, используйте функцию GetProcessMemoryInfo . Чтобы получить или изменить минимальный и максимальный размер рабочего набора, используйте функции GetProcessWorkingSetSizeEx и SetProcessWorkingSetSizeEx .

Интерфейс PSAPI для состояния процесса предоставляет ряд функций, возвращающих подробные сведения о рабочем наборе процесса. Дополнительные сведения см. в разделе Сведения о рабочем наборе.

Рабочий набор процессов

Рабочий набор программы — это коллекция этих страниц в виртуальном адресном пространстве, на которые недавно ссылались. Он включает как общие, так и частные данные. Общие данные включают страницы, содержащие все инструкции, выполняемые приложением, в том числе в библиотеках DLL и системных библиотеках DLL. По мере увеличения размера рабочего набора потребность в памяти увеличивается.

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

Чтобы получить запрошенные минимальные и максимальные размеры рабочего набора для приложения, вызовите функцию GetProcessWorkingSetSize .

Система задает размеры рабочих наборов по умолчанию. Можно также изменить размеры рабочих наборов с помощью функции SetProcessWorkingSetSize . Установка этих значений не гарантирует, что память будет зарезервирована или резидентна. Будьте внимательны при запросе слишком большого размера минимального или максимального рабочего набора, так как это может снизить производительность системы.

Чтобы получить текущий или пиковый размер рабочего набора для процесса, используйте функцию GetProcessMemoryInfo .

Sysadminium

Изучая память процессов в системе Windows вы обязательно столкнётесь с таким понятием как рабочий набор процесса. В этой статье разберём что это такое.

Оглавление скрыть

Рабочий набор

Рабочий набор — это виртуальные страницы памяти в которых процесс хранит необходимые ему данные.

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

А если свободная память (free) окажется ниже порогового значения, то страницы изымаются из рабочих наборов. Такие страницы могут быть помещены с кэш. То есть они все равно останутся в оперативной памяти. При обращении к таким страницам, процесс получит ошибку page fault и страница вернется из кэша.

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

Наблюдение за рабочим набором процесса

Наблюдать за рабочим набором процесса будем с помощью «Системного монитора«.

  1. Находим оснастку «Системный монитор«:

Пуск / Системный монитор

  1. Удаляем счетчик производительности, который был по умолчанию:

Системный монитор / Удаление счетчиков

  1. И добавляем новый счетчик производительности:
    • Находим группу счетчиков «Процесс«, в ней находим процесс (я посмотрю за процессом Chrome).
    • Выбираем счетчики: «Ошибок страниц/с«, «Рабочий набор» и его пик.
    • Нажимаем кнопку «Добавить» и «OK«

Системный монитор / Добавление счетчиков

  1. Переключаем внешний вид на «Отчет».

Системный монитор / Настройка внешнего вида

  1. Смотрим данные:
    • Рабочий набор — это объем страниц в памяти для данного процесса в байтах.
    • Рабочий набор (пик) — это максимальный объем страниц, который был в памяти для данного процесса за все время работы процесса.
    • Ошибок страницы/с — это частота ошибок, когда поток не находит нужную страницу в памяти и её необходимо подгружать.

Системный монитор / Просмотр информации

Сумма рабочих процессов не равна используемой памяти

Суммарный объем всех рабочих наборов процессов не равен всей используемой оперативной памяти. Если помните, в системе присутствует общая память. Страницы от туда могут быть замаплены к разным процессам. Про это было написано тут. А каждый процесс думает что эта страница относится к его рабочему набору. Другими словами, одна общая страница будет считаться несколько раз для каждого процесса.

Не доверяйте информации о памяти в Диспетчере задач

За много лет использования Windows я привык к Диспетчеру задач. Оттуда я убил сотни приложений за плохое поведение. Там же смотрел, кто из них пожирает ресурсы. Пока я не начал работать с машинами, у которых сотни гигабайт памяти, а у приложений соответствующие запросы. В этой статье обсудим, почему Диспетчер задач плохо отслеживает память и что использовать взамен. Во-первых, о механизме выделения памяти в Windows.

tl;dr: Диспетчер задач скрывает информацию о подкачке (paged memory) и виртуальном пространстве процесса. Лучше используйте Process Explorer из комплекта Sysinternals.

Выделение памяти в Windows

При запуске нового процесса ОС присваивает этому процессу непрерывное адресное пространство. В 32-разрядных системах это пространство может составить 4 ГБ, обычно 2 ГБ для ядра, а остальное для процесса. В этой статье проигнорируем использование памяти ядром. В 64-разрядных системах зарезервированная процессом память может вырасти до колоссальных 64 ТБ. Что этот процесс будет делать с несколькими терабайтами памяти, когда у нас на самом деле жалкие 8 ГБ? Сначала нужно понять, что такое зарезервированная и переданная память.

Зарезервированная и переданная память

Не все части этого огромного адресного пространства равны. Некоторые части адресного пространства процесса фактически поддерживаются либо физической оперативной памятью, либо диском (см. ниже). Зарезервированная память считается переданной (Committed), если ОС предлагает вам эту память при попытке её использовать. Остальная часть адресного пространства, а это подавляющее большинство, остаётся доступным для резервирования. То есть не всегда ОС может предложить вам этот блок памяти для использования: она может сделать копию на диске (файл подкачки), например, а может и не сделать. В C++ резервирование памяти осуществляется вызовом VirtualAlloc. Так что переданная память является аппаратно ограниченным ресурсом в ОС. Давайте посмотрим.

Файл подкачки ОС

Файл подкачки — замечательная идея. В принципе, ОС понимает, что некоторые части памяти особо не используются вашим приложением. Зачем тратить на него реальную физическую память? Вместо этого процесс в ядре записывает этот неиспользуемый фрагмент на диск. Пока к нему не обратятся снова, только тогда он вернётся в память.

Для более подробного объяснения, как работает память в Windows, рекомендую лекцию «Тайны управления памятью» Марка Руссиновича.

Отслеживание памяти

Здесь много за чем нужно следить и анализировать. К кому обратиться? Конечно, к Диспетчеру задач!

Память в RAM обычно называют рабочим набором (Working Set), в то время как всю выделенную память обычно именуют Private Bytes. Библиотеки DLL вносят путаницу в определения, поэтому пока их проигнорируем. Иначе говоря:

Private Bytes [выделенная память] = рабочий набор + файл подкачки

По умолчанию Диспетчер задач показывает для любого процесса именно рабочий набор:

И это число, на которое я всё время смотрел. Откуда я знал, что в Диспетчере задач информация о переданной памяти находится в колонке Commit Size . Я так и не смог там найти информацию о виртуальной памяти.

Диспетчер задач позволяет добавить информацию о переданной памяти, если щёлкнуть правой кнопкой мыши по столбцам и выбрать соответствующий пункт

Эффективные метрики памяти

К счастью, есть много других ресурсов для отслеживания ресурсов. На каждой машине под Windows установлен PerfMon (Системный монитор), который выдаёт очень подробную информацию о каждом процессе и системе в целом:

Интересно, что Системный монитор умеет фактически исследовать и сравнивать метрики на двух или более компьютерах в сети. Это очень мощный инструмент, но Диспетчер задач, очевидно, удобнее для пользователей. В качестве промежуточного решения рекомендую Process Explorer:

Бум! Visual Studio, чего это ты до сих пор в 32-битном режиме (обратите внимание на его Virtual Size)? Пиковое использование памяти на моём компьютере на уровне 89% от максимума, ещё терпимо. Это пригодится позже.

Дополнение: многие указали на другие удобные инструменты, в том числе VMMap и RAMMap.

Отладка по информации о памяти

К счастью, это не какие-то ненужные мелочи ОС. Актуальная информация о потреблении памяти многократно помогала мне в отладке разных проблем.

Самое главное, это найти нетронутые части выделенной памяти. Данные о подкачке тоже важны: эта память передана, но используется редко или вообще не используется.

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

По этим причинам я ранее слышал предложение полностью удалить файл подкачки и приравнять выделенную память рабочему набору. Однако это обоюдоострая идея. Тогда ОС не в состоянии сбросить память в случае неправильной работы приложений, которые иногда впустую резервируют память.

  • Диспетчер задач
  • Process Explorer
  • Sysinternals
  • управление памятью
  • VMMap
  • RAMMap
  • Отладка
  • Разработка под Windows
  • Софт

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *