Linux

大量游標導致響應緩慢和大量 CPU 使用 - cursor: mutex s

  • January 6, 2012

我們的 Oracle 伺服器有問題。它在幾個月前升級到 11g,並且正在執行第三方系統。該系統已經執行多年(並且還存在其他幾個問題),但這是新的:每天一到兩次,CPU 使用率增加,並且 Cursor Mutex S 非常明顯,自伺服器啟動以來已經有 3000 萬個等待事件(其中最近)。

似乎突然之間,一些簡單的INSERT問題開始出現了。我們已經檢查了統計數據、索引等是否應該是最新的、適當的大小、磁碟上的空間等等……沒有問題。

我們已將單個 SQL 表達式隔離為主要罪魁禍首。許多類似的陳述給出了類似的問題,但我將專注於一個。執行此特定插入的“中間件”軟體同時在約 70 台伺服器上執行。

當我們開始注意到這些問題時,該語句在v@sql_shared_cursor. 我們已經設置了一個 cron 作業,每五分鍾清除一次游標,但這並沒有解決任何問題,只是稍微減少了問題。

再看一遍v@sql_shared_cursor,原來創建這麼多游標的原因是INST_DRTLD_MISMATCH = Y. 這很奇怪,因為中間件(我們幾乎無法直接控制)不會插入那麼多行。

我們轉向供應商,詢問他們是如何進行插入的。他們回答說,他們從表中進行選擇WHERE 1 = 0以將列結構放入他們的內部 ADODB 對象,然後用相關數據填充該對象。他們通常執行 1 到 20 次插入 pr。‘批’。

我猜想當您進行批量更新時,幕後的 ADODB 使它看起來像批量插入,這將是 Oracle 將其視為批量的唯一合理原因,但我一直找不到任何困難這方面的事實。

任何人都可以提供以下見解:

  • 為什麼會發生這種情況?
  • 如果與 11g 有關,那麼為什麼會在升級兩個月後的現在發生?
  • 為了深入了解這一點,我應該查看其他任何參數嗎?

編輯:事實證明,這很可能是 Oracle 在 Linux 上的一個錯誤。我們目前正在測試一個更新檔,如果結果屬實,我會在幾天后自己發布一個答案。

EDIT2:更新檔沒有修復它——雖然我們可能還沒有找到原因,但我們可能已經通過增加重做日誌的數量來緩解這個問題。我仍然希望在某個時候寫一個答案。

事實證明這是一個 Oracle 錯誤。應用下面提到的更新檔後,一個多月以來沒有一條語句有超過 50 個游標,並且問題中描述的性能問題已經消失。


更新檔:錯誤 10636231 - INSERT .. RETURNING 語句的版本計數較高,原因為 INST_DRTLD_MISMATCH

錯誤 10636231 - INSERT .. RETURNING 語句的版本計數較高,原因為 INST_DRTLD_MISMATCH$$ ID 10636231.8 $$

修改 17-SEP-2011 類型更新檔狀態已發布

錯誤 10636231 INSERT 的版本計數高 .. RETURNING statements with reason INST_DRTLD_MISMATCH 此說明簡要概述了錯誤 10636231。內容最後更新時間:2011 年 9 月 17 日點擊此處以獲取以下每個部分的詳細資訊。影響:產品(組件)Oracle 伺服器 (Rdbms)

認為受影響的版本範圍 版本 >= 11.2.0.2 但低於 12.1

確認受影響的版本 •11.2.0.2

受影響的平台通用(所有/大多數平台受影響)

因此,它被認為是預設行為的回歸: 11.2.0.2 中引入的回歸

已修復:此問題已在 •12.1(未來版本)中修復 •11.2.0.3 •11.2.0.2.3 更新檔集更新 •11.2.0.2 適用於 Exadata 數據庫的捆綁更新檔 8 •11.2.0.1 適用於 Exadata 數據庫的捆綁更新檔 12 •11.2.0.2 Windows 平台上的更新檔 7

症狀:與以下有關: •洩漏(記憶體洩漏/增長) •互斥量爭用 •影響共享池 •由於 INST_DRTLD_MISMATCH 導致游標未共享 •V $ SQLAREA •V $ SQL_SHARED_CURSOR

說明 此問題是在 11.2.0.2 中由 bug 9380377 修復引入的

帶有 RETURNING 子句的插入 SQL 可能不會共享子游標,從而導致 V$SQLAREA 中的 VERSION_COUNT 較高以及相關問題(可能的互斥體爭用等)。如果會話涉及全域事務,則會發生這種情況。例如:如果會話在外部協調事務(例如 XA)中執行,或者會話使用數據庫連結。

重新發現筆記:V 中的高 version_count $ SQLAREA Insert statement with a RETURNING clause A global transaction is involved The reason in V $ SQL_SHARED_CURSOR 是 INST_DRTLD_MISMATCH

引用自:https://serverfault.com/questions/312147