《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相关信息,如下所示:
《Oracle高性能自动化运维》一一2.1 闩(Latch)
《Oracle高性能自动化运维》一一2.1 闩(Latch)

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

休眠(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所示。《Oracle高性能自动化运维》一一2.1 闩(Latch)

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

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

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

可以看出,ALL LATCHES的获取命中率为83.57%,相对比较低。一般而言,如果Spin获取命中率超过90%,那么Latch获取就是比较优化的。因此对于上述示例,需要进行Spin获取优化。
与此同时,考虑到Latch获取性能,我们还需要关注Latch获取等待休眠率,如下所示:
《Oracle高性能自动化运维》一一2.1 闩(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清理信息,如下所示:
《Oracle高性能自动化运维》一一2.1 闩(Latch)
《Oracle高性能自动化运维》一一2.1 闩(Latch)

上一篇:自动化测试--protractor


下一篇:VDI序曲二十七 IE7,IE8,IE9应用程序虚拟化