Назад | Перейти на главную страницу

Большое количество курсоров, вызывающих медленный отклик и большую загрузку ЦП - cursor: mutex s

У нас проблема с нашим сервером Oracle. Пару месяцев назад он был обновлен до 11g и работает под управлением сторонней системы. Система работает в течение многих лет (и у нее было несколько других проблем), но это ново: один или два раза в день загрузка ЦП увеличивается, и Cursor Mutex S очень заметен, имея 30 миллионов событий ожидания с момента запуска сервера (что был недавно).

Кажется, что внезапно ряд простых INSERT начал давать проблемы. Мы проверили, что статистика, индексы и т. Д. В порядке - актуальны, имеют правильный размер, место на диске и т. Д. Проблем нет.

Мы выделили одно-единственное SQL-выражение как главную причину. Ряд похожих утверждений порождают аналогичные проблемы, но я остановлюсь на одном. «Промежуточное ПО», выполняющее эту конкретную вставку, одновременно работает на ~ 70 серверах.

Когда мы начали замечать проблемы, у этого оператора было более 10 000 записей в v@sql_shared_cursor. Мы настроили cron-задание, очищающее курсоры каждые пять минут, но это ничего не решает и лишь немного снижает проблему.

Снова глядя на v@sql_shared_cursor, оказывается, что причиной создания множества курсоров является INST_DRTLD_MISMATCH = Y. Это странно, поскольку промежуточное программное обеспечение (которое у нас мало прямого контроля) не вставляет такое количество строк.

Обратились к производителю и спросили, как делают вставки. Они ответили, что делают выбор из таблицы WHERE 1 = 0 чтобы получить структуру столбцов во внутреннем объекте ADODB, который затем заполняется соответствующими данными. Обычно выполняют от 1 до 20 вставок на пр. "партия".

Я предполагаю, что ADODB за сценой делает его похожим на массовую вставку, когда вы выполняете пакетное обновление, что будет единственной рациональной причиной для Oracle рассматривать это как массовое, но мне не удалось найти ничего сложного факты по этому поводу.

Кто-нибудь может предложить понимание:

РЕДАКТИРОВАТЬ: Оказывается, это вполне может быть ошибкой Oracle в Linux. В настоящее время мы тестируем патч, и я сам отправлю ответ через пару дней, если он окажется правдой.

EDIT2: патч не исправил это - и, хотя мы, вероятно, не нашли причину, мы, возможно, облегчили проблему, увеличив количество журналов повторного выполнения. Я все еще надеюсь написать ответ на это в какой-то момент.

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


Исправление: ошибка 10636231 - Большое количество версий для операторов INSERT .. RETURNING с причиной INST_DRTLD_MISMATCH

Ошибка 10636231 - Большое количество версий для операторов INSERT .. RETURNING с причиной INST_DRTLD_MISMATCH [ID 10636231.8]

Измененный статус исправления типа 17-СЕН-2011 ОПУБЛИКОВАН

Ошибка 10636231 Большое количество версий для операторов INSERT .. RETURNING с причиной INST_DRTLD_MISMATCH В этом примечании дается краткий обзор ошибки 10636231. В последний раз содержимое обновлялось: 17 сентября 2011 г. Щелкните здесь, чтобы получить подробные сведения о каждом из разделов ниже. Влияет на: Продукт (компонент) Oracle Server (Rdbms)
Диапазон версий, предположительно затронутых Версии> = 11.2.0.2, но НИЖЕ 12.1
Подтвержденные версии, подверженные уязвимости • 11.2.0.2

Платформы, затронутые Generic (затронуты все / большинство платформ)

Считается, что это регрессия поведения по умолчанию, поэтому: Регрессия введена в 11.2.0.2.

Исправлено: эта проблема устранена в • 12.1 (будущий выпуск) • 11.2.0.3 • 11.2.0.2.3 Обновление набора исправлений • 11.2.0.2 Пакет исправлений 8 для базы данных Exadata • 11.2.0.1 Пакет исправлений 12 для базы данных Exadata • 11.2.0.2 Патч 7 для платформ Windows

Симптомы: Связаны с: • Утечка (утечка / рост памяти) • Конфликт мьютексов • Затронут общий пул • Курсор не используется из-за INST_DRTLD_MISMATCH • V $ SQLAREA • V $ SQL_SHARED_CURSOR

Описание Эта проблема появилась в версии 11.2.0.2 исправлением ошибки 9380377.

Вставка SQL с предложением RETURNING может не использовать дочерние курсоры, что приведет к высокому значению VERSION_COUNT в V $ SQLAREA и связанным с этим проблемам (возможные конфликты мьютексов и т. Д.). Это может произойти, если сеанс участвует в глобальной транзакции. Например: если сеанс выполняется в рамках внешне скоординированной транзакции, такой как XA, или если сеанс использует ссылки на базу данных.

Замечания по повторному обнаружению: высокое значение version_count в V $ SQLAREA Insert оператор с предложением RETURNING Участвует глобальная транзакция Причина в V $ SQL_SHARED_CURSOR - INST_DRTLD_MISMATCH