1.1、Latch可以理解为一种清量级的锁, Latch是一种快速的被获取和释放的内存锁,用于防止共享内存结构被多个用户同时访问,Latch是一种快速的被获取和释放的内存锁,用于防止共享内存结构被多个用户同时访问。他不会造成阻塞,只会造成等待。阻塞时系统设计问题,等待是资源征用问题。最常见的latch争用而等待的----共享池中latch争用,数据缓冲池latch的争用。
1.2、对于Latch的请求,不用排队等待资源,由于Latch的分配相当随机,所以当Latch释放后,不管哪个会话请求都可能得到它,当不能获得Latch的会话,就会在后续不断的重试(spin->sleep->spin…->get
在一台多CPU
1.3、Latch请求的类型:willing-to-wait和immediate。
1.3.1
如果一个进程在第一次尝试中没有获得latch,那么它会等待并且再尝试一次,如果经过_spin_count次争夺不能获得latch,
1.3.2
如果该闩不能立即得到的话,那么该进程就不会为获得该latch而等待。它将继续执行另一个操作。
1.3.3
(以下字段反映了Willing-to-wait类型请求)
GETS:成功地以Willing-to-wait请求类型请求一个latch的次数。
MISSES:初始以Willing-to-wait请求类型请求一个latch不成功的次数。
SLEEPS:初始以Willing-to-wait请求类型请求一个latch不成功后,进程等待获取latch的次数。
(以下字段反映了Immediate类型请求)
IMMEDIATE_GETS:以Immediate请求类型成功地获得一个latch的次数。
和BUFFER
buffer cache就是一块含有许多数据块的内存区域,这些数据块主要都是数据文件里的数据块内容的拷贝,那么数据的查询和修改都要通过它来完成。接下来就看看访问数据的流程是怎样的
1
(Y)
(N)
2
2.1图中右边的有一块Buffers
2.2图中左边的有许多Buffer
2.3:图中左边的有许多实线箭头,这些箭头(其实就是数据结构的链表结构中的指针)将不同的Buffer
Header连接成一条Hash
Chain,这边也就是Cache
Buffers Chain(双向链表。
2.4:另外,还有一个Hash:
Bucket,其实这只是一个逻辑上的概念,即每一个Hash
Bucket都会有一条Hash
每当将一个Block读入到Buffer
1).存放该Block在Buffer
2
3
4).存储lru,lruw,ckptq等队列,一样是通过记录前后Buffer Header指针方式实现
5).当前该Buffer
Header所对应的数据块的状态以及标记
6).该Buffer
7
2.5:最后,在看看Hash
SYS@ prod>select count(*) from x$bh; --用这句查出buffer的个数,
----------
查询隐含参数可参考
select
from
where
order by
/
NAME
---------------------------------------- ---------- --------- ---------- -----
_db_block_hash_buckets
_db_block_hash_latches
关于_db_block_hash_buckets参数的取值:据说在8i下,该参数缺省db_block_buffers×2;但是到了9i以后,该参数似乎取的是小于且最接近于db_block_buffers×2的素数。
在ORACLE
10G和11G中,默认值是大于2倍的buffer数量的最小的2的幂的值。举例如buffer数量是13322,2倍就是26644,那么大于26644的最小的2的幂的值是32768,也就是就会有32768个hash
bucket。
一条hash chain上的buffer header数量,没有固定限制(CR块有限制,一条hash chain上的CR块不能超过6个)。从隐含参数_db_block_max_cr_dba中可以查到这个限制:
NAME
---------------------------------------- ---------- --------- ---------- -----
_db_block_max_cr_dba
判断是否有过长的hash
chain的语句:过长的hash
chain更容易引起热链进而引起CBC
LATCH
SYS@ prod>select * from (select hladdr,count(*) from x$bh group
by hladdr order by 2 desc) where rownum<5;
HLADDR
-------- ----------
3E2A7088
3E27D788
3E2AABE8
3E2BD9C0
hash latch:就是latch:cache buffers chains --CBC LATCH
用于保护hash chain结构,一个CBC LATCH管理着多个hash chain
1.服务进程需要扫描hash
chain上的buffer
header时或者叫要读取buffer
cache中数据块,
2.服务器进程要将新读入的数据块挂载到hash
chain上时
SYS@ prod>select count(*) from v$latch_children where name like '�che buffers chains%';
----------
每个pool会有至少8个“Latch:cache buffers lru chain”.
NAME
---------------------------------------- ---------- --------- ---------- -----
_db_block_lru_latches
working set与lru latch一一对应。lru latch的数量是由一个隐藏参数:_db_block_lru_latches决定的。该参数缺省值为DBWR进程的数量×8。该参数最小必须为8,如果强行设置比8小的数值,oracle将忽略你设置的值,而使用8作为该参数值。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22066721/viewspace-1115148/ ,如需转载,请注明出处,否则将追究法律责任。