《Oracle高性能自动化运维》一一2.1 闩(Latch)

2.1 闩(Latch)
2.1.1 Latch简介
对于对称多处理机(SMP)系统而言,在同一时间点,所有CPU都可以请求修改同一内存。在理想状态下,“请求”“更改”操作是由单个CPU独立完成的,而不会被拆分成多个时间片处理。在特殊情况下,“请求”“更改”操作将被拆分成多个时间片处理,这时操作系统就会使用上下文结构来保护内存数据的完整性。
Oracle 闩(Latch)的作用与上下文类似,主要是用于保护Oracle内存结构被独占访问、修改,以防止非法的内存数据篡改,保证内存数据的完整性。常见的Latch有:
Library Cache Latch:保护Library Cache内存结构;
Shared Pool Latch:保护Shared Pool内存结构;
Cache Buffers Chain Latch:保护Cache Buffers Chain内存结构;
Cache Buffers LRU Chain Latch:保护Cache Buffers LRU Chain内存结构。
2.1.2 Latch Level
当CPU执行作业的时候,操作系统可以通过中断、异常等方式来“打断”CPU当前正在执行的任务,从而将CPU资源释放出来供更优先的进程使用。
优先级的概念大家并不陌生,在日常生活中也随处可见。例如,我们可以将车道当作CPU,普通车辆当作Process A,消防车辆当作Process B。当消防车辆(Process B)需要占用车道(CPU)时,由于消防车辆(Process B)使用车道(CPU)的优先级高于普通车辆(Process A),那么消防车辆(Process B)将优先占用车道资源(CPU),即使普通车辆(Process A)已经占用了车道(CPU),也会让出车道资源(CPU)优先给消防车辆(Process B)使用。可以看出,优先级主要是用于调度资源使用先后顺序的。
Oracle Latch Level功能与优先级类似,主要用于Latch资源的调度。Latch Level的特点如下:
Latch Level被预定义在Oracle系统中;
Latch Level范围在0~16之间(11g);
Latch Level用于调度保护内存结构,缓解修改内存结构时产生的Latch争用。
可以通过查询v$latch获取Latch Level相关信息,如下所示:

2.1.3 Latch获取模式
在介绍Latch获取前,先了解几个与Latch获取相关的概念。
自旋(Spin):Spin表示“自旋”,即当Latch被某个Process独占时,另外一个Process也想获取该Latch,由于独占的特性使得另一个Process处于Spin状态:自旋等待。Latch Spin阈值由参数spin_count决定,如下所示:

休眠(Sleep):当Process Spin等待达到spin_count阈值时,Process就会放弃获取Latch资源,进入短暂的休眠状态。当Latch资源被释放后,系统将唤醒(Wake-Up)该Process继续获取该Latch。
上下文切换(Context Switch):对于多任务处理系统而言,CPU需要处理所有的程序操作。当用户进程来回切换程序时,需要记录这些进程执行的状态信息。上下文切换允许记录、恢复处于正在运行状态的程序,保证程序间能够顺利完成上下文切换操作。
在上下文切换过程中,CPU会停止处理当前正在处理的程序,并保存当前程序的运行状态信息以便后续断点运行。从这个角度来看,上下文切换有点类似书的页码,在来回切换书页的同时,需要记住当前书页的页码以便快速切换。在操作系统中,上下文切换过程中的“页码”信息保存在进程控制块(PCB)中。
上下文切换主要发生在以下几种场景:
中断处理;
多任务处理;
用户状态切换。
在中断处理中,其他程序“打断”了当前正在运行的程序,当CPU接收到中断请求时,会在正在运行的程序和发起中断请求的程序之间进行一次上下文切换;在多任务处理中,CPU会在不同程序之间来回切换,每个程序都有相应的处理时间片,CPU在两个时间片的间隔中进行上下文切换;对于一些特殊的操作系统,当进行用户状态切换时也会进行一次上下文切换。
Latch获取的相关概念就介绍到这里,接下来我们继续讨论Latch获取的两种模式。

  1. No-Wait模式
    No-Wait模式适用场景:当Process请求获取Latch时,Latch资源池中有空闲的Latch资源。在这种模式下,获取Latch的主要步骤如下:

