在过去十年,Windows 服务器操作系统无论是对于新兴公司还是对于老公司而言都已经成为一个划算的、易于理解的选择。伴随着这个操作系统的流行,使用它们来承载 Oracle 数据库的公司也在增多。
不幸地是,32位版本 Windows 服务器甚至在处理一个普通大小的数据库时也存在一些真正的限制,并且可能发生非常复杂的错误。“为什么我的数据库只有 2Gb 大小,并且有充足的物理内存可用,却碰到 ORA-04030(用户内存溢出)错误?”
这里有五个方法来调整您的配置,最大限度利用 Windows 服务器操作系统资源,并避免您的数据库遇到内存溢出。
1. 增加 2Gb 限制
32位 Windows 的主要限制是,在其核心,它只能访问 4Gb 的可寻址内存。即使您塞进更大的内存卡或扩充到 4Gb 以上,Windows 只知道如何处理前 4Gb。
并且,Windows 在启动时默认分配一半内存给操作系统内核,这意味着只有剩下的 2Gb 是实际给用户进程使用的。 当您试图把 Oracle 核心进程、SGA、用户进程装入剩下的 2Gb,它们可能会变得很不够用,进程超预期的增大(或更多进程)可能超出 Windows 可用内存,造成 ORA-04030(内存溢出)错误。
从 Windows OS 内核中回收一些内存的最简单办法是通过 boot.ini /3Gb 开关. 这改变了 Windows 启动时的设置,减少 OS 内核空间到 1Gb 并留出 3Gb 给用户进程。这是增加可用内存的最快最简单的方法,因为它只涉及设置 boot.ini 中的开关并重启机器。
2. 实施地址窗口扩展(AWE)
对于有超过 4Gb 内存的服务器,Windows 提供了一组扩展,允许应用程序访问额外的内存。您可以在下面这些版本中实施这些扩展:
- Windows 2000 Datacenter Server
- Windows 2000 Advanced Server
- Windows 2003 Data Center Edition (32-Bit)
- Windows 2003 Enterprise Edition (32-Bit)
- Windows 2008 Enterprise Edition (32-bit)
通过使用 /PAE 这个 boot.ini 开关,并对 Oracle 内存配置做一些更改后,Oracle 可以使用额外的内存作为数据库 buffer cache。(然而,这部分内存不能用于共享池或用户进程)。另外,您需要禁用自动共享内存管理(ASMM)或自动内存管理(AMM)的数据库选项,因为您需要手工配置 buffer cache。您可以在下面的文档中找到关于配置地址窗口扩展(AWE)的详细信息:
- Document 225349.1 : Implementing Address Windowing Extensions (AWE) or VLM on 32-bit Windows Platforms
3. 减少线程内存
在 Oracle 中每个用户线程以默认 1MB 的堆栈空间启动。在有大量用户的环境中,堆栈空间可能快速达到对这些进程可用 PGA 内存数量产生影响的程度。
这个初始值可以被改变,可以让您回收大量前期(分配的)内存(取决于您的用户连接数)。您可以使用 orastack 工具减少 oracle.exe 和其他相关可执行程序的初始线程内存。
关于 orastack 和 Windows 服务器内存的详细信息,请参考下面的文档:
- Document 46001.1 : Oracle Database and the Windows NT memory architecture, Technical Bulletin
4. 实施 Dead Connection Detection
回收用户进程使用的内存的另一个途径是确保断开的或长期空闲的用户进程被终止掉。因为不确定用户在另一端是否仍然有工作要做,所以Oracle 通常的做法是让这些会话持续存在下去,但您可以设置 SQLNET 空闲时间,或者给这些特定用户创建一个合适的 profile 指定合适的IDLE_TIME 设置,来使这些连接在空闲达到指定的时间后被关闭。
关于 Dead Connection Detection 和 Profile 来终止非活动会话的更多细节,您可以从下面的文档中找到
- Document 601605.1 : A discussion of Dead Connection Detection, Resource Limits, V$SESSION, V$PROCESS and OS processes
5. 配置 Oracle 使用共享服务器
最后一个减少 Oracle 总体内存占用的方法是切换到共享服务器模式。 在共享服务器模式下,单独的用户线程完全消失,而是配置了更少量的 dispatcher 线程处理多个连接。用户内存实际上被存到了 SGA 的共享池(或大池)中,而不是去使用 PGA。
配置数据库使用共享服务器将缩减用于用户进程的总体内存量。然而,使用这个配置时有一件事需要特别注意:用户等待时间的增长可能表明共享服务器进程发生了资源争用,这意味着您需要配置额外的共享服务器进程。关于配置信息请查看下列文档:
- Document 274130.1 : Basic Shared Server Configuration
结论
如您所见,尽管32位 Windows 操作系统有先天限制,我们仍有办法扩大 Oracle 可访问的内存或减少 Oracle 各个工作组件的内存用量。
对于既要 Windows 的便利又想要64位操作系统全部功能的公司,最新版本的 Windows Server(2012)只有64位版本,提供了大数据库所需全范围内存(地址)可用性。
请在下面的版块对这个主题进行提问或加入讨论 Database Memory and 4030/4031.
My Oracle Support 的社区提供了一个协作的环境,在那里你可以获取最新的产品和支持信息,了解最佳实践,参与与同行和 Oracle 专家广泛网络间的讨论和知识交流。