`
kiddwyl
  • 浏览: 403503 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Oracle latch竞争总结(一)

阅读更多
    在Oracle中,Latch的概念是非常重要的,v$latch表的每一行包括了对不同类型latch的统计,每一列反映了不同类型的latch请求的活动情况。不同类型的latch请求之间的区别在于,当latch不可立即获得时,请求进程是否继续进行。按此分类,latch请求的类型可分为两类:willing-to-wait和immediate。

    latch free,相信跟大家并不陌生,在v$session_wait和Top5中会出现,当然出现类似的内容,就证明Latch产生了竞争,并且已经影响到了你的系统性能。

    首先我们来列举一下Latch出现竞争的几种常见情况:
        1、cache buffers chains
       2、shared pool
       3、library cache

    当然,我们需要一个一个来进行解释和分析,首先我们先来说下cache buffers chains


关于LATCH产生得解释:

Blocks in the buffer cache are placed on linked lists(cache buffer chains) which hang off a hash table.
The hash chain that a block is placed on is based on the DBA and CLASS of the block. Each hash chain is
protected by a single child latch. Processes need to get the relevant latch to allow them the scan a hash chain for a buffer so that the linked list does not change underneath them.

Contention for these latches can be caused by:

- Very long buffer chains.
- very very heavy access to the same blocks.

现在对数据库的实际操作过程:

SQL> select count(*)
  from v$latch_children
where misses > 0
   and name = 'cache buffers chains';

COUNT(*)
----------
2048

SQL> select addr, name, misses
  from v$latch_children
where misses > 0
   and name = 'cache buffers chains'
order by misses desc;
ADDR NAME MISSES

-------- ---------------------------------------------------------------- ----------
69CC28BC cache buffers chains 1591
69A3CF1C cache buffers chains 1591
69CBDDFC cache buffers chains 1589
69B92DFC cache buffers chains 1586
69C5DEBC cache buffers chains 1585
69AB0354 cache buffers chains 1585
69A70F9C cache buffers chains 1585
69A81F54 cache buffers chains 1585

SQL> select bh.addr, obj.name obj_name, bh.tch touch
  from x$bh bh,
       sys.file$ f,
       v$datafile fl,
       sys.obj$ obj,
       sys.ts$ ts
where fl.file# = f.file#
   and bh.file# = fl.file#
   and obj.dataobj# = bh.obj
   and bh.ts# = ts.ts#
   and bh.HLADDR in(
     select addr from v$latch_children where misses>0 and name='cache buffers chains'
   )
   and bh.tch > 0
order by bh.tch desc;

ADDR OBJ_NAME                           TOUCH
-------- ------------------------------ ----------
B6FD3078 IDX_GCTID_IUID_GM634           24
B6FD3078 REG_LOG                        8
B6FD2F9C AGENT_CARD_TYPE                7
B6FD3078 RESELLER_AGENTCARD_PRICE       6
B6FD3078 RESELLER_LOG                   6
B6FD3078 IDX_ACL_AGENTID_LOGTIME        6
B6FD3078 RESELLER_LOG                   6

就是上面涉及到的这些对象,造成LATCH

SQL> select COUNT(*)
  from x$bh bh, sys.file$ f, v$datafile fl, sys.obj$ obj, sys.ts$ ts
where fl.file# = f.file#
   and bh.file# = fl.file#
   and obj.dataobj# = bh.obj
   and bh.ts# = ts.ts#
   and bh.HLADDR = [x$bh.addr] --物理地址
   and bh.tch > 0;

COUNT(*)
----------
51


一段文档资料:

Under 8.0, the default was next_prime(db_block_buffers/4), and the
number of _db_block_hash_latches was 1:1 with the number of buckets.
Under 8i, the world changed a lot. The default number of hash buckets
is 2 * db_block_buffers, but the latches work differently. It's
really not necessary to have one latch per hash chain, so, Oracle made
them a pooled resource. When you need to interrogate a hash chain,
you grab a latch from the pool and assign it to a hash chain. That
prevents anyone else from modifying the chain or it's contents while
your process is using it. So, in 8i, the size of the latch pool is
dynamic but is set to 1024 for most cases. It's smaller for very
small buffer caches and larger for very large buffer caches. The
formula is:
if (db_block_buffers < 2052) then
db_block_hash_latches = 2^trunc(log(2,db_block_buffers - 4) - 1)
else if(2052 =< db_block_buffers <= 131075) then
db_block_hash_latches = 1024
else if(db_block_buffers > 131075)
db_block_hash_latches = 2^trunc(log(2,db_block_buffers - 4) - 6)
end if

So, under 8i, you probably don't need to touch _db_block_hash_buckets,
as 2 * db_block_buffers is almost certainly more than adequate. And
unless you're dealing huge numbers of concurrent users and a
relatively small buffer cache, you probably don't need to mess with
_db_block_hash_latches, either.

增大 _db_buffer_hash_latches 可以更快速的查找到 blocks 并且降低 cache buffer chains 等待
我的操作系统是9I,db_block_buffers 为DB_CACHE_SIZE,如果我调整此参数,那么我应该是采取
db_block_hash_latches = 2^trunc(log(2,DB_CACHE_SIZE - 4) - 6)

SQL> show parameter db_cache_size;

NAME TYPE VALUE
------------------------------------ -------------------------------- ------------------------------
db_cache_size big integer 1073741824

SQL> select name,
       value,
       decode(isdefault, 'TRUE', 'Y', 'N') as "Default",
       decode(ISEM, 'TRUE', 'Y', 'N') as SesMod,
       decode(ISYM, 'IMMEDIATE', 'I', 'DEFERRED', 'D', 'FALSE', 'N') as SysMod,
       decode(IMOD, 'MODIFIED', 'U', 'SYS_MODIFIED', 'S', 'N') as Modified,
       decode(IADJ, 'TRUE', 'Y', 'N') as Adjusted,
       description
  from ( --GV$SYSTEM_PARAMETER
        select x.inst_id as instance,
                x.indx + 1,
                ksppinm as name,
                ksppity,
                ksppstvl as value,
                ksppstdf as isdefault,
                decode(bitand(ksppiflg / 256, 1), 1, 'TRUE', 'FALSE') as ISEM,
                decode(bitand(ksppiflg / 65536, 3),
                       1,
                       'IMMEDIATE',
                       2,
                       'DEFERRED',
                       'FALSE') as ISYM,
                decode(bitand(ksppstvf, 7), 1, 'MODIFIED', 'FALSE') as IMOD,
                decode(bitand(ksppstvf, 2), 2, 'TRUE', 'FALSE') as IADJ,
                ksppdesc as description
          from x$ksppi x, x$ksppsv y
         where x.indx = y.indx
           and substr(ksppinm, 1, 1) = '_'
           and x.inst_id = USERENV('Instance'))
where name = '_db_block_hash_latches'
order by name;

NAME VALUE
------------------------------ ---------------
_db_block_hash_latches 2048

SQL> select power(2,trunc(log(2,1073741824 - 4) - 6)) from dual;

POWER(2,TRUNC(LOG(2,1073741824-4)-6))
-------------------------------------
8388608

    总得来说,LATCH产生得原因还是从应用入手,不要期望通过调整某些参数达到立杆见影的效果,热块、大的逻辑读和物理读,全表扫描都是会导致产生LATCH得原因。

分享到:
评论

相关推荐

    学习动态性能表(11)--v$latch$v$latch_children

    **V$LATCH视图**提供了自实例启动以来latch的统计信息,有助于诊断和优化数据库性能,特别是当在v$session_wait视图中发现latch竞争时。这个视图包含以下列: 1. **NAME**: latch的名称,标识不同的数据结构保护...

    深入解析Oracle

    在Oracle数据库领域,“深入解析Oracle - 栓锁竞争与Latch优化实践”这一主题旨在探讨Oracle内部机制中的一个重要方面——闩锁(latch)的管理与优化。闩锁是Oracle用于控制对共享内存结构访问的一种轻量级同步机制。...

    oracle性能调整总结

    1. Latch:用于多线程环境下的同步,过多的 latch 竞争可能成为性能瓶颈。 2. 锁管理:理解不同类型的锁(如行级锁、表级锁)及其行为,避免死锁。 七、硬件与操作系统优化 1. I/O优化:高速磁盘、RAID配置、固态...

    latch Contention

    本文提供了Oracle RDBMS如何利用锁(latches)保护共享内存(SGA)的概述、常见的锁竞争原因及其解决方案,并总结了Quest Software进行的一些研究,该研究表明调整(现在是未公开的参数)`_spin_count`能够有效地缓解...

    tuning-latch-contention_cbc.pdf

    描述部分提到了针对Oracle数据库中的Latch Contention(闩锁竞争)进行的最佳实践调优方法。具体问题为高CPU使用率伴随应用性能不佳,通过Statspack报告发现存在大量的Latch Free Wait事件,并且数百个会话正在等待...

    oracle 锁的概念

    3. **内部锁或LATCH**:这一类锁主要用于Oracle内部的并发控制,比如保护共享内存结构不受并发操作的影响。这类锁通常是自动管理的,并且对于大多数应用程序开发者来说是透明的。 #### 三、DML锁详解 DML锁是...

    Oracle8i Internal Services for Waits, Latches, Locks,and Memory

    《Oracle8i Internal Services for Waits, Latches, Locks, and Memory》是一本深入探讨Oracle数据库内部机制的专业书籍,对于想要深入了解Oracle数据库性能调优的读者而言具有很高的参考价值。通过掌握书中的知识点...

    oracle 常见等待事件:影响性能-性能优化

    在Oracle数据库中,等待事件是指数据库实例在执行某个操作过程中由于资源竞争或限制而处于等待状态的情况。这些等待事件可能导致数据库性能下降,进而影响到整体的应用性能。因此,理解和分析这些等待事件对于优化...

    oracle等待事件

    Oracle数据库运行过程中,由于资源竞争、I/O延迟等原因,会存在各种各样的等待事件。这些等待事件直接影响到数据库的响应时间和整体性能。因此,对等待事件进行监控和分析是提高数据库性能的重要手段之一。 #### 二...

    Oracle运维最佳实践-下.pdf 带书签

    - 调整`SHARED_POOL_SIZE`以减少Library Cache latch竞争。 - 使用`DBMS_STATS`定期收集统计信息,确保CBO(Cost-Based Optimizer)做出准确的决策。 - **2.1.3 Session Snap** - Session Snap是一种性能监控...

    oracle最重要的9个动态性能视图

    共享池是Oracle SGA的一个重要组成部分,管理好其中的对象对于减少资源竞争和提高响应时间至关重要。 ### 总结 以上九个动态性能视图是Oracle数据库性能优化的核心工具。通过对它们的深入理解和应用,可以有效地...

    Oracle数据字典.pdf )

    Oracle 数据库中的数据字典是一系列系统表和视图的集合,用于存储数据库元数据。这些元数据包括了数据库对象(如表、视图、索引等)的定义、权限信息、以及数据库的状态信息等。下面列举了一些常用的数据字典条目...

    企业级IT架构分享 云计算架构师成长之路 Oracle性能优化精髓 共14页.pdf

    - **竞争调优**:解决回滚段、锁、latch等问题。 - **操作系统调优**:调整共享内存段大小、文件缓存大小等。 ### 三、Oracle性能优化的“供需关系” - **平衡策略**:Oracle性能优化的本质在于实现资源间的平衡,...

    oracle常用查询

    Latch Contention查询返回最大的关键闩锁竞争百分比,即在所有关键闩锁中,哪一个具有最高的竞争率。高竞争率可能表明并发控制机制存在瓶颈,需要调整初始化参数或优化代码逻辑,以减少资源竞争,提高事务处理能力。...

    Oracle 11G Performance Tuning - sg2

    例如,频繁的 latch 等待可能意味着锁竞争问题,而 buffer busy waits 则可能提示数据块竞争或缓存不足等问题。 7. **索引和分区策略**: - 正确使用索引可以大幅减少查询所需的时间。同时,通过分区技术可以将大...

    java代码绑定时间

    本文将围绕“Java代码绑定时间”这一主题,深度剖析在Java程序中使用Oracle绑定变量的必要性及其对数据库性能的影响。 #### 一、硬解析与软解析:数据库性能的双刃剑 在Oracle数据库中,SQL语句的执行通常涉及两个...

    北京银行Foglight数据库监控产品测试报告v1.0.docx

    - **数据库Latch监控**:监控Latch竞争,提升并发处理能力。 - **Redo日志监控**:确保redo log的健康状态,防止数据丢失。 测试过程中,Foglight展示了强大的数据库监控能力,能够实时报警、生成性能图表,并...

    大数据分析的案例、方法与挑战.docx

    3. **性能监控**:通过Oracle的AWR(Automatic Workload Repository)报告来监控系统的性能问题,发现Buffer Cache的使用率高,存在Latch竞争等问题。 4. **解决方案**:为了解决上述问题,研究团队采取了多种策略,...

Global site tag (gtag.js) - Google Analytics