Могу ли я сказать Windows не выгружать память определенных процессов?

Есть ли способ сообщить Windows, что она не должна выгружать память определенных процессов на диск?

Это служба Windows .Net с довольно большим использованием памяти. У меня много физической ОЗУ, но ОС, похоже, все равно перемещает часть памяти процесса в файл подкачки.


person Luca Martinetti    schedule 24.06.2009    source источник
comment
Windows перемещает страницы из рабочих наборов процессов по последнему доступу. Как правило, это дает хорошие результаты, но в некоторых случаях может потребоваться контроль. Перед тем как это сделать, прочтите Внутреннее устройство Windows (для начала), чтобы лучше понять, что вы пытаетесь сделать.   -  person Richard    schedule 02.07.2009
comment
Я повторяю замечание. В большинстве случаев попытка перехитрить диспетчер памяти Windows приведет к снижению производительности.   -  person Martin C.    schedule 04.07.2009
comment
Ключевой вопрос: почему это (перемещение части памяти процесса в файл подкачки) в любом случае является проблемой?   -  person Stobor    schedule 06.07.2009
comment
Я думаю, что это дурной тон - ставить под сомнение такую ​​мотивацию ... ограничения, которые должны соблюдать разработчики, часто возникают не по их выбору и не по жестким требованиям.   -  person RandomNickName42    schedule 06.07.2009
comment
@ RandomNickName42: поверьте мне, я понимаю давление на программиста, я тоже ношу эту шляпу. Однако, как программисту, мне важно знать, когда я делаю что-то, что считается необычным, и знать, какие смягчающие обстоятельства требуют этого ... На самом деле я просил выяснить, нужно ли сохранять исполняемые файлы в ОЗУ как ну и пострадают ли файловые буферы ввода-вывода ...   -  person Stobor    schedule 06.07.2009
comment
@Stobor В серверной системе я хочу, чтобы серверное приложение было готово к запуску со временем отклика <100 мс, когда пользователь делает запрос после бездействия в течение нескольких часов - даже если антивирусный сканер тем временем работал.   -  person John    schedule 13.07.2017
comment
@Stobor Одна из распространенных причин, по которой это требуется, - это если у вас есть блок памяти, в котором хранится конфиденциальная информация, такая как незашифрованные пароли пользователей или медицинские данные.   -  person Randy the Dev    schedule 01.03.2018
comment
@AndrewDunn Хороший пример. Хотя, если только довольно большая часть этого довольно большого объема используемой памяти не хранит конфиденциальные данные, может иметь больше смысла заблокировать в ОЗУ только часть памяти процесса, а не весь процесс.   -  person Stobor    schedule 04.03.2018


Ответы (3)


Вы можете использовать VirtualLock, чтобы предотвратить подкачку памяти на диск, но я действительно думаю, что вам лучше позволить ОС управлять системной памятью. Это довольно хорошо, и я бы не стал сомневаться в том, почему ОС меняет местами на диск, если бы я действительно не знал, что делаю.

person Eric Petroelje    schedule 24.06.2009
comment
Если бы это было хорошо, мы бы увидели, что так много приложений тратят секунды на открытие контекстного меню только потому, что какая-то операция копирования включена и блокирует разбиение по страницам? - person John; 13.07.2017
comment
Требование отключенного разбиения по страницам является законным для презентационных приложений, особенно для потоковых, для приложений живого звука это неизбежное требование, поскольку ASIO и другие современные аудиодрайверы фактически не заботятся о состоянии буфера (для уменьшения задержки), поэтому любые неожиданные задержка может нарушить качество звука и вызвать крайне нежелательные эффекты. - person azis.mrazish; 05.06.2021

VirtualLock по умолчанию в спешке исчерпает квоту, даже если вы разрешите пользователю (по умолчанию параметр политики безопасности «Блокировать страницы в памяти» не имеет записей (даже для администратора)).

Если вы все же настроите это, вам также нужно будет установить «Настроить квоты памяти для процесса».

Этот вопрос немного неоднозначен: какую часть пространства виртуальной машины вы хотите предотвратить от выгрузки? Куча / стек / модули? ...?

В целом, одно из решений, которое я использовал в прошлом, - это создать DLL с большим разделом, который был READ + WRITE, неподвижным, вы также можете пометить его EXECUTE и SHARED, если это необходимо, но тогда я бы HeapCreate в разделе этого модуля , что позволяет мне использовать его как кучу.

Вы можете найти точный бит для установки здесь , IMAGE_SCN_MEM_NOT_PAGED похоже, это поможет.

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

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

Я думаю, что проще всего попробовать полностью отключить файл подкачки. Но до этого, если вы используете ОС Vista / 2008 +, подкачка, которую вы видите, может быть связана с суперфетчингом, который может упреждающе «настраивать» вашу систему с предположением, что в ближайшем будущем вам нужно будет использовать то или иное приложение. Некоторые другие простые задачи - остановить неиспользуемые службы, такие как поиск, который может индексировать огромное количество файлов, также вы должны войти в свой «планировщик задач», который настраивает системные задачи, по умолчанию в большинстве систем есть несколько десятков с настройками по умолчанию. действия, которые передадут все дампы Доктора Ватсона в MS, дефрагментируют ваш диск и ряд других, возможно, чрезвычайно интенсивных операций с памятью.

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

Недавно я наткнулся на проект codeplex под названием "non-paged clr host" со своей страницы:

Реализация С точки зрения реализации, невыгружаемый узел CLR использует SetProcessWorkingSetSize, SetProcessWorkingSetSizeEx (в Windows Server 2003 и более поздних версиях) и VirtualLock, чтобы гарантировать, что выделенная им память заблокирована в физической памяти. Обратите внимание, что использование вышеупомянутых API не не гарантирует с абсолютной уверенностью, что никакого разбиения на страницы не произойдет; вместо этого он сводит к минимуму вероятность того, что это произойдет в очень исключительных сценариях. В некоторых проведенных нами нагрузочных тестах, даже когда система в целом перегружалась из-за нехватки физической памяти, в процессе не было обнаружено ошибок страницы с использованием невыгружаемого Хост CLR.

person RandomNickName42    schedule 02.07.2009

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

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

person Phil Miller    schedule 05.07.2009
comment
Недавно MS выпустила инструмент DynCache, который позволяет предварительно настроить или иным образом настроить некоторые предпочтения в этих сценариях, blogs.msdn.com/ntdebugging/archive/2009/02/06/ & sqlblogcasts.com/blogs/grumpyolddba/archive/2009/03/18/ - person RandomNickName42; 06.07.2009
comment
Gheeze Я ненавижу тебя обидеть, но мне действительно нужны очки;). Ссылка, которую вы процитировали, относится к Linux, тонкое разнообразие разговорного языка может сбивать с толку, если не указано четко ... Если вы обратитесь к (msdn.microsoft.com/en-us/library/cc644950 (VS.85) .aspx), когда FILE_FLAG_NO_BUFFERING сочетается с FILE_FLAG_OVERLAPPED, flags обеспечивает максимальную асинхронную производительность, поскольку ввод-вывод не зависит от синхронных операций диспетчера памяти. Однако некоторые операции ввода-вывода занимают больше времени, поскольку данные не хранятся в кэше. - Итак, Windows = NO_BUFFER ›* :) - person RandomNickName42; 06.07.2009