• 博客访问: 12902481
  • 博文数量: 5596
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-10 14:39
  • 认证徽章:
个人简介

Oracle , MySQL, SAP IQ, SAP HANA, PostgreSQL, Tableau 技术讨论,希望在这里一起分享知识,讨论技术,畅谈人生 。

文章分类

全部博文(5596)

分类: Linux操作系统

2009-08-10 16:21:24

 

latch free: latch释放
latch 是一种低级排队机制,用于保护SGA 中共享内存结构。
latch就像是一种快速地被获取和释放的内存锁。latch用于防止共享内存结构被多个用户同时访问。如果latch不可用,就会记录latch释放失败(latch free

miss)。
有两种与闩有关的类型:
■ 立刻。
■ 可以等待。
假如一个进程试图在立刻模式下获得闩,而该闩已经被另外一个进程所持有,如果该闩不能立刻可用的话,那么该进程就不会为获得该闩而等待。它将继续执行

另一个操作。
大多数latch 问题都与以下操作相关:
没有很好的是用绑定变量(library cache latch)、重作生成问题(redo allocation latch)、缓冲存储器竞争问题(cache buffers LRU chain),以及

buffer cache中的存在"热点"块(cache buffers chain)。
通常我们说,如果想设计一个失败的系统,不考虑绑定变量,这一个条件就够了,对于异构性极强的系统,不使用绑定变量的后果是极其严重的。
另外也有一些latch 等待与bug 有关,应当关注Metalink 相关bug 的公布及补丁的发布。
当latch miss ratios大于0.5%时,就应当研究这一问题。
Oracle 的 latch 机制是竞争,其处理类似于网络里的CSMA/CD,所有用户进程争夺latch, 对于愿意等待类型(willing-to-wait)的latch,如果一个进程在第一

次尝试中没有获得latch,那么它会等待并且再尝试一次,如果经过_spin_count 次争夺不能获得latch, 然后该进程转入睡眠状态,持续一段指定长度的时间,然

后再次醒来,按顺序重复以前的步骤.在8i/9i 中默认值是 _spin_count=2000。
如果SQL语句不能调整,在8.1.6版本以上,Oracle提供了一个新的初始化参数: CURSOR_SHARING,可以通过设置CURSOR_SHARING = force 在服务器端强制绑定变

量。设置该参数可能会带来一定的副作用,对于Java的程序,有相关的bug,具体应用应该关注Metalink的bug公告。

enqueue
enqueue 是一种保护共享资源的锁定机制。该锁定机制保护共享资源,如记录中的数据,以避免两个人在同一时间更新同一数据。enqueue 包括一个排队机制,

即FIFO(先进先出)排队机制。
Enqueue 等待常见的有ST、HW 、TX 、TM 等
ST enqueue 用于空间管理和字典管理的表空间(DMT)的分配。对于支持LMT 的版本,可以考虑使用本地管理表空间,对于Oracle8i,因为相关bug 不要把临时表

空间设置为LMT. 或者考虑预分配一定数量的区。
HW enqueue 指段的高水位标记相关等待;手动分配适当区段可以避免这一等待。
TX 是最常见的enqueue 等待。TX enqueue 等待通常是以下三个问题之一产生的结果。
第一个问题是唯一索引中的重复索引,你需要执行提交(commit)/回滚(rollback)操作来释放enqueue。
第二个问题是对同一位图索引段的多次更新。因为单个位图段可能包含多个行地址(rowid),所以当多个用户试图更新同一段时,等待出现。直到提交或回滚,

enqueue 释放。
第三个问题,也是最可能发生的问题是多个用户同时更新同一个块。如果没有自由的ITL 槽,就会发生块级锁定。通过增大initrans 和/或maxtrans 以允许使用

多个ITL 槽,或者增大表上的pctfree值,就可以很轻松地避免这种情况。
TM enqueue 在DML 期间产生,以避免对受影响的对象使用DDL。如果有外键,一定要对它们进行索引,以避免这种常见的锁定问题。


Log Buffer Space: 日志缓冲空间
当你将日志缓冲(log buffer)产生重做日志的速度比LGWR 的写出速度快,或者是当日志转换(log switch)太慢时,就会发生这种等待。为解决这个问题,可

以增大日志文件的大小,或者增加日志缓冲器的大小.
另外一个可能的原因是磁盘I/O 存在瓶颈,可以考虑使用写入速度更快的磁盘。


log file switch (archiving needed)
这个等待事件出现时通常是因为日志组循环写满以后,第一个日志归档尚未完成,出现该等待可能是 IO 存在问题。
解决办法:
可以考虑增大日志文件和增加日志组
移动归档文件到快速磁盘
调整log_archive_max_processes .


log file switch (checkpoint incomplete): 日志切换(检查点未完成)
当你的日志组都写完以后,LGWR 试图写第一个log file,如果这时数据库没有完成写出记录在第一个log file 中的dirty 块时(例如第一个检查点未完成),

该等待事件出现。
该等待事件说明你的日志组过少或者日志文件过小。
你可能需要增加你的日志组或日志文件大小。


