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}化。
看到这篇精彩文章分享给大家!!记得本文来源于:老熊的三分地
Leave a Reply