Sunteți pe pagina 1din 44

Buffer Cache Waits

Buffer Cache Waits


Hot Blocks Buffer Busy Buffer Cache Disk I/O Enqueue Waits Library Cache Write Complete Cache Buffer Chains Latch Free Buffer Free lists IO Read

#.2

Redo
Row Cache SQL*Net

Copyright 2006 Kyle Hailey

#.3

Buffer Cache Waits


Latch - cache buffers chains Latch - cache buffer chains LRU Free Buffer Wait Buffer Busy Wait
Index Data

Free lists Hot Spots

RBS

Write Complete Wait Local Write Wait


Copyright 2006 Kyle Hailey

Oracle Memory Stuctures


SGA Log Library Buffer Buffer Cache Cache Buffer Cache Log Buffer LGWR User1 User2 User3 DBWR

#.4

REDO Log Files


Copyright 2006 Kyle Hailey

Data Files

Buffer Cache
Caches data blocks from disk that are heavily used
Shadow

#.5

Buffer Cache

Process

Disk
Copyright 2006 Kyle Hailey

Block in cache?
How do you know if a block is cached? Do you search all the blocks? Could be 1000s of blocks to search.

#.6

?
Shado w
Proces s
Copyright 2006 Kyle Hailey

#.7

Buffer Cache
Find a block by Take Data file # Block# and Hash Them

Copyright 2006 Kyle Hailey

#.8

Hashing I
Simple has could be a Mod function
1

mod 4 = 1 2 mod 4 = 2 3 mod 4 = 3 4 mod 4 = 0 5 mod 4 = 1

Using mod 4 as a hash funtion creates 4 buckets to store things

Copyright 2006 Kyle Hailey

#.9

Hashing II
Empty Buckets 0
1 2 3

Copyright 2006 Kyle Hailey

#.10

Hashing III
Data Block Hash Blocks file# block #s Result in a bucket# Put Block in bucket

0
1 2 3

Copyright 2006 Kyle Hailey

#.11

Hashing IV

0
1 2 3

Copyright 2006 Kyle Hailey

#.12

Hashing V
After a while the buckets become populated with blocks

0
1 2 3

Copyright 2006 Kyle Hailey

#.13

To Find a Block
Hash bucket Buffer Headers Data Blocks

Shadow Process

1. 2. 3. 4.

Hash the block address Look for header Found, read block in cache Not Found Read block off disk

Copyright 2006 Kyle Hailey

#.14

Cache Buffers Chains


A different latch protects each bucket

0
1 2 3

1 2 3 4

Note: multiple buckets are now protected by one latch Copyright 2006 Kyle Hailey

#.15

Cache Buffers Chains


1
2 3

Well Balanced
Buffer Headers

Hash Buckets

4 5 6 7 8 9 1 0

Copyright 2006 Kyle Hailey

#.16

Cache Buffers Chains


1

Hash Buckets

Multiple Buckets protected by same latch v9 onwards

Buffer Headers
2

Copyright 2006 Kyle Hailey

#.17

Cache Buffers Chains : Diag


1

s1 s1 s1 s1 s1

Hash Buckets

Sessions

Contention if too accesses on a bucket


Copyright 2006 Kyle Hailey

#.18

Cache Buffers Chains : Diag


Buffer Headers
1

Hash Buckets

Contention: Too Many Buffers in Bucket


Copyright 2006 Kyle Hailey

#.19

Cache Buffers Chains : Solution


Fine the SQL causing the problem Contributing Factors
Updates,

inserts on blocks while reading those blocks

Cause multiple copies

Hot

root block of an index Select for update Using dual instead of x$dual

Copyright 2006 Kyle Hailey

#.20

Need Free Block Block


If the data block isnt in cache
Get

a free block in the buffer cache Read it off disk Add a header Read the block into the buffer cache

Need Free Block to Read in New Data Block

Copyright 2006 Kyle Hailey

#.21

Finding a Free Block


When a session reads a block

Into the bufffer cache how does


it find a FREE spot? Shadow

Process

Copyright 2006 Kyle Hailey

#.22

Finding a Free Block


Hash bucket Buffer Headers Data Blocks

Buffer Headers are also on a LRU linked List Copyright 2006 Kyle Hailey

#.23

Cache Buffers LRU list


MRU

Buffer Headers

LRU

Session Shadow

LRU = Least Recently Used MRU = Least Recently Used Copyright 2006 Kyle Hailey

#.24

Free Buffer Wait


Finding a Free Block
Go

to the LRU end of data blocks Look for first non-dirty block If search too many post DBWR to make free Free Buffer wait

Copyright 2006 Kyle Hailey

#.25

Free Buffer Wait


#17 Data Block Cache lack free buffers Tune by
Increase

data blocks Try to tune DBWR

Inefficient SQL
requesting

large # of blocks

In V7, sorts could flood the cache with dirty blocks


Copyright 2006 Kyle Hailey

#.26

Cache Buffers LRU list


MRU

Buffer Headers

LRU

Used Block gets put on Front Unused blocks get pushed off

Copyright 2006 Kyle Hailey

#.27

