Как работает зарядка памяти/фиксация в Windows 10?

Как работает зарядка памяти/фиксация в Windows 10?

Этот вопрос вызван следующими регулярно наблюдаемыми явлениями, которым я хотел бы найти объяснение:

  1. Текущая фиксация регулярно превышает Физическое использование + Размер файла подкачки. Что с этим? Разве это не должно быть невозможно? [Похоже, это может быть из-за сжатия. Что преобразует вопрос в: Почему лимит фиксаций затем не увеличивается или что-то в этом роде? Т.е. какой смысл в сжатии, если оно не помогает с использованием памяти?]
  2. Иногда это достигает экстремальных значений, когда Текущее значение фиксации превышает использование физической памяти более чем в два раза!
  3. Когда заряд фиксации заполняется и Windows начинает просить меня закрыть что-то, большую часть времени физическая память находится на уровне около 60%. Это кажется ужасно неэффективным.

Как сообщает Process Explorer, это происходит на Windows 10.

Главный вопрос, на который я хотел бы ответить, таков: могу ли я отказаться от искусственного раздувания файла подкачки до уровней, с которыми мой SSD-накопитель, испытывающий нехватку места, не справится, просто чтобы я мог эффективно использовать свою физическую память? (Или даже если бы она не была настолько заполнена. То есть, я бы хотел избежать предложений типа «Сделайте X/Y/Z с файлом подкачки».)

решение1

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

