2009-04-05 7 views
3

При запуске приложения .NET 2.0 WinForms в среде служб терминалов я вижу некоторые неожиданные результаты, которые я не могу объяснить. Все, что я прочитал, указывает, что сборки JIT (т. Е. Не используя NGen для создания собственных изображений) приводят ко всему, что кодовое пространство хранится на закрытых страницах, увеличивая размер рабочего набора/давление памяти. Тем не менее, фактические результаты (проверенные с помощью Process Explorer, VMMap и WinDbg) показывают, что даже сборки JIT'ы действительно размещаются на совместно используемых страницах (и действительно разделяются, когда есть несколько экземпляров приложения, даже под отдельными TS сессии/пользователей)..NET JIT'ed сборки в разделяемых страницах

Может ли кто-нибудь объяснить, почему это может быть? Это выполняется в среде сервера W2K8, поэтому ASLR объясняет, почему отсутствие конкретных базовых адресов для каждой сборки & не вызывает проблем. Тем не менее, похоже, что эти не являются собственными изображениями PE, это должно привести к тому, что код для этих сборок хранится на личных страницах.

Это было обнаружено, когда мы начали изучать использование NGen для уменьшения давления памяти, но на самом деле обнаружили, что он увеличил размер рабочего набора - поскольку сборки JIT'а уже были разделены.

Самая последняя ссылка, которую я нашел здесь, что опять-таки отличается от наших фактических результатов:

http://blogs.msdn.com/morgan/archive/2009/03/07/developing-net-applications-for-deployment-on-terminal-services-or-citrix.aspx

Edit: Я хотел бы добавить, что с первого размещения на вопрос, больше экспериментов на ОС Windows Серверные тестовые окна Server 2003 также, по-видимому, демонстрируют совместную сборку JIT'ов между процессами. Я все еще в тупике, почему все советы, которые я могу найти, указывают, что NGen требуется, но все реальные данные противоречат этому. Я действительно надеюсь, что эксперты могут пролить свет.

Спасибо!

Редактировать: Я очистил все мои книги .NET/CLR и у меня заканчиваются идеи для поисковых запросов, чтобы попытаться решить эту проблему; кто собирается сделать мой день, помогая устранить это ужасное нюхательное чувство: «Я не понимаю, что происходит»!?! :)

+0

Запрет любых убедительных доказательств того, что NGen действительно поможет использовать память (и незначительное влияние времени запуска в нашей среде), мы решили не создавать генерации собственных изображений наших сборок. Мне все равно хотелось бы знать, почему мы видим это неожиданное поведение! – allgeek

ответ

4

Я думаю, что вы смотрите прямо на страницы модуля. Когда вы используете JIT-код, он не будет отображаться под вашей DLL - он отображается в памяти, которую выделяет среда выполнения. Страницы модулей, на которые вы смотрите, - это в основном метаданные и IL, поэтому они все еще доступны для совместного использования.

В качестве эксперимента я написал небольшую программу, которая генерирует статические методы 30K и вызывает их. В моей системе JIT-версия этой программы имеет 8,2 МБ частной закрытой памяти, а версия NGEN - 3,8.

Даже на страницах вашего модуля, однако, NGEN помогает в использовании памяти. Когда среда выполнения может загружать изображение NGEN, ему не нужно читать метаданные вашего модуля, чтобы СОХРАНИТЬ код. Версия JIT моего тестового приложения использует 2,3 МБ рабочего набора. Версия NGEN использует 32 килобайта.

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

+0

Спасибо за ответ!Я сломаю вещи и сделаю несколько более простых тестов, но я не видел таких же результатов. И из того, что я прочитал (и сообщения в блоге, на которые я ссылался), я действительно должен видеть разницу в страницах модуля. AFAIK, CLR по-прежнему необходимо прочитать метаданные для поддержки отражения, проверки политики CAS и т. Д .; NGEN не устраняет это. Поскольку это приложение на основе TS-сервера, выполняемое многими пользователями, использование памяти имеет решающее значение, тогда как время холодного запуска практически не имеет значения. – allgeek

+0

Без проблем! Доступ к метаданным для Reflection и т. П. - все ленивы - ничто не загружается с нетерпением, чтобы поддержать эти сценарии. Я понимаю, что в сценарии TS ключевым фактором является использование памяти. Я рекомендую вам прочитать эту статью: http://msdn.microsoft.com/en-us/magazine/cc163610.aspx, если вы этого не сделали. Когда вы пересматриваете страницы своего модуля, посмотрите на столбец WS в vmmap, а не на size/commited. WS - это реальный используемый размер страницы, где я видел 2,3 МБ до 32 КБ. Удачи! –