Log File Switch: 日志文件转换
所有的提交请求都需要等待"日志文件转换(必要的归档)"或"日志文件转换(chkpt.不完全)"。确保归档磁盘未满,并且速度不太慢。DBWR 可能会因为输入/

输出(I/O)操作而变得很慢。你可能需要增加更多或更大的重做日志,而且如果DBWxR 是问题症结所在的话,可能需要增加数据库书写器。


log file sync: 日志文件同步
当一个用户提交或回滚数据时,LGWR 将session 会话的重做由redo buffer 写入到重做日志中。
log file sync 必须等待这一过程成功完成(Oracle 通过写redo log file 保证commit 成功的数据不丢失),这个事件说明提交可能过于频繁,批量提交可以最

大化LGWR 的效率,过分频繁的提交会引起LGWR频繁的激活,扩大了LGWR 的写代价。
为了减少这种等待事件,可以尝试每次提交更多的记录。
将重做日志置于较快的磁盘上,或者交替使用不同物理磁盘上的重做日志,以降低归档对LGWR的影响。
对于软RAID,一般来说不要使用RAID 5,RAID5 对于频繁写入得系统会带来较大的性能损失,可以考虑使用文件系统直接输入/输出,或者使用裸设备(raw

device),这样可以获得写入的性能提高。


log file single write
该事件仅与写日志文件头块相关,通常发生在增加新的组成员和增进序列号时。头块写单个进行,因为头块的部分信息是文件号,每个文件不同。更新日志文件

头这个操作在后台完成,一般很少出现等待,无需太多关注。


log file parallel write
从log buffer 写redo 记录到redo log 文件,主要指常规写操作(相对于log file sync)。
如果你的Log group 存在多个组成员,当flush log buffer 时,写操作是并行的,这时候此等待事件可能出现。
尽管这个写操作并行处理,直到所有I/O 操作完成该写操作才会完成(如果你的磁盘支持异步IO或者使用IO SLAVE,那么即使只有一个redo log file member,也

有可能出现此等待)。
这个参数和log file sync 时间相比较可以用来衡量log file 的写入成本。通常称为同步成本率。


control file parallel write: 控制文件并行写
当server 进程更新所有控制文件时,这个事件可能出现。
如果等待很短,可以不用考虑。如果等待时间较长,检查存放控制文件的物理磁盘I/O 是否存在瓶颈。
多个控制文件是完全相同的拷贝,用于镜像以提高安全性。对于业务系统,多个控制文件应该存放在不同的磁盘上,一般来说三个是足够的,如果只有两个物理

硬盘,那么两个控制文件也是可以接受的。在同一个磁盘上保存多个控制文件是不具备实际意义的。
减少这个等待,可以考虑如下方法:
减少控制文件的个数(在确保安全的前提下)
如果系统支持,使用异步IO
转移控制文件到IO 负担轻的物理磁盘


control file sequential read/ control file single write
控制文件连续读/控制文件单个写
对单个控制文件I/O 存在问题时,这两个事件会出现。
如果等待比较明显,检查单个控制文件,看存放位置是否存在I/O 瓶颈。
使用查询获得控制文件访问状态:
select P1 from V$SESSION_WAIT
where EVENT like 'control file%' and STATE='WAITING';
解决办法:
移动有问题的控制文件到快速磁盘
如果系统支持,启用异步I/O


direct path write: 直接路径写
该等待发生在,等待确认所有未完成的异步I/O 都已写入磁盘。
你应该找到I/O 操作频繁的数据文件,调整其性能。
也有可能存在较多的磁盘排序,临时表空间操作频繁,可以考虑使用Local 管理表空间,分成多个小文件,写入不同磁盘或者裸设备。


SQL*Net message from dblink
该等待通常指与分布式处理(从其他数据库中SELECT)有关的等待。
这个事件在通过DBLINKS 联机访问其他数据库时产生。如果查找的数据多数是静态的,可以考虑移动这些数据到本地表并根据需要刷新,通过快照或者物化视图

来减少跨数据库的访问,会在性能上得到很大的提高。


slave wait: 从属进程等
Slave Wait 是Slave I/O 进程等待请求,是一个空闲参数,一般不说明问题。


2.2.4 High Load SQL 分析
对于一个特定的应用程序或者系统来讲,要调整优化其性能,最好的方法是检查程序的代码和用户使用的SQL语句。
如果使用了 level 5 级别的 snapshot ,那么statspack生成的报告中就会显示系统中高负荷SQL语句(High Load SQL)的信息,而其详细信息可以在

stats$sql_summary 表中查到。缺省情况下 snapshot 的级别是 level 5。
按照 buffer gets, physical reads, executions, memory usage and version count 等参数的降序排列顺序,把SQL语句分为几个部分罗列在报告中。


2.2.5 报告的其他部分
statspack报告的其他部分包括了 Instance Activity Stats,Tablespace IO Stats,Buffer Pool Statistics,Buffer wait Statistics,Rollback Segment

Stats,Latch Activity,Dictionary Cache Stats,Library Cache Activity,SGA breakdown difference 以及 init.ora 参数,等等。目前本文不对这些内

容进行详细讨论,请参加其他详细文档。

 

2.3 trace session

阅读(828) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册