Cache Buffers LRU Latch


MRU

Buffer Headers

LRU

One Latch protects the linked list during changes to the list

Copyright 2006 Kyle Hailey

#.28

Cache Buffers LRU Latch


MRU

Buffer Headers

LRU

Mid-Point Insertion

Full Table Scan Insertion Point

Copyright 2006 Kyle Hailey

#.29

Cache Buffers LRU Latch


MRU

LRU

Mid-Point Insertion

Oracle Tracks the touch count of blocks. As the block is pushed to the LRU end, if its touch count is 3 or more, its promoted to the MRU end

Copyright 2006 Kyle Hailey

#.30

Cache Buffers LRU Latch : Solution


Set 1 Set 2 Multiple Sets
_db_block_lru_latches = 8 10gR2 with cpu_count = 2
Copyright 2006 Kyle Hailey

Buffer Headers

#.31

Cache Buffers LRU Latch : Solution Other


Increase Size of Buffer Cache Reduce Checkpointing Activity Use Async I/O for DBWR Increase DBWR write batch size

Copyright 2006 Kyle Hailey

#.32

Buffer Busy Waits


User 1 tries to change a buffer header User 2 already has buffer header locked
0

1
User1

2
User2 3
Copyright 2006 Kyle Hailey

#.33

Buffer Busy
14 kinds of blocks
Undo Header - more RBS segs data (index and table are different for bbw) segment header free lists freelist blocks free lists groups

9 kinds Buffer Busy Waits


100,110,120,130 (read I/O issues) 200,210,220,230, 231 (block change issues)

Copyright 2006 Kyle Hailey

#.34

Buffer Busy Wait


Whats Important: What kind of block header
Rollback Data

Index Table

Segment

Header

If Pre 10
Read

(100,110,120,130 ) Write (200,210,220,230, 231 )


Copyright 2006 Kyle Hailey

#.35

Buffer Busy Cases


Undo Header - Not enough rollback segments Undo Block hot spot in RBS Data Block
Table Block w/ DML : Table lacks Free lists Table I/O : Multiple sessions reading same block into data cache Note: in 10g, becomes read by other session Index : has hot block, partition or change SQL

Segment Header add free Lists (with Datablock) Free List add free lists groups
Copyright 2006 Kyle Hailey

#.36

Buffer Busy Solutions


IF Buffer Busy Waits high
First

look at v$waitstat

Class Time/Count

SQL> select

* from v$waitstat;

CLASS COUNT TIME ------------------ ---------- ---------data block 1 1 segment header 0 0 free list 0 0 undo header 0 0 undo block 0 0
Copyright 2006 Kyle Hailey

#.37

Buffer Busy Wait Solutions


Buffer wait Statistics DB/Inst: LINUX3/linux3 -> ordered by wait time desc, waits desc Snaps: 39-42

Class Waits Total Wait Time (s) Avg Time (ms) ---------------------- ----------- ------------------- ------------undo header 1,159 18 16 data block 132 2 12 file header block 45 0 2 segment header 4 0 10 undo block 1 0 0 ------------------------------------------------------------

Copyright 2006 Kyle Hailey

#.38

Load : Example
4 Sessions running
Insert into toto values (null, a); Commit;

Copyright 2006 Kyle Hailey

#.39

Lack of Free List : Diag

S1

S2

S3

S4

Copyright 2006 Kyle Hailey

#.40

With Free Lists : Diag

S1

S2

S3

S4

Copyright 2006 Kyle Hailey

10g
SQL> select * from v$waitstat; CLASS COUNT TIME --------------------------- ---------1. data block 89640 13732 2. sort block 0 0 3. save undo block 0 0 4. segment header 1017 2558 5. save undo header 0 0 6. free list 0 0 7. extent map 0 0 NAME P1 8. 1st level bmb 204874 18896 9. 2nd level bmb 155 2 ----------------------10.3rd level bmb 0 0 11.bitmap blockbuffer busy waits 0 0 file# 12.bitmap index block 0 0 13.file header block 0 0 14.unused 0 0 15.system undo header 0 0 16.system undo block 0 0 17.undo header 219 122 18.undo block 0 0
Copyright 2006 Kyle Hailey

#.41

P2

P3

------- -----block# class

#.42

write complete waits


#18 Usually happens in tandem with free buffer Tune by
Increase

data block cache

Happens because shadow wants to access blocks that are currently being written to disk by DBWR

Copyright 2006 Kyle Hailey

#.43

Local Write Wait


#25 Truncating a table Wait for Data Cache to be cleared of all blocks of truncated table Wait by shadow for DBWR

Copyright 2006 Kyle Hailey

#.44

Summary Buffer Cache Waits


Latch - cache buffers chains: find SQL Latch - cache buffer chains LRU Free Buffer Wait : increase cache size, tune SQL Buffer Busy Wait
Index

: aleveate hot spots Data DML : add free lists Data Read: change app, tune I/O RBS : more RBS segs, use UNDO

Write Complete Waits : increase cache size Local Write Wait : truncates / reduce cache size
Copyright 2006 Kyle Hailey

S-ar putea să vă placă și