Применяется ли processModel memoryLimit только к ASP.Net? (System.OutOfMemoryException)

2

Мы запускаем службу Windows на базе .NET. ( не приложение ASP.Net), и мы получаем ошибки System.OutOfMemoryException при большой нагрузке.

В основном служба хранит кеш в памяти, состоящий из хэш-таблицы Asset, вложенной в нее, является хэш-таблицей учетной записи, и внутри нее находится класс, который хранит значения для заданного периода времени (для комбинации активов + счета). Служба обслуживает агрегаты этих данных для клиентов, а также принимает обновления данных. Общее количество узлов остается постоянным на протяжении всего срока службы.

В machine.Config мы видим такие вещи, как:

    <processModel 
       enable="true" 
       timeout="Infinite" 
       idleTimeout="Infinite" 
       shutdownTimeout="00:00:05" 
       requestLimit="Infinite" 
       requestQueueLimit="5000" 
       restartQueueLimit="10" 
       memoryLimit="60" 
       webGarden="false" 
       cpuMask="0xffffffff" 
       userName="machine" 
       password="AutoGenerate" 
/>

Все это похоже на приложения ASP.Net/IIS, но наше OutOfMemoryException не встречается в ASP.Net, и, похоже, нет эквивалентных настроек конфигурации для приложений без ASP.

Может ли этот раздел применяться ко всем приложениям на основе .NET, а не только к ASP.Net?

Я спрашиваю, потому что наша служба росла примерно на 1,2 ГБ памяти (мы храним большую базу данных в памяти, да, с серьезной причиной), когда произошла ошибка, которая по совпадению примерно равна 60% от 2 ГБ ( "предел" памяти 32-битных приложений). Может ли эта очевидная настройка конфигурации IIS задерживать нашу служебную память Windows?

Чтобы усложнить ситуацию, мы запускаем это на .Net 1.1 32 бит, под 64 бит Windows Server 2003 (да, у нас есть причина для эта необычная конфигурация), с 12 ГБ оперативной памяти. Насколько я понимаю, каждый 32-битный процесс должен иметь возможность адресовать до 4 ГБ ОЗУ, не так ли? Или это требует изменений либо в реестре, либо в файле конфигурации .Net?

ПРИМЕЧАНИЕ. Я знаю о запуске Windows/3GB, но, поскольку мы находимся на 64-битных окнах, я не думаю, что это должно применяться (но не стесняйтесь исправить меня, если я ошибаюсь).

Обновление 1

Люди, похоже, согласны с тем, что конфигурация processModel специфична только для приложений ASP.Net.

В одном ответе говорится, что 32-разрядные приложения на 64-битной ОС по-прежнему имеют ограничение на 2 ГБ на процесс, но большинство ссылок, которые я смог найти, говорят, что каждый 32-битный процесс имеет доступ к 4 ГБ в 64-битной ОС. (Но, возможно, это разрешено только путем установки бит IMAGEFILELARGEADDRESSAWARE?)

Некоторые релевантные ссылки

Как установить бит IMAGE_FILE_LARGE_ADDRESS_AWARE для приложений на С#:
http://bytes.com/groups/net-c/569198-net-4gt

Доступная память IIS6 для 32-битного приложения с веб-садом на ОС x64 (32Gb Ram):
Доступная память IIS6 для 32-разрядного приложения с веб-садом на ОС x64 (32Gb Ram)

.NET Debugging Demos Lab 3: Память:
http://blogs.msdn.com/tess/archive/2008/02/15/net-debugging-demos-lab-3-memory.aspx
Должно быть полезно найти особенности OutOfMemoryException?

Нажатие ограничений - виртуальная память:
http://blogs.technet.com/markrussinovich/archive/2008/11/17/3155406.aspx
Прочтите это, чтобы понять концепции, и используйте testlimit, чтобы исключить проблемы с машиной/конфигом. После того как вы убедились, что это ошибка вашего приложения, прочитайте и перечитайте статьи из блога Тесс.

Окончательное обновление

Хорошо, для нашей ситуации это, по-видимому, отсутствовало .Net Service Pack... видимо, возникла проблема с удалением этого исключения, после того, как пакет обновления полностью очистился!

  • 0
    Разве это не проблема конфигурации сервера?
  • 0
    Я надеюсь на это, но вот что я пытаюсь выяснить ....
Показать ещё 2 комментария
Теги:

2 ответа

2
Лучший ответ

Элемент конфигурации processModel специфичен для процессов ASP.NET и не применим к другим процессам .NET.

Если вы выполняете 32-разрядный процесс в 64-разрядной ОС, вы по-прежнему подчиняетесь пределу процесса 32-разрядного процесса, который составляет 2 ГБ. Практический предел на самом деле ближе к 1,5 до 1,8 ГБ, в зависимости от ваших характеристик приложения - другими словами, очень маловероятно, что вы когда-либо достигнете технологического барьера 2 ГБ.

Чтобы ваша служба Windows воспользовалась полным объемом 4 ГБ пространства, ожидая, что вам понадобится:

  • отметьте свой процесс как LARGE_ADDRESS_AWARE. Поверьте, это можно сделать с помощью editbin.exe, но я никогда этого не делал! Это также может открыть новую банку червей...:) Я посмотрю, не могу ли я подтвердить.
  • добавить /3GB в boot.ini
  • сервер перезагрузки

Также рассмотрите профиль распределения памяти вашего приложения. Если вы выделяете объекты размером более 85 КБ, то эти объекты будут выделены в кучу больших объектов. Большая куча объекта перемещается, но не уплотняется, как другие кучи, что означает, что вы можете испытывать фрагментацию, которая в конечном итоге заставит диспетчер памяти .net распределять непрерывный блок памяти для удовлетворения запроса.

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

Также проверьте размер файла страницы на сервере. Недостаточно размер файла страницы также может вызывать проблемы с учетом его общего для всех процессов, хотя это приводит к ошибке с системными исключениями с некоторым количеством слов в области "виртуальной памяти".

Удачи!

Z

Литература:

Ограничения памяти для выпуска Windows

Тесс Феррандес,.NET Отладка: Память

0

Ключ ProcessModel используется только для ASP.NET, и даже тогда на Windows Server 2003 он практически бесполезен, потому что у вас есть конфигурация пула приложений.

Переключатель/3GB не применяется к 64-разрядной Windows.

Как я понимаю, вы можете получить OutOfMemoryExceptions, если у вас есть объекты, закрепленные в памяти, не позволяющие GC эффективно дефрагментировать стек памяти при сборе коллекции.

Вам следует настоятельно рекомендовать переносить службу на 64-битное приложение, если вы знаете, что вы забиваете в него гигабайты данных. ИМО вы играете с огнем, если вы приближаетесь к пределу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню