Подтвердить что ты не робот

Почему IIS не очищает старые рабочие процессы (w3wp.exe) от повторного использования пула, исключая исключение из памяти?

У меня есть сайт asp.net-mvc, и недавно я получаю исключения из памяти на своем веб-сервере. У меня только 1 пул приложений, и мы недавно установили IIS для повторного использования после того, как он достиг определенного предела. Я зашел на днях и увидел 4 w3wp.exe процессы, выполняющие (каждый с использованием памяти ~ 1,8 ГБ)

Я предполагаю, что во время процесса рециркуляции он не убивает старый рабочий процесс, и в итоге я получаю исключения из памяти на своем веб-сайте, потому что в ящике есть только 8 ГБ памяти. Я могу добавить память в окно, но меня беспокоит, почему эти старые процессы не очищаются.

Есть ли какие-либо рекомендации по определению того, почему этот процесс переработки не убивает старые процессы w3wp.exe и не позволяет им работать? Любые предложения вокруг понимают как коренные причины, так и даже обходные пути, чтобы избежать этого риска в будущем?

4b9b3361

Ответ 1

У меня была аналогичная проблема, когда я запускал такие вещи, как FFMpeg.exe или какое-то преобразование PDF с графикой WPF, процесс IIS не завершался и выдавал ошибки памяти. Проблема не в IIS, а в каких-то тупиках в процессе, который блокирует даже после сбоя.

Обходной путь - это разделить ваш сайт на два отдельных веб-сайта, нужно только обрабатывать транзакции с базой данных, которая обычно не имеет сбоев. Логика, такая как преобразование видео/фото, преобразование PDF или любая другая логика, которая может вызвать сбой, должна быть перенесена в другую веб-службу. И используйте HTTP-вызов со своего веб-сайта, чтобы обрабатывать их через веб-службы.

Теперь, в этом случае, все еще нет способа обойти процесс обслуживания веб-сервисов, поэтому я решил переработать рабочий пул приложений каждые 100 запросов (я выбрал этот номер после просмотра нескольких запросов, в среднем он выходил за рамки 1 ГБ только после того, как набрали 200 запросов), и я включил пул приложений в Web Garden, выполнив 4 процесса на пул.

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

Ответ 2

Повторное использование пула приложений обычно отключает старые рабочие процессы, поэтому я не думаю, что вы попали в ошибку IIS.

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

https://www.iis.net/configreference/system.applicationhost/applicationpools/add/failure

Если вы не совсем знакомы с отладкой таких процессов, я предлагаю вам открыть файл поддержки через http://support.microsoft.com и позволить Microsoft поддержать ребята вы.

Ответ 3

Первичным подозреваемым, за которым следует идти, являются классы, которые реализуют IDisposable и любое их использование, которое не вызывает Dispose(). У меня была аналогичная проблема, которую я уже опубликовал в ответ на этот вопрос.

Наиболее вероятной причиной является то, что вы не вызываете .Dispose() в соединениях с базой данных. Люди, как правило, путаются в этом, потому что встроенный пул соединений .NET делает это так, будто вы не должны удалять соединения. Однако вызов .Dispose() в конце запроса (или когда вы закончите использовать соединение) - это именно то, что вы должны сделать, чтобы предотвратить утечку ресурсов. Объединение пулов ожидает, что это произойдет.

Я не думаю, что процесс 4 w3wp.exe вызывает большую озабоченность - для IIS нормальным является появление нескольких процессов. Но ясно, что ваше приложение имеет утечки ресурсов, которые необходимо устранить. Начните с рассмотрения IDisposable, как я уже говорил выше. Если у вас все еще есть проблемы, посмотрите на элементы, которые у вас есть в кеше, и попробуйте определить, есть ли более эффективная стратегия кэширования, которую вы могли бы использовать. Если все остальное не удается, профайл приложения, чтобы узнать, можете ли вы найти источник утечки ресурсов. Скорее всего, ваше приложение должно внедрять IDisposable где-то это не так.

Ответ 4

Как ясно из вашего сообщения, настройка IIS для повторного использования после достижения определенного предела создает новый пул приложений.

Может быть несколько причин, по которым старшие не прекращаются.

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

Чтобы узнать другую причину, Включить "Процесс сирота" в IIS. Чтобы узнать о виновном процессе, вы можете использовать Process Explorer".

У вас также есть возможность установить Исполняемый, это будет выполняться, когда процесс будет потерян/оставлен.

Непосредственным решением также может быть установка действия на KillW3p после определенного предела ЦП.

<applicationPools>
   <add name="DefaultAppPool">
     <cpu limit="80000" action="KillW3wp" resetInterval="00:02:00" />
   </add>
</applicationPools>