gdufo

 

Database Configuration and IO Issues

 

Oracle进程与files

 
1、performance guidelines
1)对于吞吐量较大的OLTP应用中,当使用dictionary管理表空间的方法时,由于所有的extent分配时都会要访问dictionary,从而造成了冲突。而使用本地管理表空间的方法避免了这类冲突,从而提高了并发性。
2)在本地管理表空间中,使用自动空间管理方法,用位图记录不同blocks的使用情况。也提高了相应的速度。
3)当创建一个user后,就会分配一块所需的磁盘排序所需临时表空间。这些排序区应该从其他database object中分离开,如果没有给user分配临时表空间,则其所需的排序区域将从system表空间分配。
4)tables和indexes应该被分开存储在不同表空间中。因为indexes和tables经常被同时读写。
5)对于含有LONG或LOB数据类型的tables,应该被分配在不同的表空间中。
6)适当创建多个临时表空间。

2、distributing files across devices:
1)应该将redo log和data file存放在不同的磁盘上,从而在一定程度上降低i/o的压力。
2)对于规模较大的表,如果分不同的区域并发访问也可以提高性能partition。
3)尽可能排除非Oracle Server进程对database file的I/O操作。对此可以使用v$filestat动态的观察。
4)了解应用程序主要的I/O操作,合理安排disk布局,从而提高性能。

3、表空间的作用:其中system表空间主要是用于存放sys创建的data dictionary objects。其他users不可使用该表空间。需要明确的是,packages和database triggers对象等都是data dictionary的一部分。rollback segments应该排他使用其rollback segment。undo segments可以只能存在在undo tablespace中。

4、监控I/O状态的工具
1)v$filestat视图。
select phyrds, phywrts, d.name from v$datafile d, v$filestat f where d.file# = f.file# order by d.name;
2)statspack
5、file striping
1)对OS的striping,通过使用硬件或是软件层次上的striping,可以将同一个文件的不同blocks放在不同的devices上,例如raid技术。提供一定的冗余的同时增大I/O性能的。
此外,设置适当的DB_FILE_MULTIBLOCK_READ参数。
2)手工的striping:可以在多个不同的disk创建tablespace。随后将不同的tables、indexes分配到不同的 tablespace中。此外,可以创建对象时使用MINEXTENTS句柄其值大于1,这样每个extents都将略小于striped data files。也可直接给extents进行分配定位(但我认为这会给管理带来麻烦):alter table tablename allocate  extent ( datafile ‘filename’ size 10M);
对于这块争用的问题,使用手动的striping还是比较有效的。
6、对全表扫描的tuning:当对某个disk有较高的读写操作时,多是由于没有适当调节sql的原因。
查看全表扫描的次数:
select name, value form v$sysstat where name like ‘%table scans%‘;
获得的结果中’table scans ( long tables)’的值如果较大,则需要考虑调节sql或是增加适当的indexes。
 long tables (长表)指多于4个块的表, short table(短表)指等于或小于4个块的表。
初始化参数DB_FILE_MULTIBLOCK_READ_COUNT决定了在全表扫描时,一次I/O操作中读入的最大的database blocks。它可以改变全表扫描时需要的I/O的次数。该参数的设置应该受到OS限制的I/O的上限的约束。此外此参数还可以在session级别进行 调节。对它的调节可以先查看完成每个表的全表扫描扫描多少blocks。从而从整体上得到较好的设置。要注意的是,对cost-based 优化将会使用该参数评估使用全表扫描的代价,从而判断是否使用全表扫描。
对于全表扫描,Oracle提供了视图v$session_longops来进行监控。
select sid, serial#, opname, to_char(start_time,’HH24:MI:SS’) as starttime, (sofar/totalwork)*100 as percent_complete from v$session_longops;
7、checkpoints
什么是checkpoint?
 checkpoint是一个数据库事件,它将已修改的数据从高速缓存刷新到磁盘,并更新控制文件和数据文件。
什么时候发生checkpoint?
  我们知道了checkpoint会刷新脏数据,但什么时候会发生checkpoint呢?以下几种情况会触发checkpoint。
  1.当发生日志组切换的时候
  2.当符合LOG_CHECKPOINT_TIMEOUT,LOG_CHECKPOINT_INTERVAL,fast_start_io_target,fast_start_mttr_target参数设置的时候
  3.当运行ALTER SYSTEM SWITCH LOGFILE的时候
  4.当运行ALTER SYSTEM CHECKPOINT的时候
  5.当运行alter tablespace XXX begin backup,end backup的时候
  6.当运行alter tablespace ,datafile offline的时候;