1)Oracle Process尝试获取一个Latch,这个过程不需要Spin和Sleep;
2)更新CPU上下文内容,实现上下文切换;
3)当请求获取的Latch没有被其他Process占有(Free)时,那么就可以立即获取到该Latch;
4)当获取的Latch已经被其他进程抢先独占了(Busy),那么就搜索下一个空闲的Latch,直到找到符合步骤3)的Latch。

  1. Willing-To-Wait模式
    Willing-To-Wait模式适用场景:当Process请求获取Latch时,Latch资源池中没有空闲的Latch资源。在这种情况下,需要使用Willing-To-Wait模式获取Latch资源。Willing-To-Wait模式分为两种获取类别:

Immediate Get:一次快速获取,不需要Spin;
Spin Get:需要Spin等待。
当Latch获取失败后,将会不断地重试获取:Spin或者Sleep等待;
在等待Latch 释放的过程中,处于Spin或者Sleep状态;
在未达到spin_count阈值前,等待时间累积增加;
当达到spin_coun阈值时,如果仍然没获取到Latch,则会记录Latch Miss信息。在这种情况下,需要人为干预进行优化调节。
2.1.4 Latch获取等待

  1. Latch获取等待原理
    Latch获取等待原理如图2-1所示。

通过图2-1不难看出:
Process A独占该Latch;
Process B想要获取该Latch,那么只能等待;
Process B在等待过程处于Spin或者Sleep状态;
Process B等待获取该Latch时等待超时,则继续等待或者放弃获取该Latch。

  1. Latch获取等待命中率
    当Latch获取等待超过阈值后,就会将Latch Miss记录到系统统计信息中,因此需要关注Latch获取等待的命中率,如下所示:


可以看出,ALL LATCHES的获取命中率为83.57%,相对比较低。一般而言,如果Spin获取命中率超过90%,那么Latch获取就是比较优化的。因此对于上述示例,需要进行Spin获取优化。
与此同时,考虑到Latch获取性能,我们还需要关注Latch获取等待休眠率,如下所示:

可以看出,Latch的休眠率比较低,因此不需要对Latch Sleep进行优化。
2.1.5 Latch资源清理回收
当Latch资源被释放或者在Latch持有时系统发生异常,Oracle将会对Latch资源进行清理回收:
正常情况下,Latch调用自己特有的清理方法完成Latch资源清理回收;
在异常的情况下,如果Process在获取Latch过程中由于某些原因“死掉”,那么受到该Latch保护的内存结构可能会出现异常,这时PMON进程会介入,进行清理操作;
PMON清理操作将恢复异常状态的内存结构;
当清理结束后,PMON释放Latch资源供其他Process获取。
我们可以通过查询x$kgllc(10g)获取Latch清理信息,如下所示:

时间: 2024-07-30 06:52:52

《Oracle高性能自动化运维》一一2.1 闩(Latch)的相关文章

《Oracle高性能自动化运维》一一导读

Preface 前 言 为什么要写这本书 2008年的某一天,我怀着激动的心情参加了支付宝公司的面试,这次面试让我对国内最前沿的数据库自动化运维技术有了初步的认识,对我的职业生涯影响非常大,时刻激励着我以后不管遇到什么困难或者诱惑,Oracle始终都是我追逐的爱好和目标. 在接下来几年的工作中,我较为深入地研究了C语言数据结构.Linux操作系统原理以及Shell(PHP/Java)编程等知识,这些技术能够很好地支撑Oracle运维管理.同时,多年的经验告诉我,对集运维与开发于一体的Oracle

《Oracle高性能自动化运维》一一第1章 Linux下的Oracle 1.0

**第1章Linux下的Oracle 1.0**众所周知,Oracle数据库与Linux操作系统是行业内使用最为广泛.功能最为强大的数据库/操作系统之一.随着企业业务的不断发展,越来越多的Oracle数据库被部署在Linux环境中,以提供核心业务数据的支撑.与此同时,随着人们对Oracle运维管理经验的不断积累,大部分数据库管理员对Linux环境下的Oracle认识也越来越深刻,然而也有部分数据运维人员对于Linux环境下的Oracle内存分配存在疑惑.本章就Oracle与Linux内存关系进行

《Oracle高性能自动化运维》一一第1章 Linux下的Oracle

