Поставщик данных Oracle привязывает рабочий процесс IIS, когда веб-сайт остановлен

Мы столкнулись с неприятной проблемой в Oracle 11g Release 2, где процесс w3wp берет на себя и весь процессорный ядро, и отладка показывает, что поставщик данных Oracle бросает ThreadAbortExceptions бесконечно. Разработчик нашел эту проблему, выполнив следующие действия:

1) Просмотрите веб-сайт, на котором локальные соединения данных Oracle локально (http://localhost/OracleWebSite - мы используем IIS, а не ASP.NET dev сервер, для всех наших сайтов). Это гарантирует, что процесс w3wp запущен и что активный пул соединений Oracle существует в пуле приложений.

2) Остановите веб-сайт (или выполните операцию Rebuild All в Visual Studio на рассматриваемом веб-сайте).

Наша обработка соединений Oracle в затронутых приложениях (все веб-приложения Oracle) является надежной и надежной. Эта проблема не возникает, если мы отключили объединение пулов. Эта проблема не возникает в Oracle 11g Release 1.

Ответ 1

Это было разрешено. Исправление выпущено в Oracle 11.2.0.1.2, которое доступно через веб-сайт oracle.com.

К сожалению, исправление в настоящее время доступно только через учетную запись "Моя поддержка Oracle".

Это исправлено в 11.2.0.2 и в патче 9966926 ORACLE 11G 11.2.0.1 PATCH 5 BUG ДЛЯ WINDOWS (64-бит AMD64 и INTEL EM64T).

Или WORKAROUND: отключить самонастройку, добавив в строку подключения "Self Tuning = false".

Ответ 2

Все, что вызывает перекомпиляцию (изменение web.config, изменение файла app_offline.htm,.aspx и т.д.), приводит к максимальному использованию процессора в ядре. Если вы повторите этот процесс, он максимизирует использование ЦП на следующем ядре, пока общее использование ЦП не достигнет 100%.

Я подключил windbg с расширениями sos, и похоже, что для каждого максимального ядра есть 1 поток, застрявший в System.AppDomain.Unload(System.AppDomain) и еще один застрявший на Oracle.DataAccess.Client.OracleTuningAgent.DoScan().

Первая тема

  • Oracle.DataAccess.Client.OracleTuningAgent.DoScan()
  • Oracle.DataAccess.Client.OracleTuningAgent.TuningFunction()
  • System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
  • System.Threading.ThreadHelper.ThreadStart()

Вторая нить

  • System.AppDomain.Unload(System.AppDomain)
  • System.Web.HttpRuntime.ReleaseResourcesAndUnloadAppDomain(System.Object)
  • System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
  • System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(System.Threading. _ThreadPoolWaitCallback)
  • System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(System.Object)

Похоже, AppDomain.Unload ожидает завершения OracleTuningAgent.DoScan, но этот поток заблокирован или спал.

Oracle подтвердила эту проблему (ошибка # 9648040), и это главный приоритет. В то же время возможные обходные пути:

  • Откат назад к 11gR1/более раннему клиенту
  • Добавьте строку "Self Tuning = false" в строку подключения. Вы, конечно, потеряете преимущества автоматической настройки.

-Скотт