ASP.NET - один большой веб-запрос вызывает System.OutOfMemoryException - все еще есть много доступной памяти - PullRequest
1 голос
/ 18 декабря 2008

Окружающая среда: Windows 2003 Server (32 бит); IIS6, ASP.NET 2.0 (3.5); 4Gb Ram; 1 рабочий процесс

У нас есть ситуация, когда у нас очень большой System.XmlDocument загружается в память, а затем он отправляется в преобразованное XSL-преобразование. Происходит следующее: когда веб-запрос приходит на сервер, он находится в состоянии ожидания с 2500 МБ доступной системной памяти.

При заполнении XML DOM объем доступной памяти уменьшается примерно на 500 МБ, после чего мы получаем событие System.OutOfMemoryException. На данный момент система теоретически должна иметь 2000 МБ доступной памяти, доступной для обслуживания запроса (согласно Perfmon).

У меня есть следующие вопросы:

1) На каком уровне в стеке выполняется это ограничение памяти? ОПЕРАЦИОННЫЕ СИСТЕМЫ? IIS? ASP.NET? рабочий процесс? Это индивидуальный лимит веб-запросов?

2) Этот предел где-нибудь настраивается?

3) Почему этот веб-запрос не может получить доступ ко всей доступной системной памяти?

Ответы [ 4 ]

1 голос
/ 18 декабря 2008
  1. Вы работаете в процессе. Процесс может получить доступ только к 2 гигабайтам памяти. Эта задача делит память со всем, что выполняется в этом процессе, поэтому этот фрагмент кода не получает полных 2 гигабайтов - даже если он доступен. На ОС также есть переключатель на 3 гигабайта. Я считаю, что это параметр реестра. Но вам придется искать MSDN, чтобы найти эту информацию.

Но реально вам нужно сделать это по-другому. Возможно, переключившись на синтаксический анализатор в стиле SAX.

1 голос
/ 18 декабря 2008

1) Я бы догадался о рабочем процессе, но это должно быть настраиваемо в IIS до предела памяти, который может использовать рабочий процесс. Другим фактором является то, какой уровень битов использует ваше программное обеспечение, например 32 бит имеет физический предел 4 ГБ, так как это общее адресное пространство.

2) Вероятно, но не забывайте, что фрагментация памяти может сыграть определенную роль в более быстром выходе из памяти, чем вы думаете, например. если имеется запрос памяти для непрерывного фрагмента памяти объемом 1000 МБ, то это не обязательно может быть найдено в текущей памяти.

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

0 голосов
/ 18 декабря 2008

1) Незнайка. Проверьте свои журналы.
2) IIS ограничивает объем памяти, разделяемой на сайты / пулы приложений. Проверьте ваши настройки.
3) серверы все о работоспособности; если одно приложение захватывает все ресурсы, страдают все остальные. Вот почему корпоративные приложения, такие как IIS, ограничивают память, чтобы не допустить сбоя разгона всего сервера.

0 голосов
/ 18 декабря 2008

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

...