`
wsql
  • 浏览: 11808785 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

理解redo(7)oracle redo并行机制的原理介绍

 
阅读更多

在前面的blog中,我们知道,redo entries写入log buffer大致的过程如下:

在PGA中生产Redo Entry -> 服务进程获取Redo Copy latch(存在多个---CPU_COUNT*2) -> 服务进程获取redo allocation latch(仅1个) -> 分配log buffer ->

释放redo allocation latch -> 将Redo Entry写入Log Buffer -> 释放Redo Copy latch

由于log buffer是一块“共享”内存,为了避免冲突,它是受到redo allocation latch保护的,每个server process需要先获取到该latch才能分配redo buffer。因此,在OLTP系统中,我们通常可以观察到redo allocation latch的等待事件。

oracle引入shared strand和private strand来实现并行redo buffer分配机制,借此避免高并发下的redo allocation latch等待事件。

1 shared strand

为了减少redo allocation latch等待事件,oracle引入了log buffer的并行机制。其基本原理是,将log buffer划分为多个小的buffer,这些小的buffer被称作shared strand。每一个shared strand受到一个单独的redo allocation latch的保护。多个shared strand的出现,使得原来序列化的redo buffer分配变成了并行的过程,从而减少了redo allocation latch的等待。

shared strand由一些隐藏参数控制:

09:39:59 sys@ORCL (^ω^) col name for a25
09:42:11 sys@ORCL (^ω^) col value for a10
09:42:11 sys@ORCL (^ω^) col description for a55
09:42:11 sys@ORCL (^ω^) select a.ksppinm name,b.ksppstvl value,a.ksppdesc description
09:42:11   2    from x$ksppi a,x$ksppcv b
09:42:11   3   where a.indx = b.indx
09:42:11   4     and a.ksppinm like '%_log_parallelism%'
09:42:13   5  /

NAME                      VALUE      DESCRIPTION
------------------------- ---------- -------------------------------------------------------
_log_parallelism          1          Number of log buffer strands
_log_parallelism_max      2          Maximum number of log buffer strands
_log_parallelism_dynamic  TRUE       Enable dynamic strands  --控制是否允许shared strand数量在_log_parallelism和_log_parallelism_max之间动态变化


每一个shared_strand的大小=log_buffer/(shared_strand的数量):

12:55:40 sys@ORCL (^ω^) select indx,strand_size_kcrfa from x$kcrfstrand where last_buf_kcrfa != '00';

      INDX STRAND_SIZE_KCRFA
---------- -----------------
         0           3512320
         1           3512320

12:58:46 sys@ORCL (^ω^) show parameter log_buffer

NAME_COL_PLUS_S TYPE            VALUE_COL_PLUS_
--------------- --------------- ---------------
log_buffer      integer         7024640
12:58:57 sys@ORCL (^ω^) select 7024640/2 from dual;

 7024640/2
----------
   3512320


关于shared strand的数量设置,16个cpu之内最大默认为2,当系统中存在redo allocation latch等待时,每增加16个cpu可以考虑增加1个strand,最大不应该超过8。
并且_log_parallelism_max不允许大于cpu_count。

2 private strand

为了进一步降低redo buffer的冲突,10g引入了private strand机制,这是从shared pool中分配出来的一块内存空间。每一个Private strand受到一个单独的redo allocation latch保护,每个Private strand作为“私有的”strand只会服务于一个活动事务。获取到了Private strand的用户事务不是在PGA中而是在Private strand生成Redo。当flush private strand或者commit时,Private strand被批量写入log文件中。如果新事务申请不到Private strand的redo allocation latch,则会继续遵循旧的redo buffer机制,申请写入shared strand中。对于未能获取到Private strand的redo allocation latch的事务,在事务结束前,即使已经有其它事务释放了Private strand,也不会再申请Private strand了。

整个事务过程大致如下:

事务开始 -> 申请Private strand的redo allocation latch (申请失败则申请Shared Strand的redo allocation latch) -> 在Private strand中生产Redo Enrey ->

Flush/Commit ->申请Redo Copy Latch -> 服务进程将Redo Entry批量写入Log File -> 释放Redo Copy Latch -> 释放Private strand的redo allocation latch

12:59:30 sys@ORCL (^ω^) select * from v$sgastat where name like '%strand%';

POOL                     NAME                 BYTES
------------------------ --------------- ----------
shared pool              private strands    1198080

13:12:31 sys@ORCL (^ω^) select indx,strand_size_kcrfa from x$kcrfstrand where last_buf_kcrfa = '00';

      INDX STRAND_SIZE_KCRFA
---------- -----------------
         2             66560
         3             66560
         4             66560
         5             66560
         6             66560
         7             66560
         8             66560
         9             66560
        10             66560
        11             66560
        12             66560
        13             66560
        14             66560
        15             66560
        16             66560
        17             66560
        18             66560
        19             66560

已选择18行。
14:53:42 sys@ORCL (^ω^) select 66560*18 from dual;

  66560*18
----------
   1198080


每个Private strand的大小为65K。Private strand的数量受到2个方面的影响:min(logfile的大小,活跃事务数量)

2.1 logfile的大小

参数_log_private_mul指定了使用多少logfile空间预分配给Private strand,默认为5。我们可以根据当前logfile的大小(要除去预分配给log buffer的空间)计算出这一约束条件下能够预分配多少个Private strand。

15:27:25 sys@ORCL (^ω^) select bytes from v$log where status='CURRENT';

     BYTES
----------
  52428800

15:32:30 sys@ORCL (^ω^)  select trunc(((select bytes from v$log where status = 'CURRENT') - (select to_number(value) from v$parameter where name = 'log_buffer'))*
15:35:16   2         (select to_number(val.KSPPSTVL) from sys.x$ksppi nam, sys.x$ksppsv val  where nam.indx = val.indx AND nam.ksppinm = '_log_private_mul') / 100 / 66560)
15:35:16   3          as "calculated private strands"
15:35:16   4     from dual;

calculated private strands
--------------------------
                        34

15:35:22 sys@ORCL (^ω^) select count(1) "actual private strands" from x$kcrfstrand where last_buf_kcrfa = '00';

actual private strands
----------------------
                    18

15:36:03 sys@ORCL (^ω^) alter system switch logfile;

系统已更改。

15:36:22 sys@ORCL (^ω^) select bytes from v$log where status='CURRENT';

     BYTES
----------
  52428800

15:36:46 sys@ORCL (^ω^)  select trunc(((select bytes from v$log where status = 'CURRENT') - (select to_number(value) from v$parameter where name = 'log_buffer'))*
15:36:59   2         (select to_number(val.KSPPSTVL) from sys.x$ksppi nam, sys.x$ksppsv val  where nam.indx = val.indx AND nam.ksppinm = '_log_private_mul') / 100 / 66560)
15:37:00   3          as "calculated private strands"
15:37:00   4     from dual;

calculated private strands
--------------------------
                        34

15:37:01 sys@ORCL (^ω^) select count(1) "actual private strands" from x$kcrfstrand where last_buf_kcrfa = '00';

actual private strands
----------------------
                    18

15:37:19 sys@ORCL (^ω^)


2.2 活跃事务数量

参数_log_private_parallelism_mul用于推算活跃事务数量在最大事务数量中的百分比,默认为10。Private strand的数量不能大于活跃事务的数量。

15:37:19 sys@ORCL (^ω^) show parameter transactions

NAME_COL_PLUS_S TYPE            VALUE_COL_PLUS_
--------------- --------------- ---------------
transactions    integer         187
transactions_pe integer         5
r_rollback_segm
ent
15:42:47 sys@ORCL (^ω^) select trunc((select to_number(value) from v$parameter where name = 'transactions') *
15:44:33   2         (select to_number(val.KSPPSTVL)
15:44:33   3             from sys.x$ksppi nam, sys.x$ksppsv val
15:44:33   4            where nam.indx = val.indx
15:44:33   5               AND nam.ksppinm = '_log_private_parallelism_mul') / 100 )
15:44:33   6          as "calculated private strands"
15:44:33   7   from dual;

calculated private strands
--------------------------
                        18

15:44:35 sys@ORCL (^ω^) select count(1) "actual private strands" from x$kcrfstrand where last_buf_kcrfa = '00';

actual private strands
----------------------
                    18


分享到:
评论

相关推荐

    Oracle Redo并行机制

    Redo log 是用于恢复和一个高级特性的重要数据,一个redo条目包含了相应操作导致的数据库变化的所有信息,所有redo条目最终都要被写入redo文件中去。Redo log buffer是为了避免Redo文件IO导致性能瓶颈而在sga中分配...

    ORACLE9i_优化设计与系统调整

    §5.1 理解ORACLE性能优化 82 §5.1.1 响应时间与吞吐量的折衷 82 §5.1.2 临界资源 83 §5.1.3 过度请求的影响 83 §5.1.4 调整以解决问题 83 §5.2 优化的执行者 84 §5.3 设置性能目标 84 第7章 系统优化方法 85 ...

    深入解析Oracle.DBA入门进阶与诊断案例

    针对数据库的启动和关闭、控制文件与数据库初始化、参数及参数文件、数据字典、内存管理、Buffer Cache与Shared Pool原理、重做、回滚与撤销、等待事件、性能诊断与SQL优化等几大Oracle热点主题,本书从基础知识入手...

    构建最高可用Oracle数据库系统 Oracle 11gR2 RAC管理、维护与性能优化

    1.3.1双机并行 1.3.2高可用性 1.3.3易伸缩性 1.3.4低成本 1.3.5高吞吐量 1.4 RAC存在的问题 1.4.1稳定性 1.4.2高性能 1.5 RAC软件 1.5.1存储管理软件 1.5.2集群管理软件 1.5.3数据库管理软件 1.6本章小...

    Oracle 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

    目录回到顶部↑第1章 开发成功的Oracle应用 1 1.1 我的方法 2 1.2 黑盒方法 4 1.3 开发数据库应用的正确(和不正确)方法 8 1.3.1 了解Oracle体系结构 8 1.3.2 理解并发控制 14 1.3.3 多版本 19 1.3.4 数据库...

    让Oracle跑得更快 Oracle 10g性能分析与优化思路.part2.rar

    8.2 并行处理的机制 189 8.3 读懂一个并行处理的执行计划 191 8.4 一个很常见的并行执行等待事件 192 8.5 并行执行的适用范围 194 8.5.1 并行查询 194 8.5.2 并行ddl操作 195 8.5.3 并行dml操作 203 8.6 并行执行的...

    让Oracle跑得更快 Oracle 10g性能分析与优化思路.part1.rar

    8.2 并行处理的机制 189 8.3 读懂一个并行处理的执行计划 191 8.4 一个很常见的并行执行等待事件 192 8.5 并行执行的适用范围 194 8.5.1 并行查询 194 8.5.2 并行ddl操作 195 8.5.3 并行dml操作 203 8.6 并行执行的...

    oracle动态性能表

    oracle动态性能表 学习动态性能表 第一篇--v$sysstat 2007.5.23  按照OracleDocument中的描述,v$sysstat存储自数据库实例运行那刻起就开始累计全实例(instance-wide)的资源使用情况。 类似于v$sesstat,该视图...

    学习ORACLE动态性能表.doc

    按照OracleDocument中的描述,v$sysstat存储自数据库实例运行那刻起就开始累计全实例(instance-wide)的资源使用情况。 类似于v$sesstat,该视图存储下列的统计信息: 1>.事件发生次数的统计(如:user commits) 2>....

    收获不知Oracle

    2.3.2.7 并行设置,飞船速度 79 2.3.3 精彩的总结与课程展望 80 2.3.3.1 最大的收获应该是思想80 2.3.3.2 老师的课程展望与规划81 第3章神奇,走进逻辑体系世界 84 3.1 长幼有序的逻辑体系 84 3.2 逻辑体系从老余...

    Oracle 9i&10g编程艺术:深入数据库体系结构

    第1章 开发成功的Oracle应用程序 第2章体系结构概述 第3章 文件 第4章 内存结构 第5章 Oracle进程 第6章 锁 第7章 并发与多版本 第8章 事务 第9章 redo与undo 第10章 数据库表 第11章 索引 第12章 数据类型 第13章 ...

    Oracle编程艺术

    1.3.2 理解并发控制...................................................................... 78 1.3.3 多版本.............................................................................. 84 1.3.4 数据库...

    ORACLE DBA 手册

    避免动态空间管理Oracle数据库增长空间是就以区的单位扩展的,区由块组成,区的增长方式有两种,一种是allocation_type是UNIFORM,每次分配区的大小是一致的,另一种Allocation_type是SYSTEM自动分配。区的大是...

    ORACLE必学

    初学必备Parallel 用来指定为加速该表的全表扫描可以使用的并行查询进程个数. Cache 用来指定该表为最应该缓存在SGA数据库缓冲池中的候选项. Cluster 用来指定该表所存储的 cluster. Tablespace 用来指定用数据库的...

    mysql数据库my.cnf配置文件

    # MySQL的最大连接数,如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,...

Global site tag (gtag.js) - Google Analytics