第1章 Linux下的Oracle 众所周知,Oracle数据库与Linux操作系统是行业内使用最为广泛.功能最为强大的数据库/操作系统之一.随着企业业务的不断发展,越来越多的Oracle数据库被部署在Linux环境中,以提供核心业务数据的支撑.与此同时,随着人们对Oracle运维管理经验的不断积累,大部分数据库管理员对Linux环境下的Oracle认识也越来越深刻,然而也有部分数据运维人员对于Linux环境下的Oracle内存分配存在疑惑.本章就Oracle与Linux内存关系进行讲解,帮助读

《Oracle高性能自动化运维》一一2.4 Buffer Cache

2.4 Buffer Cache 2.4.1 Buffer(Cache)Pool 1. Buffer(Cache)Pool组成结构 Oracle Buffer Cache由3个Buffer Pool组成,如图2-9所示. 其中: Default Pool:默认池,用于缓存常规数据: Keep Pool:保留池,主要用于缓存频繁更新的小表: Recycle Pool:回收池,用于缓存随机使用的大表. 2. Buffer Pool与Working Set Buffer Pool与Working Se

《Oracle高性能自动化运维》一一1.4 Linux内存体系与Oracle内存空间

1.4 Linux内存体系与Oracle内存空间1.4.1 Linux用户空间与内核空间 一般来说,Linux操作系统把虚拟地址空间划分为用户空间和内核空间.例如x86架构下的32位Linux虚拟地址空间是4GB(0x0000 0000-0xffff ffff),其中大致将前3GB(0x0000 0000-0xbfff ffff)划分为用户空间,后1GB(0xc000 0000-0xffff ffff)划分为内核空间. 用户程序只能在用户模式(用户空间)下执行,而不能访问特权模式(内核空间)的数

《Oracle高性能自动化运维》一一1.5 小结

1.5 小结 本章主要介绍了Linux环境下Oracle用户空间与系统空间的关系,结合Oracle SGA与PGA分配规则,着重对Linux内核参数kernel.shmall和kernel.shmmax进行介绍,帮助读者规划Linux环境下Oracle内存分配的同时,还提供了Oracle内存优化的一个重要途径. 参考文档 [1] Database Installation Guide for Linux(Oracle Corporation)

《Oracle高性能自动化运维》一一2.3 Library Cache

2.3 Library Cache2.3.1 Library Cache与SQL游标 Library Cache主要用于存放SQL游标,而SQL游标最大化共享是Library Cache优化的重要途径,可以使SQL运行开销最低.性能最优. 1. SQL语句与父游标及子游标 在PL/SQL中,游标(Cursor)是数据集遍历的内存集合.而从广义上讲,游标是SQL语句在Library Cache中的内存载体.SQL语句与游标关系如下: 1)一条SQL语句包含一个父游标(Parent Cursor)和

《Oracle高性能自动化运维》一一

1.3 Linux内存体系的优势 许多接触过Oracle的朋友可能会有一些感慨,在Windows操作系统和Linux操作系统下管理Oracle是完全不一样的.其实不尽然,Windows下的Oracle在服务中只能看见一个类似ORCL的服务,同时在Windows任务管理器中也只能看见一个Oracle进程,而数据库后台进程则不可见. Windows下的Oracle服务,如图1-1所示. 图1-1 Windows下的Oracle服务 Windows任务管理器中的Oracle进程,如图1-2所示. 图1

《Oracle高性能自动化运维》一一2.2 队列锁(Enqueue Lock)

2.2 队列锁(Enqueue Lock)2.2.1 Lock与Latch的区别 Oracle锁(Lock)也被称为队列锁(Enqueue Lock),而Latch则被称作为"细粒度"的锁.Lock与Latch的区别如表2-1所示. 不难看出: Oracle使用Latch保护内存数据被间歇地.短持续地访问: Latch不适合保护持续时间相对较长的资源(Resource),在这种情况下,就需要使用Lock持续锁定: Lock允许并发等待:当前不可获取的Resource会被放入请求队列中进

《Oracle高性能自动化运维》一一3.4 Redo优化

3.4 Redo优化从前面的内容可以知道,Oracle Redo的产生主要是由DML事务引起的,与DML事务相关的数据库更改主要包含:数据块更改:回滚段数据块镜像更新:数据库内部信息更新(数据字典表更新).可以通过日志挖掘获取数据库更改的相关信息,如下: 可以看到,Redo中记录了DML事物的数据块更改.回滚段更新等信息.因此,可以考虑采取以下措施来减少Redo的产生,从而达到优化Redo的目的:减少索引键更新操作:减少大表(键)更新操作:使用Direct Load加载数据:使用Nologgin