Могу ли я сказать Windows не выгружать память определенного процесса? - PullRequest
15 голосов
/ 24 июня 2009

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

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

Ответы [ 3 ]

17 голосов
/ 24 июня 2009

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

12 голосов
/ 02 июля 2009

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

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

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

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

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

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

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

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

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

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

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

0 голосов
/ 06 июля 2009

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

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

...