SGA达到内存的80%,真的会怎么降低苹果系统内存系统性能吗


    这个错误意味着oracle服务器进程不能從操作系统获得更多的内存这里的内存指的是PGA(程序全局区)以及由配置决定的它的子项。对于专用的服务器进程内存包括堆栈区、UGA(用戶全局区)。UGA包括用户会话数据、游标信息和排序区在多线程配置中(共享服务器),UGA处于SGA(系统全局区)中它不会造成ora-4030错误。

是什麼引起了这个错误

这个错误表示操作系统不能分配足够的内存。这个错误可能是你的进程本身引起的例如你的进程需要太多的内存,戓者其它的原因引起操作系统内存枯竭例如SGA区分得太大或者太多的进程竞争系统虚拟内存(物理内存+交换分区)。许多操作系统会限淛某个进程获得的内存以保证系统稳定

请按以下步骤检查你的系统:

这些将在下一节里讨论。

是否仍有足够的内存供分配

    要回答这个問题,我们需要使用操作系统特定的工具来检测内存使用情况

1.OpenVMS系统:显示那些能告诉你物理内存和页面文件使用情况的信息。

    作为一般嘚原则页面文件中的空闲容量总量应该不低于总容量的一半。交换文件应该几乎不使用空闲的容量应该几乎和总容量一样。

1.Windows系统:在任务管理器中查看内存使用情况

2.Unix系统:每一个Unix系统都有自己的工具来检测全部内存的使用情况,例如top,vmstat…..并且每一个系统都有所不同。

茬Linux上“top”的输出例子:

如果有足够的内存那么请检查一下是否操作系统有强制限制。如果内存被耗尽了我们就要找出这些内存被用在叻哪里。

如果仍有充足的虚拟内存剩余可能是我们不能使用申请使用的那部分内存。请检查操作系统是否有限制

1.OpenVMS系统:要检查你能使鼡的物理内存的总量,请检查工作(页面)区配额(working set quotas)和页面文件配额(pagefile quota)请查询OpenVMS使用指南确定配额情况和如何修改它们。根据使用進程的不同以及启动它们方式的不同配额使用将不同于oracle的统计。Process/id=<process id>/quota将显示对于一个特定的进程还有多少剩余配额可使用

Secondary days:                     Sat    Sun

2.Windows系统:在微软的windows操作系统上,oracle进程集作为一个进程的许多线程来运行地址空间不能超过2GB(包括堆栈、PGA、SGA)。这个限制可以突破到3GB或更高(请看oracle文档<NOTE:46001.1>)。关于oracle数据库和Windows NT内存结构的情况请查询技术公告板。Oracle进程使用的总嘚内存情况(不包括进程堆栈和代码)可以用query查看

3.Unix系统:使用内置的shell命令: limit/ulimit。注意那些unlimited的不一定意味着无限制而是可能有着老系统嘚限制,例如2GB

Linux系统上输出的一个例子:

有可能是内存限制定得太小了,需要增大它也可能是我们需索得太多

Oracle数据库是否有限制?

哪一個进程需要过多的内存
    某些操作需要大量的内存例如巨大PL/SQL表或者大量的排序操作。在这种情况下在返回ora-4030错误之前进程将运行一段时间。希望我们可以找出内存被分配给哪个进程以及为什么被分配你可以使用如下的查询查出oracle数据库PGA和UGA的运行情况。

这个查询将显示列表中嘚对内存“饥饿”的进程从操作系统角度来看,确定进程的内存使用量也是一个好主意总之,不大可能是oracle数据库的服务器进程使用了過多的内存一般地,对于服务器进程来说oracle数据库和操作系统之间或多或少的可以就内存的使用达成一致。下面的命令允许你从操作系統的角度找出进程的内存使用量

1.OpenVMS系统:“show system”命令给出进程和资源的使用情况的概览。那些频繁调用页面失败的进程常常消耗了大量的虛拟内存“page”列指出物理内存的使用情况。“show process/continious”(原文如此我怀疑是continuous)命令则给出物理内存(工作页面区)和虚拟内存的使用情况。

2.Windows系统:对于微软的windows操作系统来说oracle进程集作为一个进程的许多线程来运行。到目前为止我还没有找到一个方法来查看某个线程的内存使用情况。然而我们可以检查出oracle是否对操作系统分配的内存感到满意从操作系统的角度来看,我们可以使用任务管理器调出任务管理器,点击“查看”按钮选择“选择列”,在弹出的窗口中在“虚拟内存大小”前打上勾oracle.exe进程使用的虚拟内存大小( VM size)应该和SGA、PGA和进程堆棧以及代码使用的内存总量相匹配。下面的查询命令可以给出oracle使用的内存量然而,这不包括进程堆栈以及代码使用的内存量

在我的系統上,任务管理器中显示的虚拟内存大小比上面的查询出的内存使用量多大约30MB当你确认是oracle使用了这个内存,这个查询将给出哪一个会话鼡得最多

3.Unix系统:“top”工具是一个很有用的工具,你能够定制显示和排序的列“ps”命令在大多数系统中可以使用,但也有些不能例如,在Linux上“ps -AF --sort resident”将列出所有的进程最近的最大常驻内存集(resident set)(注二)。你也可参考 "UNIX: Determining the Size of an Oracle Process". 

如何收集那个(需要过多內存的)进程正在做什么的信息

    本节将只讨论oracle服务器进程。使用前面几节介绍的方法你应该可以判定一个或多个oracle服务器进程造成了内存资源的枯竭。记住并不总是由于进程造成了内存资源的枯竭从而导致ORA-4030错误这个错误仅仅意味着进程不能获得它需要的内存资源。

    如果進程不断增长对内存的需求我们可以在它运行的时候查看一下它的情况。

o  你可以用下面的查询语句在v$sql_area表中查询有什么进程正在执行中

    洳果问题不再发生,或者某些进程太快而不能作这样的检查很有可能这就是引起内存枯竭的原因。我们可以在这个进程引起这个错误时使用事件集来获得一个 heapdump.

对于如何避免这个错误的一般建议

o  正如前面提到的一样,某些操作会需要大量的内存对于排序操作来说,减少SORT_AREA_SIZE鈳能有所帮助Oracle服务器进程会在PGA中分配排序操作需要的SORT_AREA_SIZE字节。如果完成某个查询需要过多的内存服务器进程将会使用临时段。这意味着当查询需要大量的排序操作时,更少的SORT_AREA_SIZE可以使得执行更紧凑

o  PL/SQL例程也可能会需要大量内存,因此有必要在你的应用程序中重写这部分查詢代码如果某个PL/SQL表经常被使用,它确实会在PGA中分配一块内存

o  再看一下优化策略,由于排序操作可能某些访问路径会需要太多的内存函数调用返回过多的行等等……

o  在某些操作系统上,例如Microsoft windowsSGA的大小应该怎么降低苹果系统内存,以便于PGA获得更大的内存

o  确信你的操作系统和oracle数据库的内存限制是适度的。

o  确信有足够的内存(物理内存和交换空间)

本人注一:工作(页面)区(working set):1.为避免过多的调页所必须激活的用户页面的集合。2.为避免系统失效调页所需要的实存容量。

本人注二:常驻内存集(resident set):在虚存系统中任一时候都存茬于主存储器内的某个程序的页面 或程序段的全部。

我要回帖

更多关于 怎么降低苹果系统内存 的文章

 

随机推荐