从实际出发Oracle数据库分配内存的法则真的可行吗? | 安逸哇?

Oracle数据库分配内存的法则真的实用吗?

首先不管是在网络上或行业里面确实上流传着给Oracle数据库分配内存的一条法则:

把80%的内存分配给Oracle使用,而又将这80%的内存分配80%给Oracle的 SGA,
剩下的20%分给Oracle的PGA。

记得Tom曾说过类似这样的话:如果一个参数的设置对Oracle是{zj0}的,那么Oracle就会自动地将其设为了默认值。

而显然,在内存分配这事上,Oracle的初始设置并不是按这个法则的,那么就是说从某一方面证明这个法则存在问题。

当然大部分DBA不会这样设置内存参数,但是也有不少的人在Oracle的内存分配上存在欠考虑的地方。

那我们来看看保留可用内存20%给操作系统是否合适。

对于2G内存的服务器(现实中这样的机器不少),20%意味着400M,而通常400M对操作系统来说是不够用的。

而对于内存特别多的主机,20%又显得太多。

比如下面是一份来自于一台P595的内存情况:
view plaincopy to clipboardprint?

   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  

====================================================|==========|===========
Memory Overview                                     |    Pages |  Megabytes
—————————————————-|———-|———–
Total memory in system                              | 45875200 |  179200.00
    Total memory in use                             | 34789026 |  135894.63
    Free memory                                     | 11086174 |   43305.36
====================================================|==========|===========
Segment Overview                                    |    Pages |  Megabytes
—————————————————-|———|———–
Total segment id mempgs                             | 32618956 |  127417.79
    Total fork tree segment pages                   |     2074 |       8.10
    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左右,而在{zg}时连接数达到了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大小设置,网上很多相关的文章可供参考,本文不再涉及。不过我的个人观点是:参数的调整也不是一步到位的事情,需要根据系统运行时对性能数据的分析来进行调整,直至达到{zy}化。

看到这篇精彩文章分享给大家!!记得本文来源于:老熊的三分地

相关文章

  • 暂没有相关文章

Comments

Leave a Reply




郑重声明:资讯 【从实际出发Oracle数据库分配内存的法则真的可行吗? | 安逸哇?】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——