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

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

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

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

4 ответов


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

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

теперь, в этом случае, по-прежнему нет способа обойти сбой процесса веб-службы, поэтому я решил переработать работник пула приложений каждые 100 запросов (я выбрал этот номер после просмотра нескольких запросов, в среднем он будет выходить за пределы 1GB только после нажатия 200 запросов), и я превратил пул приложений в Веб-сад, сделав 4 процесса на бассейн.

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


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

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

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

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


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

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

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


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

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

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

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

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

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

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