Рассмотрим веб-службу ASP.NET SOAP, которая запускается нормально, но при первом ударе сильно ломается.
Обратите внимание, что это развертывание работает в тестовой среде, но не в среде PreProd. Оба являются Windows 2003 SP3 + IIS 6 + ASP.NET 3.5. Все в актуальном состоянии.
Мы наблюдаем следующее поведение:
Процессы, которые сильно бьют по ЦП: dw20.exe
. Я не понимаю, почему здесь замешан доктор Ватсон.
Журнал событий показывает ошибку времени выполнения ASP.NET:
Диспетчер задач:
Текст журнала событий:
EventType clr20r3, P1 w3wp.exe, P2 6.0.3790.3959, P3 45d6968e, P4 errormanagement, P5 1.0.0.0, P6 4b86a13f, P7 24, P8 0, P9 system.stackoverflowexception, P10 NIL.
Вопросы
Любые мысли о том, что может быть это исключение system.stackoverflow? Учитывая, что код в разных средах одинаков, может ли это быть проблемой с полезной нагрузкой? Может быть проблема в конфигурации? В сообщении об исключении вы можете увидеть имя моей сборки .NET: «ErrorManagement»
Исключения Stackoverflow - это особый случай, потому что затронутое приложение больше не может ничего делать (например, регистрировать трассировку стека) - в этом случае процесс пула приложений (w3p.exe) завершается ОС. Вот почему доктор Ватсон / DW20 участвует. Вы можете попробовать отладить дамп, сохраненный DW20, с помощью WinDbg с расширением SOS (ожидайте крутого обучения, если вы не знакомы с этим набором инструментов - я надеюсь, что с VS2010 это станет проще, как и было обещано).
Высокая загрузка ЦП (и часто высокая загрузка памяти) вызвана DW20, что особенно раздражает, если цикл «сбой и перезапуск» выполняется быстрее, чем DW20, и поэтому несколько процессов DW20 накапливаются.
По умолчанию пул приложений IIS должен перезапускать вышедшие из строя приложения не более 3 раз за короткий промежуток времени, в противном случае они будут остановлены для защиты сервера от DoS.
Что касается основной причины, stackoverflow: может быть что угодно ... но как насчет этого дикого предположения: доступ к базе данных не работает из-за неправильной конфигурации, генерируется исключение, и ваше приложение регистрирует исключения в базе данных, не перехватывая исключения при обработке исключений; )
Решение этой (вероятно, уникальной) проблемы:
У меня была эта проблема, и я обнаружил, что у меня есть инструкция LINQ, которая пытается удалить некоторые строки. Каждый день он выходил из строя, поэтому количество строк постоянно увеличивалось. Исключения фактически обрабатывались и записывались в созданную мной таблицу, поэтому я нашел ее там. Нашел проблемную таблицу, и это было 700k + сверхтяжелых строк. Мой LINQ выглядел так:
var db = new DatabaseDataContext();
var updateQueueLogs = db.UpdateQueueLogs;
List<UpdateQueueLog> listToDelete;
using (new TransactionScope(
TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
{
listToDelete = (from updateQueueLog
in db.UpdateQueueLogs
where updateQueueLog.CreatedAt < DateTime.Now.AddDays(-7)
select updateQueueLog).ToList();
}
updateQueueLogs.DeleteAllOnSubmit(listToDelete);
db.SubmitChanges();
Итак, он извлекал полные объекты и получал исключения OutofMemory. Я изменил этот код на сохраненный процесс:
delete from UpdateQueueLogs
where CreatedAt < DATEADD(day,-7,getdate())
Я просто хотел опубликовать это, потому что, если вы не видите исключений, вы можете проверить количество строк в таблице SQL и посмотреть, могут ли быть некоторые операторы LINQ, которые истекают по времени.
Похоже, вы можете получить необработанное исключение, которое, в свою очередь, убивает рабочий процесс asp.net. Посмотрите, поможет ли это:
Проверьте в средстве просмотра событий наличие ошибок (обычно в журнале приложений). Он находится в разделе «Администрирование».
Кроме того, хорошая точка @ markus в том, что IIS имеет довольно жесткую настройку по умолчанию «не более X потоков сбоев за Y раз», так что если вы попадете на страницу всего пару раз с такой ошибкой, весь пул приложений будет отключен . Снова проверьте Просмотр событий.