怎么样管理Oraclepython的内存管理

Oracle占用大量内存的解决方法
&通常我们在自己电脑上搭建项目环境时,都免不了要安装Oracle。不管你硬件多强悍,都会发现,Oracle服务一旦启用,内存立马吃紧。笔者内存4G,启动一个VS,启动一个Eclipse,启动一个虚拟机,开一个Tomcat,再开一个PL/SQL,内存基本就耗去了一大半。再启用Oracle服务,内存马上飙升五六百兆,程序便会频繁出现假死。
&其实这是因为安装Oracle时,为了均衡电脑性能和数据库性能,默认内存大小为物理内存的1/8,自身内存比较大时,oracle所占的内存也会变大。而通常,我们自己的环境并不需要分配那么大的内存来支持Oracle,这种情况下,我们可以通过修改sga值来减少系统中oracle占用内存过大问题。
&&用dba身份进入oracle,本人使用sqlplus修改(sqlplus user/pwd@XXX
&as sysdba),若使用PL/SQL,可以在Command
Window执行:
(1) --显示内存分配情况
(2)alter system set
sga_max_size=200m scope=spfile;
--修改占用内存的大小
&&修改后重启Oracle服务,再查看资源管理器,Oracle占用资源便会降至200M以下。不过如此修改所付出的代价就是数据库性能的下降,因此修改时不宜调得太小。笔者修改为200M,实属万不得已。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。提供企业信息化整体解决方案
深入探讨Oracle内存分配管理(下)
深入探讨Oracle内存分配管理(下)
| 作者:慧都控件网 |
09:49:13| 阅读 0次
概述:对于 oracle 的内存的管理,截止到9iR2,都是相当重要的环节,管理不善,将可能给数据库带来严重的性能问题。下面我们将一步一步就内存管理的各个方面进行探讨。
  假如把&TOM& 和 &JERRY& 换做变量V,那就是使用了bind var,我们可以认为是同样的SQL 从而能很好地共享。共享SQL 本来就是shared_pool_size 这部分内存存在的本意,oracle的目的也在于此,而我们不使用bind var 就是违背了oracle 的初衷,这样将给我们的系统带来严重的问题。当然,如果通过在操作系统监控,没有发现严重的cpu问题,我们如果发现该共享池命中率不高可以适当的增加shred_pool_size。但是通常我们不主张这部分内存超过800M(特殊情况下可以更大)。
  事实上,可能的话我们甚至要想办法避免软分析,这在不同的程序语言中实现方式有差异。我们也可能通过设置session_cached_cursors 参数来获得帮助(这将增大PGA)。
  Data buffer
  现在我们来谈数据缓冲区,在确定了SGA 的大小并分配完了前面部分的内存后,其余的,都分配给这部分内存。通常,在允许的情况下,我们都尝试使得这部分内存更大。这部分内存的作用主要是缓存DB BLOCK,减少甚至避免从磁盘上获取数据,在8i中通常是由db_block_buffers*db_block_size 来决定大小的。如果我们设置了buffer_pool_keep 和buffer_pool_recycle,则应该加上后面这两部分内存的大小。
  9i下参数的变化
  Oracle的版本的更新,总是伴随着参数的变化,并且越来越趋向于使得参数的设置更简单,因为复杂的参数设置使得DBA们经常焦头烂额。关于内存这部分的变化,我们可以考察下面的参数。事实上在9i中数据库本身可以给出一组适合当前运行系统的SGA相关部分的参数调整值(参考V$DB_CACHE_ADVICE、V$SHARED_POOL_ADVICE),关于PGA也有相关视图V$PGA_TARGET_ADVICE 等。
  Data buffer
  9i 中保留了8i中的参数,如设置了新的参数,则忽略旧的参数。9i中用db_cache_size来取代db_block_buffers , 用db_keep_cache_size 取代buffer_pool_keep, 用db_recycle_cache_size 取代buffer_pool_这里要注意9i 中设置的是实际的缓存大小而不再是块的数量。另外9i新增加了db_nk_cache_size,这是为了支持在同一个数据库中使用不同的块大小而设置的。对于不同的表空间,可以定义不同的数据块的大小,而缓冲区的定义则依靠该参数的支持。其中n 可以为2、4、6、8、16 等不同的值。在这里顺便提及的一个参数就是db_block_lru_latches,该参数在9i中已经成为了保留参数,不推荐手工设置。
  在9i 里面这部分也有了很大的变化。在独立模式下,9i已经不再主张使用原来的UGA相关的参数设置,而代之以新的参数。假如workarea_size_policy=AUTO(缺省),则所有的会话的UGA 共用一大块内存,该内存由pga_aggregate_target 设置。在我们根据前面介绍的方法评估了所有进程可能使用的最大PGA 内存之后,我们可以通过在初始化参数中设置这个参数,从而不再关心其他&*_area_size& 参数。
  SGA_MAX_SIZE
  在9i中若设置了SGA_MAX_SIZE,则在总和小于等于这个值内,可以动态的调整数据缓冲区和共享池的大小
  SQL&&show&parameters&sga_max_size
  NAME&TYPE&VALUE
  ------------------------------------&-------&-------------
  sga_max_size&unknown&
  SQL&&alter&system&set&db_cache_size&=&;
  System&altered.
  SQL&&alter&system&set&shared_pool_size&=&;
  System&altered.
  Lock_SGA = TRUE 的问题
  由于几乎所有的操作系统都支持虚拟内存,所以即使我们使用的内存小于物理内存,也
  不能避免操作系统将SGA 换到虚拟内存(SWAP)。所以我们可以尝试使得SGA 锁定在物理内存中不被换到虚拟内存中,这样减少页面的换入和换出,从而提高性能。但在这里遗憾的是,windows 是无法避免这种情况的。下面我们来参考在不同的几个系统下怎么实现lock_sga
  AIX 5L(AIX 4.3.3 以上)
  logon aix as root
  cd /usr/samples/kernel
  ./vmtune (信息如下) v_pingshm已经是1
  ./vmtune -S 1
  然后oracle用户修改initSID.ora 中 lock_sga = true
  重新启动数据库
  HP UNIX
  Root身份登陆
  Create the file &/etc/privgroup&: vi /etc/privgroup
  Add line &dba MLOCK& to file
  As root, run the command &/etc/setprivgrp -f /etc/privgroup&:
  $/etc/setprivgrp -f /etc/privgroup
  oracle用户修改initSID.ora中lock_sga=true
  重新启动数据库
  SOLARIS (solaris2.6以上)
  8i版本以上数据库默认使用隐藏参数 use_ism = true ,自动锁定SGA于内存中,不用设置lock_sga, 如果设置 lock_sga =true 使用非 root 用户启动数据库将返回错误。
  WINDOWS
  不能设置lock_sga=true,可以通过设置pre_page_sga=true,使得数据库启动的时候就把所有内存页装载,这样可能起到一定的作用。
  关于内存参数的调整
  关于参数调整,是oracle的复杂性的一个具体体现。通常来讲,我们更倾向于让客户做statspack 报告,然后告诉我们os 监控的状况,在这些的信息的基础上,再向客户索取具体
  的详细信息以诊断问题的所在。系统的调整,现在我们通常采用从等待事件入手的方法。因为一个系统感觉到慢,必然是在某个环节上出现等待,那么我们从等待最多的事件入手逐步诊断并解决问题。
  对于内存的调整,相对来说简单一些,我们首先可以针对数据缓冲区的大小来看。首先观察命中率。
  数据缓冲区命中率
  SQL&&select&value&from&v$sysstat&where&name&='physical&reads';
  ----------
  SQL&&select&value&from&v$sysstat&where&name&='physical&reads&direct';
  ----------
  SQL&&select&value&from&v$sysstat&where&name&='physical&reads&direct&(lob)';
  ----------
  SQL&&select&value&from&v$sysstat&where&name&='consistent&gets';
  ----------
  167763
  SQL&&select&value&from&v$sysstat&where&name&=&'db&block&gets';
  ----------
  这里命中率的计算应该是
  令 x = physical reads direct + physical reads direct (lob)
  命中率 =100 - ( physical reads - x) / (consistent gets + db block gets - x)*100
  通常如果发现命中率低于90%,则应该调整应用可可以考虑是否增大数据缓冲区共享池的命中率
  SQL&&select&sum(pinhits-reloads)/sum(pins)*100&&hit&radio&&from&v$
  hit&radio
  ----------
  99.809291
  假如共享池的命中率低于95%,就要考虑调整应用(通常是没使用bind var )或者增加内存。
  关于排序部分
  SQL&&select&name,value&from&v$sysstat&where&name&like&'%sort%';
  NAME&VALUE
  ----------------------------------------------------------------&-------
  sorts&(memory)&67935
  sorts&(disk)&1
  sorts&(rows)&7070
  假如我们发现sorts (disk)/ (sorts (memory)+ sorts (disk))的比例过高,则通常意味着sort_area_size 部分内存较小,可考虑调整相应的参数。
  关于log_buffer
  SQL&&select&name,value&from&v$sysstat
  2&where&name&in('redo&entries','redo&buffer&allocation&retries');
  NAME&VALUE
  -----------------------&-------------------------------------
  redo&entries&2325719
  redo&buffer&allocation&retries&10
  假如redo buffer allocation retries/ redo entries 的比例超过1%我们就可以考虑增大log_buffer
  通常来说,内存的调整的焦点就集中在这几个方面,更多更详细的内容,建议从statspack入手来一步一步调整。最后关于内存的调整,再强调这一点,一定要结合操作系统来衡量,任何理论都必须要实践来检验。在操作系统中观察page in/out 状况,发现问题严重,应该考虑调小SGA。
  32bit 和64bit 的问题
  对于oracle 来说,存在着32bit与64bit的问题。这个问题影响到的主要是SGA的大小。在32bit的数据库下,通常oracle只能使用不超过1.7G的内存,即使我们拥有12G的内存,但是我们却只能使用1.7G,这是一个莫大的遗憾。假如我们安装64bit的数据库,我们就可以使用很大的内存,我们几乎不可能达到上限。但是64bit 的数据库必须安装在64bit 的操作系统上,可惜目前windows 上只能安装32bit的数据库,我们通过下面的方式可以查看数据库是32bit 还是64bit:
  SQL&&select&*&from&v$
  BANNER
  ----------------------------------------------------------------
  Oracle8i&Enterprise&Edition&Release&8.1.7.0.0&-&Production
  PL/SQL&Release&8.1.7.0.0&-&Production
  CORE&8.1.7.0.0&Production
  TNS&for&32-bit&Windows:&Version&8.1.7.0.0&-&Production
  NLSRTL&Version&3.4.1.0.0&-&Production
  但是在特定的操作系统下,可能提供了一定的手段,使得我们可以使用超过1.7G 的内存,达到2G 以上甚至更多。在这里我们针对不同的平台下的具体实现方式做一个总结。
