ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle内存调优

oracle内存调优

原创 Linux操作系统 作者:sxrenjb 时间:2012-05-21 15:03:21 0 删除 编辑

1、oracle内存调优参数详解

引用 http://wallimn.iteye.com/blog/1080017

实例结构
  oracle实例=内存结构+进程结构
  oracle实例启动的过程,其实就是oracle内存参数设置的值加载到内存中,并启动相应的后台进程进行相关的服务过程。
  进程结构
  oracle进程=服务器进程+用户进程
  几个重要的后台进程:
  DBWR:数据写入进程.
  LGWR:日志写入进程.
  ARCH:归档进程.
  CKPT:检查点进程(日志切换;上一个检查点之后,又超过了指定的时间;预定义的日志块写入磁盘;例程关闭,DBA强制产生,表空间offline)
  LCKn(0-9):封锁进程.
  Dnnn:调度进程.
  内存结构(我们重点讲解的)
  内存结构=SGA(系统全局区)+PGA(程序全局区)
  SGA:是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含Oracle 服务器的数据和控制信息,它是在Oracle服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写
  我们重点就是设置SGA,理论上SGA可占OS系统物理内存的1/2——1/3
  原则:SGA+PGA+OS使用内存<总物理RAM
  SGA=((db_block_buffers*blocksize)+(shared_pool_size+large_pool_size+java_pool_size+log_buffers)+1MB
  1、SGA系统全局区.(包括以下五个区)
  A、数据缓冲区:(db_block_buffers)存储由磁盘数据文件读入的数据。
  大小: db_block_buffers*db_block_size
  Oracle9i设置数据缓冲区为:Db_cache_size
  原则:SGA中主要设置对象,一般为可用内存40%。
  B、共享池:(shared_pool_size):数据字典,sql缓冲,pl/sql语法分析.加大可提速度。
  原则:SGA中主要设置对象,一般为可用内存10%
  C、日志缓冲区:(log_buffer)存储数据库的修改信息.
  原则:128K ---- 1M 之间,不应该太大
  D 、JAVA池(Java_pool_size)主要用于JAVA语言的开发.
  原则:若不使用java,原则上不能小于20M,给30M通常就够了
  E、 大池(Large_pool_size) 如果不设置MTS,主要用于数据库备份恢复管理器RMAN。
  原则:若不使用MTS,5---- 10M 之间,不应该太大
  SGA=. db_block_buffers*db_block_size+ shared_pool_size+ log_buffer+Java_pool+size+large_pool_size
  原则: 达到可用内存的55-58%就可以了.
  2、PGA程序全局区
  PGA:包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA 正相反PGA 是只被一个进程使用的区域,PGA 在创建进程时分配在终止进程时回收.
  A、Sort_area_size 用于排序所占内存
  B、Hash_area_size 用于散列联接,位图索引
  这两个参数在非MTS下都是属于PGA ,不属于SGA,是为每个session单独分配的,在我们的服务器上除了OS + SGA,一定要考虑这两部分
  原则:OS 使用内存+SGA+并发执行进程数*(sort_area_size+hash_ara_size+2M) < 0.7*总内存
  实例配置
  一:物理内存多大
  二:操作系统估计需要使用多少内存
  三:数据库是使用文件系统还是裸设备
  四:有多少并发连接
  五:应用是OLTP 类型还是OLAP 类型
  基本掌握的原则是, db_block_buffer 通常可以尽可能的大,shared_pool_size 要适度,log_buffer 通常大到几百K到1M就差不多了
  A、如果512M RAM 单个CPU db_block_size 是8192 bytes
  SGA=0.55*512M=280M左右
  建议 shared_pool_size = 50M, db_block_buffer* db_block_size = 200M
  具体: shared_pool_size =52428800 #50M
  db_block_buffer=25600 #200M
  log_buffer = 131072 # 128k (128K*CPU个数)
  large_pool_size=7864320 #7.5M
  java_pool_size = 20971520 # 20 M
  sort_area_size = 524288 # 512k (65k--2M)
  sort_area_retained_size = 524288 # MTS 时 sort_area_retained_size = sort_area_size
  B、如果1G RAM 单个CPU db_block_size 是8192 bytes
  SGA=0.55*1024M=563M左右
  建议 shared_pool_size = 100M , db_block_buffer* db_block_size = 400M
  具体: shared_pool_size=104857600 #100M
  db_block_buffer=51200 #400M
  log_buffer = 131072 # 128k (128K*CPU个数)
  large_pool_size=15728640 #15M
  java_pool_size = 20971520 # 20 M
  sort_area_size = 524288 # 512k (65k--2M)
  sort_area_retained_size = 524288 # MTS 时 sort_area_retained_size = sort_area_size
  C、如果2G 单个CPU db_block_size 是8192 bytes
  SGA=0.55*2048M=1126.4M左右
  建议 shared_pool_size = 200M , db_block_buffer *db_block_size = 800M
  具体: shared_pool_size=209715200 #200M
  db_block_buffer=103192 #800M
  log_buffer = 131072 # 128k (128K*CPU个数)
  large_pool_size= 31457280 #30M
  java_pool_size = 20971520 # 20 M
  sort_area_size = 524288 # 512k (65k--2M)
  sort_area_retained_size = 524288 # MTS 时 sort_area_retained_size = sort_area_size
  假定64 bit ORACLE
  内存4G
  shared_pool_size = 200M , data buffer = 2.5G
  内存8G
  shared_pool_size = 300M , data buffer = 5G
  内存 12G
  shared_pool_size = 300M-----800M , data buffer = 8G
  参数更改方式
  oracle8i:
  主要都是通过修改oracle启动参数文件进行相关的配置
  参数文件位置:
  d:oracleadminDB_Namepfileinit.ora
  按以上修改以上参数值即可。
  Oracle9i:
  两种方式:第一种是修改oracle启动参数文件后,通过此参数文件再创建服务器参数文件
  第二种是直接运行oracle修改命令进行修改。
  SQL>alter system set db_cache_size=200M scope=spfile;
  SQL>alter system set shared_pool_size=50M scope=spfile;

2、Oracle内存配置的基本原则

经常有人问我:“我们的系统有XX内存,怎么分配内存合适?”我的回答是“不知道”。这是一个很无奈的答案,因为这个问题确实无解。每个系统都有不同的特性,如果使用一种通用的模式去分配内存,那么肯定是无法达到目的的。优化内存配置的时候,首先需要注意一些原则性的问题,详细的内存分配方法,在本章的使用STATSPACK进行系统优化章节将进行进一步的介绍。以下几点是笔者在实际工作中总结的内存优化的基本原则:
第一,无论如何分配内存,绝对不能让系统存在较多的换页情况,最好的选择是让系统基本不存在换页。
第二,使用文件系统并不能给ORACLE数据库的IO性能带来好处,因此尽量使用裸设备,如果使用裸设备,SGA和PGA使用内存的总量可以高达70%,甚至更高,但是SGA、PGA、Oracle后台进程、Oracle前台进程、应用进程占用内存的总量一般不要超过系统物理内存总量的90%。上述的参考值仅仅提供参考,不能机械地说SGA和PGA不能占用超过物理内存的60%或者70%,而是要根据你的系统的实际情况进行调整。如果你的系统有很大的物理内存,那么这些指标值还可以更高,只要遵循系统不产生换页操作的原则,那么哪怕你使用了95%甚至更多的物理内存,那么你的配置也是合理的。在海量内存下,如果配置了很大的SGA,那么会消耗大量的CPU资源,因此如果数据库实际不需要使用那么多内存,配置过大的SGA会导致CPU资源的浪费。切忌在解决内存问题的同时带来新的性能故障。
第三,在内存允许的情况下,设置足够大的PGA空间,尽量避免硬盘排序。硬盘排序会造成IO压力增大和相应速度大幅度下降,因此在有条件的情况下,提高内存排序比例可以提高系统的性能。如果排序操作很大,而且物理内存也有限,那么产生部分硬盘排序也是正常的。但是如果系统中存在大量的multi-pass的硬盘排序,那么就应该加大PGA空间了。
第四,在一般情况下,共享池和各个数据块缓冲池的命中率尽量保持在95%以上(OLAP应用除外)。由于每个应用都有不同的特点,命中率指标不一定能够完全表现出数据缓冲池的实际情况,但是在大多数情况下,这个命中率具有一定的代表性。如果在使用多缓冲的情况下,总体的命中率指标超过95%不能证明数据库缓冲池没有问题。通过检查DEFAULT、KEEP、NK CACHE等的命中率情况,往往能够发现在整体命中率达标的情况下,个别缓冲区性能不佳的问题。
第五、在 Oracle 9i 之前,过大的 shared pool 会导致大量的管理开销,因此不能设置过大的 shared pool 。 Oracle 9i 改进了共享池的管理,并且采用了 subpool 机制,使大型共享池的性能得到了很大的改善。笔者曾经在 9i 数据库上使用过超过 2G 的共享池,没有发现由于共享池过大导致�性能问题。在一些移动公司的大型BOSS系统中,超过5GB的共享池也是十分常见的,我曾经见过一个有300G内存的系统,共享池配置了10GB。另外要注意的是,如果已经使用了很大的共享池,还是出现共享池不足的问题,那么调整应用比加大共享池更为有效,另外如果由于某种原因,共享池存在碎片问题,SUBPOOL可能成为一种负面的东西,这个时候禁止使用SUBPOOL会带来好的效果。如果存在较为严重的共享池碎片,那么PX MSG POOL可能会导致经常出现共享池无法分配的情况出现,这种情况下,将PX MSG POOL在LARGE POOL中分配,可以减轻共享池不足的现象,另外减少SESSION_CACHED_CURSORS也会起到好的效果。在一般情况下,过大的共享池是不正常的。过大的共享池也会带来加大 CPU 开销等问题,因此在适当的情况下加大共享池的大小,而不要片面调大共享池,在有些情况下,将 SQL 和 PL/SQL 对象 PIN 到共享池中可能比扩大共享池具有更好的效果。
第六、对于log buffer的设置,过大的log buffer不能改善REDO LOG的性能。一般来说LOG BUFFER的大小在几百K到几兆之间。Oracle 9i的安装指南建议LOG BUFFER的大小是128K*CPU的数量。对于REDO LOG产生量特别大的系统,可以使用这个建议值的2-4倍。但是过大的LOG BUFFER是没有任何意义的。

第七、一般来说,多数据缓冲池的使用会对系统的性能提高有益。由于缓冲池采用HASH链的方式进行管理,因此对于数据缓冲池很大的系统,管理单个大型缓冲池的开销要远大于管理多个较小缓冲池的开销。使用KEEP池、RECYCLE池以及NK缓冲池可以分散数据的分布,减少由于各种竞争带来的缓冲池的额外开销。

第八、通过工作缓冲(通过*_area_size参数设置)来减少SQL执行过程中使用临时表空间,可以提高SQL的响应速度,减少系统IO。如果是Oracle 9i以前的版本,通过设置合理的工作缓冲区参数,可以实现上述目标。在Oracle 9i以后的版本,可以通过PGA自动管理来管理这些缓冲区,     PGA自动管理可以大大提高各种工作缓冲区的使用率,在最小程度占用系统物理内存的情况下,提高各类工作缓冲区的使用率。

第九、LARGE POOL是和SHARED POOL类似的缓冲池,不过只有特定的BUFFER才会在LARGE POOL里分配。第一种情况,在SHARED SERVER模式(旧版本称为MTS)下,UGA空间是从LARGE POOL中分配的;第二种情况,作为顺序文件IO的缓冲区,最典型的就是RMAN备份的时候分配LARGE POOL作为缓冲区,另外从ORACLE 8I开始,如果PARALLEL_AUTOMATIC_TUNING设置为TRUE,那么并行操作的缓冲区也从LARGE POOL里分配。如果没有使用SHARED SERVER,那么系统对LARGE POOL的使用量是很小的,保持50-80M的LARGE POOL就足够了

第十、JAVA POOL是另外一个缓冲池,主要是为ORACLE JVM提供缓冲。如果应用软件很少使用JAVA的存储过程等,那么JAVA POOL不需要设置很大。

第十一、过大的数据块缓冲会导致大量的BUFFER GET扫描,增加CPU的开销。同时维护大量的缓冲池也会带来额外的CPU开销。同样,过大的共享池会导致共享池管理开销的增大。因此片面追求提高命中率的做法是不足取的。按需分配各种缓冲区的大小,不要过度分配缓冲区是一个十分重要的原则。

第十二、9i以后支持的SGA动态调整技术可以为缓冲区动态调整提供了技术手段。DBA可以根据实际情况,随时对SGA的各种缓冲进行调整。

第十三、Oracle 10G提供了自动共享内存管理(ASMM),ASMM机制可以根据系统的状态自动调整共享内存的大小。如果系统不是很大,内存资源比较充分,而且DBA的管理水平不足的话,使用ASMM可以免除DBA这方面的维护工作,使系统保持在一个较好的运行水平上。如果系统种存在性能瓶颈,而且系统的内存资源存在竞争,那么就要慎用ASMM。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11949963/viewspace-730485/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-05-16

  • 博文量
    26
  • 访问量
    29816