Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1433996
  • 博文数量: 556
  • 博客积分: 12626
  • 博客等级: 上将
  • 技术积分: 5799
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-11 15:56
个人简介

从事IT基础架构多年,发现自己原来更合适去当老师……喜欢关注新鲜事物,不仅限于IT领域。

文章分类

全部博文(556)

文章存档

2019年(6)

2018年(15)

2017年(17)

2016年(11)

2015年(2)

2014年(2)

2013年(36)

2012年(54)

2011年(100)

2010年(41)

2009年(72)

2008年(14)

2007年(82)

2006年(104)

分类: Oracle

2007-09-03 18:36:42

"buffer busy waits" Reference Note

This is a reference note for the wait event "buffer busy waits" which includes the following subsections:
  • (eg: For waits seen in )
  • (eg: For waits seen in )
See for an introduction to Wait Events.

Definition:

  • Versions:7.0 - 10.2 Documentation: 9.0
  • This wait happens when a session wants to access a database block in the buffer cache but it cannot as the buffer is "busy". The two main cases where this can occur are:
    1. Another session is reading the block into the buffer
    2. Another session holds the buffer in an incompatible mode to our request
(Absolute File# in Oracle8 onwards)
  • P2 =
  • P3 = (Reason Code)/Block Class# in 10g
  •   Wait Time:

    Normal wait time is 1 second. If the session has been waiting for an exclusive buffer during the last wait then it waits 3 seconds this wait. The session will keep timing-out/waiting until it acquires the buffer.

      Finding Blockers:

    Finding the blocking process can be quite difficult as the information required is not externalised. If P3 (Reason Code) shows that the "buffer busy wait" is waiting for a block read to complete then the blocking session is likely to be waiting on an IO wait (eg: "db file sequential read" or "db file scattered read") for the same file# and block#.

    If the wait is due to the buffer being held in an incompatible mode then it should be freed very soon. If not then it is advisable to contact Oracle Support and get 3 SYSTEMSTATE dumps at one minute intervals as the blocking session may be spinning. (Look for ACTIVE sessions with high CPU utilisation).

    Systemwide Waits:

    If the TIME spent waiting for buffers is significant then it is best to determine which segment/s is/are suffering from contention. The "Buffer busy wait statistics" section of the Bstat/estat or STATSPACK reports shows which block type/s are seeing the most contention. This information is derived from which can be queried in isolation:
      SELECT time, count, class 
        FROM V$WAITSTAT 
       ORDER BY time,count
      ;
    
    This shows the class of block with the most waits at the BOTTOM of the list.
    Oracle Support may also request that the following query be run to show where the block is held from when a wait occurs:
      SELECT kcbwhdes, why0+why1+why2 "Gets", "OTHER_WAIT"
        FROM x$kcbsw s, x$kcbwh w
       WHERE s.indx=w.indx
         and s."OTHER_WAIT">0
       ORDER BY 3
      ;
      Note: "OTHER_WAIT" is "OTHER WAIT" in Oracle8i (a space rather than an underscore)
    
    Additional information regarding which files contain the blocks being waited for can be obtained from the internal thus:
      SELECT count, file#, name
        FROM x$kcbfwait, v$datafile
       WHERE indx + 1 = file#
       ORDER BY count
      ;
    
    This shows the file/s with the most waits (at the BOTTOM of the list) so by combining the above of information we know what block type/s in which file/s are causing waits. The segments in each file can be seen using a query like:
      SELECT distinct owner, segment_name, segment_type
        FROM dba_extents
       WHERE file_id= &FILE_ID
      ;
    
    If there are a large number of segments of the type listed then monitoring may help isolate which object is causing the waits.
    Eg: Repeatedly run the following statement and collect the output. After a period of time sort the results to see which file & blocks are showing contention:
      SELECT p1 "File", p2 "Block", p3 "Reason"
        FROM v$session_wait 
       WHERE event='buffer busy waits'
      ;
    
    Note:
    In the above query there is no reference to WAIT_TIME as you are not interested in whether a session is currently waiting or not, just what buffers are causing waits.

    If a particular block or range of blocks keep showing waits you can try to isolate the object using the queries in Note 181306.1.

    One can also look at:

    • Capturing session trace and noting the "buffer busy waits" may help - See .

    Reducing Waits / Wait times:

    As buffer busy waits are due to contention for particular blocks then you cannot take any action until you know which blocks are being competed for and why. Eliminating the cause of the contention is the best option. Note that "buffer busy waits" for data blocks are often due to several processes repeatedly reading the same blocks (eg: if lots of people scan the same index) - the first session processes the blocks that are in the buffer cache quickly but then a block has to be read from disk - the other sessions (scanning the same index) quickly 'catch up' and want the block which is currently being read from disk - they wait for the buffer as someone is already reading the block in.

    The following hints may be useful for particular types of contention - these are things that MAY reduce contention for particular situations:

    Block Type Possible Actions
    data blocks Eliminate HOT blocks from the application. Check for repeatedly scanned / unselective indexes. Change PCTFREE and/or PCTUSED. Check for 'right- hand-indexes' (indexes that get inserted into at the same point by many processes). Increase INITRANS. Reduce the number of rows per block.
    segment header Increase of number of FREELISTs. Use FREELIST GROUPs (even in single instance this can make a difference).
    freelist blocks Add more FREELISTS. In case of Parallel Server make sure that each instance has its own FREELIST GROUP(s).
    undo header Add more rollback segments.

    Related:

    Bug can cause "buffer busy waits" and latch contention in 817/901 Note 176129.1
    Tracing User sessions
    阅读(2713) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~