慧都控件|提供软件技术整体解决方案
云集全球三千余款优秀控件、软件产品,提供行业领先的咨询、培训与开发服务
企业QQ:|电话:023-
服务与支持
重庆 / 023-
北京 / 010-
400-700-1020
慧都科技有限公司 版权所有 Copyright 2003-
400-700-1020
<input type="hidden" id="url" value=""/>博客访问: 414476
博文数量: 107
博客积分: 4406
博客等级: 上校
技术积分: 1279
注册时间:
分类: Oracle 01:15:11
oracle 11g MEMORY_TARGET 参数对SGA 和PGA的影响&
11g中新增MEMORY_MAX_TARGET参数,此参数一出现就如在中第一次出现SGA_MAX_SIZE参数一样给人以耳目一新的感觉。memory_max_target是设定Oracle能占OS多大的内存空间,一个是Oracle SGA区最大能占多大内存空间。无疑在11g Oracle
10g的sga_max_size是动态分配Shared Pool Size,database buffer cache,large pool,java pool,redo log buffer大小的,只是根据Oracle运行状况来重新分配SGA各内存块的大小。PGA在10g中需要单独设定
11g MEMORY_MAX_TARGET参数包含两部分内存,一个System global area (SGA),另一个system global area(PGA)。很显然在11g中可已经将PGA和SGA一起动态管理了。
下面来看看在11g中Memory_target设置和不设置对SGA/PGA的影响:
A:如果Memory_target 设置为非0 值(下面有四种情况来对SGA 和PGA 的大小进行分配)
& 1:sga_target和pga_aggregate_target已经设置大小
如果Oracle中已经设置了参数sga_target和pga_aggregate_target,则这两个参数将各自被分配为最小值最为它们的目标值。
Memory_Target =SGA_TARGET+PGA_AGGREGATE_TARGET ,大小和
&&&&&&&&& memory_max_size一致。
& 2:sga_target 设置大小,pga_aggregate_target 没有设置大小
那么pga_aggregate_target初始化值
& 3:sga_target 没有设置大小,pga_aggregate_target 设置大小
那么sga_target初始化值=memory_target-pga_aggregate_target
&&4:sga_target 和pga_aggregate_target 都没有设置大小
中对这种sga_target和pga_aggregate_target都没有设定大小的情况下,Oracle将对这两个值没有最小值和默认值。Oracle但在数据库启动是会有一个固定比例来分配:
&&&&&&&& sga_target =memory_target *60%
&&&&&&&& pga_aggregate_target=memory_target *40%
B:如果Memory_target没有设置或=0(在11g中默认为0)(也有三种情况来对SGA 和PGA 的大小进行分配) 11g中默认为0则初始状态下取消了Memory_target的作用,完全和10g在内存管理上一致,完全向下兼容。
& 1:SGA_TARGET设置值,则自动调节SGA中的shared pool,buffer cache,redo log buffer,java pool,larger pool等内存空间的大小。PGA则依赖pga_aggregate_target的大小。sga 和pga不能自动增长和自动缩小。
&2:SGA_target和PGA_AGGREGATE_TARGET 都没有设置
&&&&&&&&&& SGA中的各组件大小都要明确设定,不能自动调整各组建大小。PGA不能自动增长和收缩。
&3: MEMORY_MAX_TARGET设置而MEMORY_TARGET =0 这种情况先和10g一样,不做说明
在11g 中可以使用下面看各组件的值SQL> show parameter targetNAME& && && && && && && && && && && &TYPE& && &&&VALUE------------------------ ----------- ---------------------archive_lag_target& && && && && && & integer& &&&0db_flashback_retention_target& && &&&integer& &&&1440fast_start_io_target& && && && && &&&integer& &&&0fast_start_mttr_target& && && && && &integer& &&&0memory_max_target& && && && && && &&&big integer 1024Mmemory_target& && && && && && && && &big integer 1024Mpga_aggregate_target& && && && && &&&big integer 0sga_target& && && && && && && && && &big integer 0
------------------------ ----------- ---------------------
除现有的用于内存管理的V$视图外,Oracle 11g还新增加了下面4个视图用于自动内存管理:
? ◆V$MEMORY_CURRENT_RESIZE_OPS ? ◆V$MEMORY_DYNAMIC_COMPONENTS ? ◆V$MEMORY_RESIZE_OPS ? ◆V$MEMORY_TARGET_ADVICE
假设我们需要的设置是1G,那么我们可以执行下面的语句:SQL>ALTER SYSTEM SET MEMORY_MAX_TARGET = 1024M SCOPE = SPFILE;SQL>ALTER SYSTEM SET MEMORY_TARGET = 1024M SCOPE = SPFILE;SQL>ALTER SYSTEM SET SGA_TARGET =0 SCOPE = SPFILE;SQL>ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 0 SCOPE = SPFILE
Oracle在内存方面的改进& &&&Oracle 9i通过参数PGA_AGGREGATE_TARGET参数实现PGA自动管理&&Oracle 10g通过参数SGA_TARGET参数实现了SGA的自动管理,& &&&Oracle 11g实现了数据库所有内存块的全自动化管理,使得动态管理SGA和PGA成为现实。自动内存管理的两个参数:& &&&MEMORY_TARGET:表示整个ORACLE所能使用的内存大小,包括PGA和SGA的整体大小,即这个参数是动态的,可以动态控制SGA和PGA的大小。& &&&MEMORY_MAX_TARGET:这个参数定义了MEMORY_TARGET最大可以达到而不用重启实例的值,如果没有设置MEMORY_MAX_TARGET值,默认等于MEMORY_TARGET的值。& &&&使用动态内存管理时,SGA_TARGET和PGA_AGGREGATE_TARGET代表它们各自内存区域的最小设置,要让Oracle完全控制内存管理,这两个参数应该设置为0。B Oracle五种内存管理方式&O& && && &自动内存管理,即AMM (Automatic Memory Management) &O& && && &自动共享内存管理,即ASMM(Automatic Shared Memory Management) &O& && && &手动共享内存管理 &O& && && &自动PGA管理 &O& && && &手动PGA管理 自动内存管理(AMM)默认安装oracle11g的实例就是AMM方式。通过如下查看:示例如下:SQL> show parameters target NAME& && && && && && && && && && && && && &TYPE& && && && && && &VALUE------------ ---------------------& && &------------------& & ---------------------- archive_lag_target& && && && && && && &integer& && && && && && && & 0db_flashback_retention_target& &integer& && && && && && &&&1860fast_start_io_target& && && && && && &&&integer& && && && && && && & 0fast_start_mttr_target& && && && && &&&integer& && && && && && && & 0memory_max_target& && && && && && &big integer& && && && &&&1400Mmemory_target& && && && && && && && &&&big integer& && && && &&&1400Mpga_aggregate_target& && && && && & big integer& && && && && & 0sga_target& && && && && && && && && && && & big integer& && && && && & 0注意:如果初始化参数 LOCK_SGA = true ,则 AMM 是不可用的。自动共享内存管理自动共享内存管理是oracle10g引进的,如果要使用自动共享内存管理,只需设置MEMORY_TARGET=0,然后显式指定SGA_TARGET即可。示例如下: SQL> alter system set memory_target=0 scope=System altered.SQL> alter system set sga_target=1024m scope=System altered.SQL> 手工共享内存管理Oracle9i以及以前版本,只能手工设置共享内存管理,如果要使用手动共享内存管理,首先需要设置SGA_TARGET 与 MEMORY_TARGET为0。 SGA包含主要参数有: share_pool_size:共享池大小,建议300-500M之间。 Log_buffer:缓冲区大小,建议1-3M之间。 Large_pool_size:大缓冲池大小,非MTS系统,建议在20-30M之间。 Java_pool_size:java池大小,没有java应用时,建议10-20M之间。 db_cache_size:数据缓冲区大小,根据可使用内存大小,尽可能大。自动PAG管理Oracle9i版本引入了自动PGA管理,如果使用的是AMM管理方式,则无需担心PGA的配置,但是如果对对AMM管理不放心的话,可以设置自动PGA管理,设置& &&&WORKAREA_SIZE_POLICY = AUTO 然后指定PGA_AGGREGATE_TARGET大小即可。,手工PAG管理如果要做到精确的控制PGA,还可以设置手动管理PGA,设置WORKAREA_SIZE_POLICY = manual 然后分别指定PGA相关参数即可:PGA相关参数有:SORT_AREA_SIZE SORT_AREA_RETAINED_SIZE,
阅读(1609) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
请登录后评论。没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 python的内存管理 的文章

 

随机推荐