sga pga uga分配情况分析

来源:互联网 发布:网络培训机构 编辑:程序博客网 时间:2024/04/21 00:13
网络上流传着给Oracle数据库分配内存的一条法则:把80%的内存分配给Oracle使用,而又将这80%的内存分配80%给Oracle的SGA,剩下的20%分给Oracle的PGA。记得Tom曾说过类似这样的话:如果一个参数的设置对Oracle是最佳的,那么Oracle就会自动地将其设为了默认值。而显然,在内存分配这事上,Oracle的初始设置并不是按这个法则的,那么就是说从某一方面证明这个法则存在问题。
  当然大部分DBA不会这样设置内存参数,但是也有不少的人在Oracle的内存分配上存在欠考虑的地方。 
  首先,我们来看看保留可用内存20%给操作系统是否合适。比如对于2G内存的服务器,20%意味着400M,而通常400M对操作系统来说是不够用的。而对于内存特别多的主机,20%又显得太多。比如下面是一份来自于一台P595的内存情况:  

 1 ===================|==========|===========
  2 Memory Overview | Pages | Megabytes
  3 ----------|-----------------|-----------
  4 Total memory in system | 45875200 | 179200.00
  5 Total memory in use | 34789026 | 135894.63

  6 Free memory | 11086174 | 43305.36
  7 =========|===========
  8 Segment Overview | Pages | Megabytes
  9 --------|-----------------|-----------
  10 Total segment id mempgs | 32618956 | 127417.79
  11 Total fork tree segment pages | 2074 | 8.10
  12 Total kernel segment id mempgs | 3594452 | 14040.82
 
  这台主机共计179GB物理内存,已使用135G,其中内核占用14G。内核占用的内存不到总内存的10%。

  以上的数据以及说明,只是表达这样一个观点,对于操作系统的保留内存,需要根据实际情况预以考虑,这包括了操作系统的内核参数的设置。比如在AIX下的默认设置,client和perm内存可以占用远远超过20%的内存,而HP-UX下的默认设置,File Cache和Buf Cache也可能占用远远超过20%的内存。所以对于这些环境的数据库,一定要注意调整OS的内核参数。对于OS的内存使用,至少保留20%也不失为一种稳妥的做法。

  除了操作系统这一块,给Oracle分配内存的时候,还需要注意以下非常重要的几点,这几点经常被人忽略:

  注意业务高峰期的内存使用:我所维护的一套系统,平时的连接数通常在5000-5500左右,而在最高时连接数达到了8000,也就是到达了连接的上限才作罢。因此,我们需要为业务高峰期时保留足够的内存。

  对于RAC数据库,需要考虑到其他节点故障或停机维护时,连接和压力转移到继续工作的节点时的内存消耗。

  一些人只考虑到了连接时进程使用的PGA内存,这里存在一个很大的误解,就是认为一个连接,只会使用PGA的内存。但还有一个很重要的内存使用,那就是进程本身占用的操作系统内存,除了PGA之外的内存。进程本身有代码(在OS中这通常是共享的),有stack,有heap,还要有kernel的内存占用。PGA只是进程使用的内存中一部分,甚至大部分情况下只是一小部分。在Oracle 10.2.0.4 for AIX下测试过,一个空闲连接,也就是什么都不干的一个连接,PGA占用500K左右,而server process进程占用的内存在4-5M之间。测试时这套库刚启动,没有任何负载。实际上据观察在一套运行比较长时间的库上,server process占用的内存在9-10M之间。当然不同的系统,不同的配置,oracle进程占用的内存有所不同,有兴趣的朋友可以测量一下Oracle进程在HP-UX和LINUX下的内存占用。

  对于SGA内各组件的细分以及PGA大小设置,网上很多相关的文章可供参考,本文不再涉及。不过我的个人观点是:参数的调整也不是一步到位的事情,需要根据系统运行时对性能数据的分析来进行调整,直至达到最优化。

下面举例进行分析ORACLE内存分配:

注意
  --主机内存分为文件缓存和计算内存
  --oracle使用计算内存,需要限制文件缓存
  --计算内存不足时,需要从文件缓存中置换出来内存。当文件缓存过大,速度非常慢且需要消耗cpu

Total Real Memory:128GB 
Parameter:Processes=1000
  --AIX6或AIX7系统至少预留4GB内存
  --oracle10g 每个进程10-15m内存 1000个process至少15GB
    oracle11g 每个进程至少30m内存 1000个process至少30GB
  --pga分配至少15GB
    (pga取决与sql语句的使用方式)
    (pga_target对排序数据是在内存中还是磁盘中有参考意义,但无法决定pga内存)
  --剩下内存的50%-80%分给SGA,根据内存大小调整

Oracle环境的内存分配需要考虑事项
--Operation System 大于等于4GB 
--Processes  每个30M 1000个进程则要大于等于30GB
--Program Global Area (128-59)*30%=20GB 
--Free Memory 20% Real Mem 128*20%=25GB 
--System Global Area 128-4-30-20-25=49GB 最后考虑


0 0
原创粉丝点击