遭遇DFS LOCK HANDLE wait event,
RAC下的序列造成的,加大cache的大小會有所改善,
以下是轉載
DFS LOCK HANDLE 是無法獲得 global cache lock的handle時候所記錄的等待事件,如果在RAC環境下使用sequence,2個例項都有併發的session使用sequence,這時有可能遭遇 DFS LOCK HANDLE等待。
參考文件如下:
http://www.pythian.com/blogs/383/sequences-in-oracle-10g-rac
Sequences in Oracle 10g RAC
January 31st, 2007 - by Christo KutrovskyJust recently I got a call from a developer. He had a table with a primary key populated by a sequence, a timestamp column with the current date and some other columns. He had a specific set of data that, when ordered by the primary key had out of order timestamps. He was puzzled how this could be. This is a RAC database and the sequence was created with the default values.
Not only the sequence’s cache was the default of 20, but it was “noordered”. Being “noordered” Oracle will not guarantee the order in which numbers are generated.
Example of “noorder” sequence in 10g RAC:
Session 1 on node-A: nextval -> 101 Session 2 on node-A: nextval -> 102 Session 1 on node-B: nextval -> 121 Session 1 on node-B: nextval -> 122 Session 1 on node-A: nextval -> 103 Session 1 on node-A: nextval -> 104
The sequence cache is in the shared pool, therefore sessions on the same node can share the cached entry, but sessions on different nodes cannot. I wonder why Oracle doesn’t make “ordered” the default for sequences.
So I explained to the developer how sequences work in RAC and how each node has its own “cache”.
We changed the sequence to “ordered” and increased the cache to 1000. Now selecting on either node gets the next number as he expected. I warned him that there would be some performance implications due to cluster synchronization. Him been a responsive developer, asked me what would be the impact, so I tested it out.
How does RAC synchronize sequences?
In Oracle 10g RAC, if you specify the “ordered” clause for a sequence, then a global lock is allocated by the node when you access the sequence.
This lock acquisition happens only at the first sequence access for the node (A), and subsequent uses of the sequence do not wait on this lock. If another node (B) selects from that sequence, it requests the same global lock and once acquired it returns the sequence’s next value.
The wait event associated with this activity is recorded as “events in waitclass Other” when looked in gv$system_event. So much for event groups, it couldn’t be more obscure. That view shows overall statistics for the session.
However if you look in the gv$session_wait_history it shows as “DFS lock handle” with the “p1″ parameter been the object_id of the sequence. This second view has a sample of the last 10 wait events for a session.
In a SQL_TRACE with waitevents (10046 trace) it will be a “DFS lock handle” but in AWR or statspack reports it will be “events in waitclass Other”. So much for consistency.
How does that change our example?
Session 1 on node-A: nextval -> 101 (DFS Lock handle) (CR read) Session 2 on node-A: nextval -> 102 Session 1 on node-B: nextval -> 103 (DFS Lock handle) Session 1 on node-B: nextval -> 104 Session 1 on node-A: nextval -> 105 (DFS Lock handle) Session 1 on node-A: nextval -> 106 (more selects) Session 1 on node-A: nextval -> 998 Session 1 on node-B: nextval -> 999 (DFS Lock handle) Session 1 on node-B: nextval -> 1000 (CR read)
The cache size also has some RAC synchronization implications. When the cached entries for the sequence are exhausted, the sequence object needs to be updated. This usually causes a remote CR (current read) over the interconnect for the block that has the specific sequence object. So a bit more activity here.
Test case:
create sequence test_rac; declare dummy number; begin for i in 1..50000 loop select test_rac.nextval into dummy from dual; end loop; end; /
Results:
50 000 loops with cache = 20 (default)
1 node = 5 seconds
2 nodes at same time = 14 seconds
2 nodes at same time ordered = 30 seconds
50 000 loops with cache = 1000
1 node = 1.5 seconds
2 nodes at same time = 1.8 seconds
2 nodes at same time ordered = 20 seconds
With a smaller cache, the “noordered” still has as significant impact as every 10 fetches (cache 20 divided by 2 nodes fetching) it has to synchronize between the 2 nodes
The conclusion
By default sequences in 10g RAC are created without ordering. Beware of using applications that rely on sequences to be ordered and using it in a RAC environment.
Consider changing all user sequences to “ordered” as a precaution and increasing the cache size.
The default cache value is still very low and even not-ordered sequences will cause contention in a highly-active sequence even in non-RAC and causing an additional block exchange every 20 values in RAC.
For high volume insert operations where ordering is not performed on the value returned from the sequence, consider leaving the sequence “noordered” but increasing the cache size significantly.
Either way, the sequence parameters should be reviewed, as chances are, the defaults are not what you need.
I remember reading somewhere that in Oracle 9i the “ordered” clause in RAC was equivalent to “nochache”. I can’t imagine how bad that would be in concurrent selects from the same sequence.
It would be interesting if someone running 9i RAC performs the test case and I would appreciate if you post the results in the comments.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/112417/viewspace-911037/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- DFS lock handle事件處理事件
- 關於DFS lock handle等待事件事件
- enq:SQ-contention / DFS lock handle(SV)ENQ
- 物化檢視日誌(materialized view log)引起大量Dfs Lock Handle等待ZedView
- 【WAIT】wait eventAI
- 由oradebug poke process allocation latch引發dfs lock handle等待事件進一步分析事件
- [Typescript] handle event.target type in FormTypeScriptORM
- enqueue wait event .ENQAI
- wait for stopper event to be increasedAI
- oracle wait event 等待事件OracleAI事件
- wait event ---asynch descriptor resizeAI
- wait event:gc buffer busyAIGC
- Oracle Wait Event - TuningOracleAI
- oracle library cache之library cache lock_library cache pin wait event釋義OracleAI
- Wait event:read by other sessionAISession
- 等待事件 (wait event) [final]事件AI
- Wait Event "PX Deq: Execution Msg"AI
- Subject: "class slave wait" is the top wait event on AWR snapshotAI
- 12.2 wait event ‘PGA memory operation’AI
- Common Oracle Wait Event Descriptions(zt)OracleAI
- wait event監測效能瓶頸AI
- log buffer space wait event等待事件AI事件
- v session_wait v session_event v system_eventSessionAI
- v$session_event , v$system_event , v$session_waitSessionAI
- zt_關於wait events asynch descriptor resize_wait eventAI
- MySQL 5.5 -- innodb_lock_wait 鎖 等待MySqlAI
- Wait Event Enhancements in Oracle 10g(zt)AIOracle 10g
- wait event_Additional Statistics_that do not have corresponding wait eventsAI
- MySQL更新卡住報錯lock wait timeoutMySqlAI
- Lock wait timeout exceeded; try restarting transactionAIREST
- Oracle10g Wait Event Data Collection ProcedureOracleAI
- oracle wait event之db file sequential readOracleAI
- oracle 10049 event之library cache lockOracle
- mysql: __lll_mutex_lock_wait出現的分析MySqlMutexAI
- 0317Library Cache Pin/Lock Wait EventsAI
- 【蓋國強】Oracle Wait Event:Data file init writeOracleAI
- Wait event (二) 摘自官檔 Oracle版權所有AIOracle
- V$SESSION.STATUS='ACTIVE' AND WAIT_EVENT='Idle'SessionAI