Могу ли я сказать Windows, чтобы не менять какую-либо память процессов?

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

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

Ответы

Ответ 1

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

Ответ 2

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

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

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

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

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

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

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

Я бы подумал, что проще всего попытаться полностью отключить ваш файл. Но до этого, если вы используете Vista/2008 + OS, то обмен, который вы видите, может быть вызван суперзаписью, что может быть проактивно "настраивать" вашу систему с предположением, что в ближайшем будущем вам нужно будет использовать одно приложение. Некоторые другие простые задачи состоят в том, чтобы остановить неиспользуемые сервисы, такие как поиск, которые могут индексировать огромное количество файлов, а также вы должны зайти в свой "планировщик задач", который настраивает системные задачи, по умолчанию в большинстве систем с дефолтом имеется несколько десятков действие, которое передаст все дампы Dr. Watson в MS, дефрагментирует ваш диск и ряд других, возможно, чрезвычайно интенсивных операций с типом памяти.

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

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

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

Ответ 3

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

Кроме того, если система выполняет большое количество ввода-вывода, для производительности может быть лучше использовать память для буферов, а не данных приложения, как описано Martin Pool