Предположим, что мы говорим о 32-битных системах, поэтому максимальное виртуальное адресное пространство, доступное каждому процессу, обычно составляет 2 ГиБ. (Значительной разницы влюбой(Для 64-битных систем все нижеперечисленное, за исключением того, что адреса и размеры могут быть больше — намного больше.)

Теперь предположим, что программа, запущенная в процессе, использует VirtualAlloc (Win32 API) для "коммита" 2 МБ виртуальной памяти. Как и ожидалось, это отобразится как дополнительные 2 МБ коммита, и в процессе доступно на 2 МБ меньше байтов виртуального адресного пространства для будущих выделений.

Но на самом деле он пока не будет использовать физическую память (ОЗУ)!

Вызов VirtualAlloc вернет вызывающей стороне начальный адрес выделенной области; область будет находиться где-то в диапазоне от 0x10000 до 0x7FFEFFFF, т.е. около 2 ГиБ. (Первые и последние 64 КБ, или 0x10000 в шестнадцатеричном формате, vas в каждом процессе никогда не назначаются.)

Но опять же - нет фактического физического использования 2 МБхранилищеПока нет! Ни в оперативной памяти, ни даже в файле подкачки. (Есть крошечная структура, называемая «Дескриптор виртуального адреса», которая описывает начальный va и длину закрытой выделенной области.)

Вот и всё! Расходы на фиксацию увеличились, а использование физической памяти — нет.

Это легко продемонстрировать с помощью инструмента sysinternals testlimit.

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

  1. выделить ранее «доступную» физическую страницу
  2. настроить запись таблицы страниц для виртуальной страницы, к которой был получен доступ, чтобы связать номер виртуальной страницы с вновь назначенным номером физической страницы
  3. добавить физическую страницу в процесс частныйрабочий набор
  4. и отклоняет ошибку страницы, заставляя повторить инструкцию, вызвавшую ошибку.

Теперь вы "свалили" одну страницу (4 КиБ) в процесс. И использование физической памяти увеличится соответственно, а "доступная" RAM уменьшится. Стоимость фиксации не изменится.

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

  1. ОС удаляет страницу из рабочего набора процесса.
  2. поскольку он был записан, так как он был включен в рабочий набор, он помещается в список измененных страниц (иначе он бы попал в список резервных страниц). Запись таблицы страниц по-прежнему отражает физический номер страницы ОЗУ, но теперь ее бит «действителен» очищен, поэтому при следующем обращении к нему произойдет ошибка страницы
  3. когда список измененных страниц достигает небольшого порога,измененный писатель страницыпоток в процессе «Система» просыпается и сохраняет содержимое измененных страниц в файле подкачки (при условии, что он у вас есть), и...
  4. удаляет эти страницы из измененного списка и помещает их в резервный список. Теперь они считаются частью «доступной» оперативной памяти; но пока у них все еще есть исходное содержимое с того момента, когда они находились в соответствующих процессах. Опять же, коммит-плата не меняется, но использование оперативной памяти и частный рабочий набор процесса уменьшатся.
  5. Страницы в списке ожидания теперь могут бытьперепрофилированный, то есть используется для чего-то другого - например, для устранения ошибок страниц из любого процесса в системе или используется SuperFetch. Однако...
  6. Если процесс, потерявший страницу в измененном или резервном списке, пытается снова получить к ней доступ до того, как физическая страница будет перепрофилирована (т. е. у нее все еще будет исходное содержимое), ошибка страницы устраняется без чтения с диска. Страница просто возвращается в рабочий набор процесса, а запись в таблице страниц становится «действительной». Это пример «мягкой» или «дешевой» ошибки страницы. Мы говорим, что резервные и измененные списки образуют общесистемный кэш страниц, которые, вероятно, скоро снова понадобятся.

Если у вас нет файла подкачки, то шаги с 3 по 5 меняются на:

  1. Страницы находятся в измененном списке, поскольку некуда записывать их содержимое.

  2. Страницы находятся в измененном списке, поскольку некуда записывать их содержимое.

  3. Страницы находятся в измененном списке, поскольку некуда записывать их содержимое.

Шаг 6 остается прежним, поскольку страницы в измененном списке могут быть возвращены обратно в процесс, который их потерял, как "мягкая" ошибка страницы. Но если этого не происходит, страницы остаются в измененном списке до тех пор, пока процесс не освободит соответствующую виртуальную память (возможно, потому что процесс завершается).

Существует и другое использование виртуального адресного пространства и оперативной памяти, помимо частной выделенной памяти.нанесенный на картувиртуальное адресное пространство, для которого резервным хранилищем является некоторый указанный файл, а не файл подкачки. Страницы отображенных VAS, которые выгружаются, отражаются в использовании ОЗУ, но отображенная память не влияет на коммит-сбор, поскольку отображенный файл предоставляет резервное хранилище: любая часть отображенной области, которая не находится в ОЗУ, просто сохраняется в отображенном файле. Другое отличие заключается в том, что большинство отображений файлов могут совместно использоваться процессами; общая страница, которая уже находится в памяти для одного процесса, может быть добавлена ​​в другой процесс без повторного обращения к диску (еще одна программная ошибка страницы).

И естьневыгружаемыйvas, для которого нет резервного хранилища, поскольку он всегда находится в RAM. Это влияет как на сообщаемое использование RAM, так и на "затраты на фиксацию".

Кажется, это может быть из-за сжатия. Что трансформирует вопрос в: Почему лимит коммитов не увеличивается или что-то в этом роде? Т.е. в чем смысл сжатия, если оно не помогает с использованием памяти?

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

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

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

Причина всего механизма "commit charge" и "commit limit" заключается в следующем: когда я вызываю VirtualAlloc, я должен проверить возвращаемое значение, чтобы увидеть, не равно ли оно нулю. Если оно равно нулю, это означает, что моя попытка выделения памяти не удалась, вероятно, потому, что это привело бы к тому, что commit charge превысил бы commit limit. Я должен сделать что-то разумное, например, попытаться commit less или выйти из программы чисто.

Если VirtualAlloc вернул ненулевое значение, т.е. адрес, это говорит мне, что система дала гарантию — обязательство, если можно так выразиться — что сколько бы байт я ни запросил, начиная с этого адреса,будетдоступны, если я решу получить к ним доступ; что есть куда все это поместить - либо в ОЗУ, либо в файл подкачки. т.е. нет причин ожидать какого-либо сбоя при доступе к чему-либо в этом регионе. Это хорошо, потому что было бы неразумно ожидать, что я буду проверять "это сработало?" при каждом доступе к выделенному региону.

Аналогия с «банком, выдающим наличные»

Это немного похоже на банк, предлагающий кредит, но строго на основе наличных денег. (Конечно, настоящие банки работают не так.)

Предположим, что банк начинает с миллиона долларов наличными на руках. Люди приходят в банк и просят кредитные линии на разные суммы. Допустим, банк одобряет мне кредитную линию на 100 000 долларов (я создаю частный регион обязательств); это не означает, что какие-либо деньги фактически покинули хранилище. Если позже я фактически возьму кредит, скажем, на 20 000 долларов (я получаю доступ к подмножеству региона), это действительно изымает деньги из банка.

Но независимо от того, буду ли я брать кредиты или нет, тот факт, что мне одобрили максимум на $100 тыс., означает, что банк впоследствии может одобрить еще только $900 тыс. кредитных линий, в общей сложности, для всех своих клиентов. Банк не одобрит кредит сверх своих денежных резервов (т. е. он не будетпереобязательствоих), поскольку это означало бы, что банку, возможно, придется отказать ранее одобренному заемщику, когда он позже появится с намерением взять кредитихкредит. Это было бы очень плохо, потому что банк ужепреданный идеевыдачи этих кредитов, и репутация банка резко упадет.

Да, это «неэффективно» с точки зрения использования банком этих денег. И чем больше разница между кредитными линиями, которые одобрены клиентам, и суммами, которые они фактически одалживают, тем менее это эффективно. Но эта неэффективность — не вина банка; это «вина» клиентов, которые просят такие высокие кредитные линии, но берут только небольшие кредиты.

Бизнес-модель банка заключается в том, что он просто не может отказать ранее одобренному заемщику, когда тот приходит за кредитом, — сделать это было бы «фатально» для клиента. Вот почему банк тщательно отслеживает, какая часть кредитного фонда была «зарезервирована».

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

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

Возвращаясь к ОС Windows: Тот факт, что у вас есть большая часть вашей оперативной памяти "доступной", не имеет ничего общего с коммитом и лимитом коммита. Если вы близки к лимиту коммита, это означает, что ОС уже коммита - т.е. обещали сделать доступнымкогда запрашивается - столько места для хранения. Не обязательно, чтобы все было занято, чтобы ограничение было применено.

Могу ли я отказаться от искусственного раздувания файла подкачки до уровней, с которыми мой SSD-накопитель, испытывающий нехватку места, не справится, просто чтобы я мог эффективно использовать свою физическую память? (Или даже если бы она не была настолько заполнена. То есть, я бы хотел избежать предложений типа «Выполните X/Y/Z с файлом подкачки».)

Извините, но если вы упираетесь в лимит коммитов, есть всего три вещи, которые вы можете сделать:

  1. Увеличьте объем оперативной памяти.
  2. Увеличьте размер файла подкачки.
  3. Запускайте меньше задач одновременно.

По варианту 2: Вы можете разместить второй файл подкачки на жестком диске. Если приложения на самом деле не используют всю эту выделенную память — а они, по-видимому, не используют, поскольку вы видите так много свободной оперативной памяти — вы фактически не будете часто обращаться к этому файлу подкачки, поэтому размещение его на жестком диске не повредит производительности. Если медлительность жесткого диска все еще беспокоит вас, другой вариант — купить небольшой и, следовательно, дешевый второй SSD и разместить второй файл подкачки на нем. Единственным «затыком» может стать ноутбук без возможности добавить второй «несъемный» диск. (Windows не позволит вам размещать файлы подкачки на съемных дисках, таких как все, что подключено через USB.)

Вотдругой ответ я написалкоторый объясняет вещи с другой стороны.

ps: Вы спрашивали о Windows 10, но я должен сказать вам, что это работает одинаково во всех версиях семейства NT, вплоть до NT 3.1 и предварительных версий. Что, вероятно, изменилось, так это настройка Windows по умолчанию для размера файла подкачки с 1,5x или 1x размера ОЗУ на гораздо меньший. Я считаю, что это была ошибка.

Связанный контент