1)它可以引起DBWn的I/O操作,同时会更新datafile header和control file中的scn等信息。
频繁的进行checkpoint可以缩短instance恢复的时间,但是会降低Oracle运行的性能。
在LGWR写redo log文件时,当一个group 被写满时,需要进行log switch是,会先发起一个checkpoint,这就意味着:DBWn会先将所有的与该redo log有关的dirty data blocks写入datafile,随后CKPT会修改datafile header和控制文件。
checkpoint并不会影响其他工作。如果DBWn进程尚未完成checkpoint一个file,此时LGWR需要在此需要这个file时,LGWR不得不等待。
2)对checkpoint性能的监控与调节:
**  checkpoint的监控主要是查看alert.log文件。可以将LOG_CHECKPOINT_TO_ALERT参数设置true,从而记录checkpoint的开始结束时间。
**  通过调节online redo log files的大小来降低因日志切换引起的checkpoint;
**  增多redo log 的groups,从而延长LGWR覆盖写的时间,从而避免引起不必要的LGWR等待。
**  具体可调节的参数有:
– FAST_START_IO_TARGET
– LOG_CHECKPOINT_INTERVAL
– LOG_CHECKPOINT_TIMEOUT
– DB_BLOCK_MAX_DIRTY_TARGET
– FAST_START_MTTR_TARGET
如果在OLTP系统中,SGA设置过大,同时checkpoint稀少,可能引起disk冲突。所以也要适当增加checkpoint的频率。
貌似我的理解是除了user发起的alter database checkpoint命令外,主要两类checkpoint,时间间隔型和fast-start类型的。
通过查看v$instance_recovery视图,查看参数设置对DB recovery时间的影响,其中:
RECOVERY_ESTIMATED_IOS:显示了基于fast-start的设置,在recovery时,需要处理的data blocks。
ACTUAL_REDO_BLKS:显示了当前要进行recovery时所需的redo blocks。
TARGET_REDO_BLKS:在recovery时,最大的需要处理的redo blocks。是下面四个指标的最小值。
LOG_FILE_SIZE_REDO_BLKS:在recovery时,为了确保log switch不会等待checkpoint,要处理的redo blocks数量。
LOG_CHKPT_TIMEOUT_REDO_BLKS:在recovery时满足log_checkpoint_timeout,需要处理的redo blocks的数量。
LOG_CHKPT_INTERVAL_REDO_BLKS:在recovery时为了满足log_checkpoint_interval,需要处理的redo blocks的数量。
FAST_START_IO_TARGET_REDO_BLKS:在recovery时为了满足fast_start_io_target,需要处理的redo blocks的数量。
对checkpoint的设置主要围绕的中心就是recovery用时,和它引起的I/O是否会造成性能的问题。
8、redo log的groups和members的设计
一般会把同一组的不同成员放置在不同的disk上,如果在归档模式下,则要考虑将归档日志放到不同的磁盘上。为redo log选择适当的size。同时在一定程度上增加log file的groups,从而避免不必要的等待。
对redo log的监控视图主要有:V$LOGFILE, V$LOG, V$LOG_HISTORY,此外还可结合v$system_event获得的结果。
9、归档日志的设置
当开启归档模式时,可以考虑将不同的groups放在不同的disks上(当然不一定是每个group一个磁盘),同时与归档文件的存放也分离,这样使LGWR进程写的disk和ARCn进程读的disk不在一个上。
可以从视图V$ARCHIVED_LOG上获得动态的归档log文件的信息。V$ARCHIVE_DEST当前归档进程的destinations的状态信息。(由参数log_archive_dest_n设置的destination)
监控诊断ARCn的工具主要是使用视图:V$ARCHIVED_LOG, V$ARCHIVE_PROCESSES, V$ARCHIVE_DEST。
对归档的调节,可以使用LOG_ARCHIVE_MAX_PROCESSES参数指定最大可以创建的归档进程。
如果预计归档工作量较大,可以通过定期运行下面语句来获得其他进程来分担。
alter system archive log all to ‘directory_name’;
注意:9i中,当DBWR_IO_SLAVES参数的设置大于0,Oracle会自动将ARCn的进程数设置为4。(但是我的11g貌似DBWR_IO_SLAVES=0,而ARCn也是4个多啊,大概是设了其他的参数)

设置适当的fast_start_io_target,

posted on 2010-01-12 12:30 gdufo 阅读(481) 评论(0)  编辑  收藏 所属分类: Database (oracle, sqlser,MYSQL)

导航

统计

常用链接

留言簿(6)

随笔分类

随笔档案

文章分类

文章档案

收藏夹

Hibernate

友情链接

搜索

最新评论

阅读排行榜

评论排行榜