2016-04-21 4 views
0

Я работаю над сайтом администратора, созданным с использованием ASP.NET 4.5 (C#/WebForms) поверх хранилища данных SQL Server, что требует от меня загрузки больших наборов записей (250K + записей). В разработке на IIS Express я последовательно получаю исключения Out Of Memory (OOM), происходящие из IIS. Я могу посмотреть диспетчер задач и посмотреть, как использование памяти увеличивается с 120 000 К до более 600 000 К.Очистка памяти в IIS после выполнения больших запросов

Проблема (ПРОЧАЯ проблема) Я столкнулся с тем, что, когда я возвращаюсь и фильтрую запрос, чтобы он не возвращал столько записей, я продолжаю получать исключения OOM, потому что IIS не освобождает память от предыдущей запрос. Память, необходимая для нового запроса, просто сваливается поверх уже выделенной памяти.

На полной установке IIS 7 (до сих пор на моем DEV поле) я не получаю начальное исключение ООГО из IIS, однако это еще не отпуская память, которая будет продолжать создавать проблемы для будущей деятельности IIS как память продолжает накапливаться. Я понимаю, что GC должен в конце концов уйти, чтобы очистить его, но мне нужно, чтобы это произошло немедленно.

Итак, вопрос в том, как я могу освободить неиспользуемую, но выделенную память от IIS по запросу?

я нашел следующие статьи SF ...

  1. Out Of Memory Exception in IIS
  2. Cleaning up Large Objects from IIS memory

который привел меня попробовать следующее ...

protected override void OnPreRender(EventArgs e) 
{ 
    try 
    { 
     var data = this.GetSessionList(); 
     BindUI(data); 
    } 
    catch (Exception ex) 
    { 
     // 
     // display error message 
     while (ex.InnerException != null) { ex = ex.InnerException; } 
     String msg = (ex.GetType() == typeof(OutOfMemoryException)) ? MessagesConfigService.OutOfMemory.SessionReports : ex.Message; 
     ucAlert.ShowMessage(msg, ucAlertMessage.AlertStates.DANGER); 
    } 
    finally 
    { 
     // 
     // Clean up anything being held on to in memory. This will not prevent OOM 
     // exceptions for too-large queries, but will prevent further OOM errors for 
     // smaller queries that follow. 
     GC.Collect(); 
     Int64 totalMemory = GC.GetTotalMemory(true); 
    } 
    base.OnPreRender(e); 
} 

В наконец статья Я пробовал каждый из методов GC самостоятельно, а также вместе, но не видел уменьшения памяти, хранящейся в IIS.

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

Итак ... любые мысли?

Спасибо заранее :)

-G

P.S. Причина таких больших наборов записей заключается в том, что бизнес хочет иметь возможность экспортировать данные в электронную таблицу Excel, поэтому простое разбиение на страницы результатов необязательно является опцией. Кроме того, существует достаточное количество задержек, так как запрос выполняется, поэтому необходимость выдерживать время выполнения для каждой страницы будет непомерно высокой. У меня есть вопросы о производительности, настраивающей этот запрос, но, очевидно, выходит за рамки этого вопроса.

+0

Вы можете прочитать этот пост. http://stackoverflow.com/questions/9666356/high-memory-usage-with-w3wp-application-pool-iis-7 –

+0

Память будет выпущена, если ссылок не останется. Это предполагает ошибку или недоразумение. Кроме того, OOM не происходит из IIS. Он исходит из CLR, когда вы исчерпали доступную память. Опубликуйте больше кода и переключитесь на 64 бит. – usr

ответ

0

Вам захочется поэкспериментировать с настройками утилизации пула приложений и пределом виртуальной памяти. На этот вопрос нет ни одного ответа. Это связано с ознакомлением с этими настройками и экспериментированием с различными настройками под нагрузкой.

Оформить заявку Пулы для настройки приложений раздел here.

+0

Утилизация AppPool сбрасывает состояние сеанса для всех подключенных пользователей, правда? - Кроме того, это одно из нескольких приложений, которые живут на одном «веб-сайте», используя тот же AppPool ..., что также может повлиять на них. –

+0

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