串行化 - 数据库系统本身是一个多用户并发处理系统,在同一个时间点上,
可能会有多个用户同时操作数据库, 多个用户同时在相同的物理位置上写数
据时,不能发生互相覆盖的情况,这叫做串行化,串行化会降低系统的并发性,
但这对于保护数据结构不被破坏来说则是必需的。
在Oracle数据库中,通过闩锁(latch)和锁定(lock)来解决这两个问题。
Latch与Lock --
闩锁和锁定既有相同点又有不同点。相同点在于它们都是用于实现串行化的
资源。而不同点则在于闩锁(Latch)是一个低级别、轻量级的锁,获得和释
放的速度很快,以类似于信号灯的方式实现。而锁定(Lock)则可能持续的时
间很长,通过使用队列,按照先进先出的方式实现。也可以简单地理解为闩锁
是微观领域的,而锁定则是宏观领域的。
10.1 闩锁(latch)概述
什么是Latch ---
Oracle数据库使用闩锁(latch)来管理SGA内存的分配和释放.
Latch是用于保护SGA区中共享数据结构的一种串行化锁定机制。Latch的实现
是与操作系统相关的,尤其和一个进程是否需要等待一个latch、需要等待多
长时间有关。
Latch是一种能够极快地被获取和释放的锁,它通常用于保护描述buffer cache
中block的数据结构。与每个latch相联系的还有一个清除过程,当持有latch的
进程成为死进程时,该清除过程就会被调用。Latch还具有相关级别,用于防止
死锁,一旦一个进程在某个级别上得到一个latch,它就不可能再获得等同或低
于该级别的latch。
Latch的种类 ---
sga有多个latch 用来保护各种内存结构,latch有40余种,但作为DBA
关心的主要应有以下几种:
Cache buffers chains latch: 当用户进程搜索SGA寻找database cache
buffers时需要使用此latch。
Cache buffers LRU chain latch: 当用户进程要搜索buffer cache中包括
所有dirty blocks的LRU (least recently used) 链时使用该种latch。
Redo log buffer latch: 这种latch控制redo log buffer中每条redo
entries的空间分配。
Row cache objects latch: 当用户进程访问缓存的数据字典数值时,将
使用Row cache objects latch。
Latch如何工作 ---
比如A进程需要更新58号数据块,对应服务器进程将58号数据块读入data buffer
中,要向data buffer中的58号数据块(在data buffer中内存单位是数据块)写数
据时,必须先获得latch,然后开始写动作,如果在A正在写入的过程中,B进程
也要写58号数据块,这时B尝试获得在58号数据块上的latch,发现该latch正被其
它用户A持有,B进入等待状态,直到A写完数据块并释放latch后,B才能获得latch,
获得latch后才能向58号数据块写入数据。否则如果没有latch保护,那么A,B
同时写同一个物理地址(内存空间)会导致数据覆盖而出现数据混乱。
事实上,latch不仅仅用于写数据块,比如对于shared pool来说,其内存单位就不
是数据块了(而是chunk)。latch也不仅仅用于写操作,只要涉及内存地址的读和写,
都需要通过获得latch来实现串行化,一次只能有一个服务器进程在读或者写内存
地址。
Oracle在实例管理中,不管是buffer cache、shared pool还是log buffer,都引
入了各种各样的latch。
-- 备注: log buffer的最小内存单位是OS block.
实现latch时,实际是由操作系统的旗语(semaphore:也叫信号量)来完成的。
为了便于理解,可以把它们想象为,通过某个变量值的变化而实现的。变量值
为0则说明latch当前没有被其他进程获取,否则如果为非0值,则说明它已经被
其他进程所获取了。Oracle在设计latch的时候将其定义为轻量级锁,因此它的
操作非常快,以微秒(microsecond,也就是百万分之一秒)来计算。
-------------------------------------------------------
网络文摘:
任何时候,只有一个进程可以访问内存中的某一个块,会话A在调整一个LRU链表
的时候,其它的会话就不能读取和调整这个链表了,latch所做的就是保护这一点。
备注: 内存中的块针对buffer cache,shared pool及log buffer而言大小单位
分别是oracle block, chunk及os block ???
http://blog.csdn.net/Jermaine/archive/2010/08/01/5780661.aspx
http://edu.cnzz.cn/NewsInfo/28727.aspx
http://blog.csdn.net/Jermaine/archive/2010/08/01/5780661.aspx
latch是一种低级的串行化设备,它是为了保护SGA共享内存结构免受并发访问带
来的潜在性破坏而引入的一种串性化手段,它只与SGA共享内存结构有关,与数据
库对象无关。绝大多数latch是独占性访问,只有少数共享latch允许并发读。
-------------------------------------------------------
-- Latch的种类
A. 愿意等待(Willing-To-Wait)
SPIN - SPIN 就是一个进程独占CPU time,直到运行的结束。这个期间其他
进程不能获得这个CPU的运行时间。Oracle 允许一个进程循环spin 一颗CPU
(当然需要OS支持)。 单CPU 没有SPIN的概念了。
大部分的latch都属于这种类型(Willing-To-Wait)。这种类型的latch都是
通过Test-And-Set的方式来实现的。也就是说,如果当前进程不能获得latch
的时候,会绕着CPU旋转但不放弃CPU(占用)。这也就是所谓的SPIN CPU.
如果进程不能马上获得latch,会绕着CPU转一会(占着CPU),然后再次尝试
获得latch,如果仍然不能获得,则再次旋转CPU。当反复旋转CPU并尝试获
得latch的的次数超过某个上限(该上限由隐藏参数控制)时,这时进程
会释放CPU,并进入睡眠(Sleep)状态。进程一旦进入睡眠状态,则会抛出
一个对应的等待事件,并记录在视图v$session_wait里,说明当前该进程
正在等待的latch的类型等信息。 初始状态下,一个进程会睡眠0.01秒。
然后醒过来,并再次尝试获得latch。如果旋转CPU的次数达到上限以后,
仍然不能获得latch,则再次进入睡眠,这时会睡眠两倍的时间,依此类推,
直到达到睡眠的最大值:0.2秒。这是在数据库服务器具有多个CPU时的情形,
如果只有一个CPU,就不存在旋转CPU(SPIN CPU)的情况,一旦获得不了
latch,就进入睡眠。
总的来说,当进程尝试获取Willing-To-Wait类型的latch时,如果失败,
则进程会一直尝试对latch的获取,不断循环,直到获得latch为止,或
者是达到所指定的上限值为止。当达到上限值时,进程进入睡眠。
B. 不等待(No-Wait)
这种类型的latch比较少,对于这种类型的latch来说,都会有很多个
可用的latch。当一个进程请求其中的一个latch时,会以no-wait模式
开始请求。如果所请求的latch不可用,则进程不会等待,而是立刻请
求另外一个latch。只有当所有的latch都不能获得时,才会进入等待。
备注:latch是用于保护SGA区中共享数据结构的一种串行化锁定机制。
它不仅仅用于buffer cache, 还用于shared pool以及log buffer等。
-- Latch资源争用
如果latch资源被争用,通常都会表现为CPU资源使用过高。
而反过来说,如果我们发现CPU资源很紧张,利用率总是在90%以上,
甚至总是在100%,其主要原因有以下几点。
A. SQL语句没有使用绑定变量。如果没有使用绑定变量,要非常频繁
地读写shared pool里的内存块,从而导致与解析SQL相关的latch争用。
B. 执行SQL语句时,扫描的数据块过多,或者说SQL语句写的比较低效,
导致要扫描很多的数据块才能返回所要的记录。因为在查找、扫描数
据块的过程中,进程也要获得latch,直到找到数据块为止。
为何一旦latch资源发生争用,就会导致CPU繁忙呢?可以想象一下,
假设某个进程(A)执行一条SQL语句需要访问10000个数据块,那么
该进程在扫描数据块的过程中,一直持有latch。而另一个进程B也要
执行SQL,但是由于A持有了latch,导致B无法获得,于是旋转一会CPU,
再去获得latch,直到进入睡眠才释放CPU。接下来C进程也要执行SQL,
同样的,由于A持有了latch,导致C无法获得,于是也旋转一会CPU,
再去获得latch,直到进入睡眠才释放CPU。如果类似B和C的进程很多
的话,那我们会发现,CPU总是在被旋转,也就是在做空的循环,而
无法做其他的事情。因此,体现出CPU的使用率过高。
要解决latch的争用,关键在于共享SQL语句(比如使用绑定变量、
规范SQL的书写等)以及优化SQL语句,使其搜索以及扫描的数据块的
个数下降到最低。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-670623/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/35489/viewspace-670623/
本文介绍了Oracle数据库中的Latch机制,一种用于保护SGA内存结构的串行化锁定机制。详细解释了Latch的工作原理、类型及其与CPU资源争用的关系。
352

被折叠的 条评论
为什么被折叠?



