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

15

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

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

Ключевой вопрос: почему в любом случае это («перемещение части памяти процесса в файл подкачки»)? Stobor
@ RandomNickName42: поверь мне, я понимаю нагрузку на программиста, я тоже ношу эту шляпу. Однако, как программисту, для меня важно знать, когда я делаю что-то, что считается необычным, и знать, какие смягчающие обстоятельства требуют этого ... На самом деле я просил выяснить, нужно ли поддерживать исполняемые файлы в RAM, а также будут ли затронуты файловые буферы ввода-вывода ... Stobor
Я думаю, что это плохая форма, чтобы подвергать сомнению мотивацию, подобную этой ... ограничения, которые разработчики должны поддерживать, часто не соответствуют их выбору и жестким требованиям. RandomNickName42
Я второй комментарий. В большинстве случаев попытка перехитрить диспетчер памяти Windows приведет к снижению производительности. Martin C.
Windows перемещает страницы из рабочих наборов процессов на основе наименьшего количества доступа. Обычно это дает хорошие результаты, но конкретные случаи использования могут требовать контроля. Перед тем, как сделать это, прочитайте Windows Internals (для начала), чтобы лучше понять, что вы пытаетесь сделать. Richard

Ваш Ответ

3   ответа
0

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

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

Блин, я ненавижу рвать на тебя, но мне действительно нужны очки;). Ссылка, на которую вы ссылались, относится к linux, тонкая вариативность родного языка может быть довольно запутанной, если не указано иное ... Если вы ссылаетесь на (msdn.microsoft.com/en-us/library/cc644950(VS.85).aspx ), & quot; Когда FILE_FLAG_NO_BUFFERING объединяется с FILE_FLAG_OVERLAPPED, флаги дают максимальную асинхронную производительность, поскольку ввод-вывод не зависит от синхронных операций диспетчера памяти. Однако некоторые операции ввода-вывода занимают больше времени, поскольку данные не хранятся в кэше. & Quot; - Итак, Windows = NO_BUFFER & gt; * :)
MS недавно выпустила инструмент DynCache, который позволяет предварительно настраивать или иным образом настраивать некоторые предпочтения в этих сценариях,blogs.msdn.com/ntdebugging/archive/2009/02/06/… & Амп;sqlblogcasts.com/blogs/grumpyolddba/archive/2009/03/18/…
12

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

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

Этот вопрос немного двусмысленный, какую часть пространства виртуальных машин вы хотите предотвратить, чтобы его поменяли? Heap / Stack / модуль & APOS;? S ...?

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

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

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

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

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

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

Недавно я наткнулся на проект Codeplex под названием& quot; не выгружаемый хост clr & quot;со своей страницы:

Implementation From an implementation perspective, the non-paged CLR host uses the SetProcessWorkingSetSize, SetProcessWorkingSetSizeEx (on Windows Server 2003 and above) and VirtualLock APIs to ensure that memory allocated by it is locked into physical memory. Note that using the above APIs does not guarantee with absolute certainty that no paging will occur; instead, it minimizes the odds of it occurring to very exceptional scenarios. In some load tests we have conducted, even when the system as a whole was hogged by lack of physical memory, no page faults were observed in the process using the non-paged CLR host.

17

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

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

Похожие вопросы