IIS7: сбойное приложение w3wp.exe, какова основная причина этих сбоев?

Наш веб-сайт находится в .NET, но с некоторыми старыми ASP и 32-битными библиотеками. Некоторое время (2 года) работал нормально. Но в течение последнего месяца мы видели следующую ошибку на нашем сервере IIS7, которую мы не смогли отследить и исправить:

«Сбойное приложение w3wp.exe, версия 7.0.6001.18000, отметка времени 0x47919413, неисправный модуль kernel32.dll, версия 6.0.6001.18215, отметка времени 0x4995344f, код исключения 0xe053534f, смещение ошибки 0x0002f328, идентификатор процесса 0x%x9, время запуска приложения 0x%x9 10".

Мы можем воспроизвести ошибку:

  • Одна из наших страниц .ASPX начинает загружаться, выполнять код и запросы (у нас есть response.flush() по всей странице, чтобы отслеживать, где прерывается код), затем она внезапно останавливается, и мы получаем указанную выше ошибку в IIS.

  • Страница перестает загружаться, и без response.flush() она не перенаправляется на нашу страницу error.aspx (как настроено в web.config)

  • Ошибка возникает НЕ постоянно. Бывает, бывает 3 раза подряд, потом минут 15 работает нормально без остановок с правильным перенаправлением на error.aspx.

  • При этом мы получаем классическую ошибку: «Либо BOF, либо EOF имеет значение True, либо текущая запись была удалена».

  • Когда возникает ошибка, страница зависает, и все другие сеансы на том же компьютере из любых браузеров также имеют зависшие веб-страницы (кстати, мы разрешаем только 1 рабочий процесс во время тестирования). С других компов сайт загружается нормально.

  • Я могу перезапустить пул приложений, убить w3wp.exe, перезапустить IIS. Ничего не получится. Единственный способ снова успешно загрузить страницу — перезапустить MS SQL, который обрабатывает наши состояния сеанса. Я не знаю, почему это так, но мы предположили, что файлы cookie сеанса в браузерах пользователей указывают на поток, который не был завершен должным образом (из-за вышеупомянутого сбоя), и IIS ожидает его завершения для обработки дополнительного кода (? ). Если кто-то может объяснить это лучше, это было бы очень полезно. Есть ли тайм-аут, который мы можем установить для «завершения» потоков? Это проблема, связанная с MS SQL?

Я также просмотрел использование частной и виртуальной памяти, потому что я думаю, что наш код не самый эффективный, и я уверен, что у нас есть оставшиеся утечки памяти. Тем не менее, я видел сбой страницы, хотя и личная, и виртуальная память были все еще довольно низкими (менее 100 МБ каждая).

Я использовал Debug Diag и WinDbg, как указано здесь: http://blogs.msdn.com/b/tess/archive/2009/03/20/debugging-a-net-crash-with-rules-in-debug-diag.aspx, но мы не можем заставить работать windbg, это то, что мы пытаемся сделать в данный момент.

Если бы кто-то мог помочь нам или указать нам правильное направление, это было бы действительно здорово, спасибо.


person yorrser    schedule 11.12.2010    source источник
comment
Лучше четко скажите, с какой проблемой WinDbg вы столкнулись.   -  person Lex Li    schedule 22.01.2014


Ответы (4)


«Либо BOF, либо EOF имеет значение True, либо текущая запись была удалена» означает, что таблица пуста и вы пытаетесь выполнить MoveNext. Так что проверьте eof, прежде чем делать какие-либо шаги.

IIS печально известен тем, что выдает ошибки ядра в w3wp.exe, подобные этой. Все ваши ошибки в состоянии сеанса — это просто симптомы аварийного процесса. Множественные пулы приложений мало чем помогут — они просто распространят ошибку.

Могу поспорить, что это тупиковые ситуации SQL из-за изменения пользовательской среды. Это приведет к 10-секундной задержке, поскольку SQL пытается определить, какой запрос следует уничтожить. Один выигрывает, один проигрывает. Проигравший возвращает указатель на неожиданно пустую таблицу, и вы пытаетесь сделать ход и последующий сбой. Возможно, вы могли бы указать свою БД на соединение ODBC и включить трассировку или найти способ заставить SQL регистрировать ее.

У меня были все те же симптомы, что и выше в Perl. Я смог создать оболочку fn() для выполнения всех запросов SQL и регистрации всех параметров sql, + и любых ошибок на диск, чтобы отследить проблему. Это были взаимоблокировки, затем мы смогли закодировать автоматический повтор, и в конце концов мы перекодировали порядок запросов и просканированные столбцы, чтобы устранить взаимоблокировки.

person Ferd    schedule 16.12.2010

Вполне возможно, что одна из ваших ссылочных/связанных сборок где-то случайно испортилась (это может случиться) на диске. Можете ли вы попробовать воспроизвести проблему на новой чистой машине с той же статистикой, свежими установками последних версий драйверов xyz, которые вы используете?

Таким образом я решил загадочную проблему, на выявление которой у меня ушло несколько месяцев. Казалось чистым, новые машины с теми же характеристиками и предустановленными драйверами будут работать нормально — только некоторые старые машины с такими же характеристиками постоянно выходили из строя. В итоге я удалил все (IIS, ASP.NET, .NET, базу данных и клиент) и начал с нуля. Конечная причина, когда я изолировал, заключалась в том, что драйвер клиента базы данных был поврежден на старых машинах (и все старые машины были клонами друг друга, поэтому я предполагаю, что они были клонированы после того, как произошло повреждение), и, похоже, он возился с пространством памяти .NET, даже когда я не вызывал его напрямую. Я еще даже не ответил на мой "помогите мне отладить этого монстра " опубликовать с этим ответом, потому что я сомневался, что это кому-нибудь поможет.

person Mike Atlas    schedule 11.12.2010
comment
Большое спасибо, Майк. У нас есть 3 реализации на 3 разных сайтах с серверами, предоставленными разными хост-провайдерами. Они все терпят крах. Мы купили новый сервер, переустановили все с нуля, и он так же рухнул. Однако, как вы предположили, мне интересно, может ли быть поврежден наш драйвер MS SQL или mySQL. Пробовали ли вы также использовать DebugDiag/Windbg, чтобы определить источник проблемы? - person yorrser; 11.12.2010

Мы начали получать эту ошибку после установки обновлений Windows на компьютере с Windows Server 2008R2. Служба активации процессов Windows (WAS) устанавливает некоторые дополнительные привязки сайтов, которые вызвали проблемы с нашей установкой.

Мы удалили привязки net.tcp, net.pipe, net.msmq и msmq.formatname с нашего веб-сайта и больше не получали исключение сбойного приложения.

person Jim Geurts    schedule 04.07.2013

Вероятно, это крайний случай, но на случай, если кто-то придет сюда и использует MVCMailer, я получал ту же ошибку из-за метода .SendAsync() в почтовых программах.

Я переключил их все на .Send(), и сбой прекратился.

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

person ledgeJumper    schedule 22.01.2014