需要从这种结构中了解到的最重要的事情是:
- 在默认情况下,数据库共享内存的大小是 1.75GB 减去堆栈大小。
- 将共享库装载到一个较低的地址,从而使留给实例共享内存的空间更少,留给数据库共享内存的空间更多。
32 位 Linux 中与分配数据库共享内存有关的常见问题
没有充分配置内核参数或者初始化数据库共享内存失败可能导致以下失败:
- 在数据库管理器启动时 - SQL1220N
- 在数据库启动时(激活数据库或第一次连接到数据库) - SQL1478W, SQL1084C, hang condition
- 在运行时 - SQL2043N, hang condition
最常见的未能正确设置的内核参数是 shmmax。请参考 Quick Beginnings ,了解如何根据物理 RAM 设置适当的值。 shmmax按字节指定了系统中可以分配的最大共享内存段。如果将 UDB 配置成创建大于这个值的数据库共享内存集,那么该请求将遭到失败。其他要指定的内核参数是 shmmni。下面的例子展示了会导致问题的不恰当配置。
例 1
服务器:
- 服务器上的物理 RAM 2GB
- kernel.shmmax = 32768(32KB)
数据库:
- IBMDEFAULTBP 200,000 页
- INTRA_PARALLEL ON
- UTILHEAP 17,500 页
- DBHEAP 10,000 页
- SHEAPTHRES_SHR 50,000 页
- LOCKLIST 1000 页
- PCKCACHE 5000 页
- CATALOGCACHE 2500 页
- APPGROUP_MEM_SZ 20,000 页(v8 中的默认值)
限制: SHMMAX 被设为 32KB。DB2START 可以分配足够多的共享内存来成功地启动实例。
计算:
- 数据库共享内存 = (286,000 页 x 4KB/页) x 1.1 = ~1.26GB
- 数据库应用程序组内存 = 20,000 页 x 4KB/页 = 80MB
问题: 在 db2start 期间,将碰到以下错误:
SQL1220N The database manager shared memory set cannot be allocated.
要解决这个问题,可以将 SHMMAX 参数增加到一个更合理的大小,例如 2GB。
例 2
服务器:
- DB2 v8.1.0.0
- OS: Linux SuSE SLES-8
- glibc version : 2.2.5
- Kernel: 2.4.19
问题: 如 SHMMAX 被设为 2GB,即 2147483648,那么一次 db2start 就会使其降至 268435456。如果将这个值减少 1 个字节,那么 db2start 不会作出任何变化。该问题在 v8 FP2, APAR LI70159中已得到修复。
对 SuSe 8.0 不会发生问题。
32 位 Windows 中的 DB2 内存配置
在 Windows 上,DB2 UDB 有着根本不同的体系结构。所有 DB2 操作都是以进程(db2sysc.exe)内的线程的形式实现的。Windows 进程模型最多可寻址 4GB 的内存,如 图 14中所示。
图 14 - Windows 中的 DB2 32-位内存地址空间
![]() |
在 Windows 中没有真正的共享内存集的概念。在 UNIX 中,所有共享内存池通常都是某个内存集(例如缓冲池,dbheap,等等)的一部分,而在 Windows 中,这些共享内存池都是根据需要从 db2sysc 的私有内存集中分配的。
在非 Advanced Server Windows 环境(NT,2000 Pro/Standard)中,4GB 地址空间被分成 2GB 的用户空间和 2GB 的内核空间。这样可以有效地将 db2sysc 进程可访问的内存总数限制到 2GB。
在 Advanced Server 环境中,将 2GB/2GB 的内存拆分重新配置为 3GB 的用户空间和 1GB 的内核空间是可行的,如 图 14中所示。
为了允许内存使用量超出这些限制,必须在 boot.ini 文件中使用 /3GB switch。这里要警告的是,/3GB switch 只在 Windows 2000 Advanced Server、Windows 2000 DataCenter、Windows2003 Enterprise Edition 和 Windows 2003 DataCenter 中受支持。您可以在 Windows2000 Pro/Standard 中设置这个 switch,但是用户空间最多只能有 2GB,而内核空间缩小到 1GB,这会导致 1GB 的内存丢失。
注意: 为了有效地使用 /3GB switch,必须在 Windows 32 位环境中安装了最少 4GB 的物理 RAM。
为了克服 2GB (或 3GB)的用户空间限制,Windows 2000 Advanced Server 和 Windows 2003 Advanced Server 提供了对更大内存的支持。它们是 Address Windowing Extensions (AWE) 和 Physical Address Extension (PAE)。
AWE 是一种机制,用于通过一个可能更小的窗口访问内存中一个很大的部分。按照这种方法,如果某个大的内存池是线性的,那么它就可以被寻址。实际上,AWE 允许创建超过 2GB 限制的缓冲池。AWE 功能是通过使用 boot.ini 文件中的 /PAE switch 来实现的。/PAE 在 Windows2000 Pro/Standard 中有效,但如果不是使用 Windows 2000 Advanced Server、Windows 2000 DataCenter、Windows2003 Enterprise Edition 和 Windows 2003 DataCenter,则 Microsoft 不会允许你的操作系统与这样的 switch 一起运行。
需要从这种结构中了解到的最重要的事情是:
- 在 Windows 体系结构中没有真正的内存集概念。DB2 使用的所有内存(共享的或私有的)池都是从相同的内存段中分配的 - 这个内存段就是用户空间,在非 Advanced Servers 环境中限于 2GB。
- 在 Advanced Servers 中使用文件中的 /3GB switch 将这一限制增加到 3GB 是可行的。
- 通过使用 AWE 可以将缓冲池增加到超过 2GB 的限制。实际上,可以定义最大 64GB 的缓冲池。
结束语
DB2 的内存结构由 4 个内存集组成:实例共享内存、数据库共享内存、应用程序组共享内存(只有在数据库启用了 intra-parallel,或者启用了集中器,或者多分区的时候才适用)以及代理私有内存。每种内存集由各个内存池组成。例如,缓冲池和数据库堆是数据库内存集内的两个不同的内存池。
每个实例有一个实例共享内存集,由这个实例中的所有数据库共享。每个数据库有一个数据库共享内存集,由连接到该数据库的所有代理共享。每个应用程序组有一个应用程序组共享内存集,由属于该应用程序组的所有代理共享。每个代理(或进程)都有一个代理私有内存集。该内存集是由代理独占使用的。
对于 32 位内存结构,不管系统有多少物理 RAM,在任何平台上任何进程的可寻址内存都是 4GB。而且,这 4GB 中有一部分要预留给操作系统。剩下的所有内存(亦称用户空间)是由应用程序(包括 DB2)使用的。
在配置 DB2 内存的使用时应记住,所有内存池应该能够纳入可寻址用户空间。这个空间的大小随平台的不同而不同。表 1 列出了每种 DB2 内存集的限制。应用程序组共享内存集没有列出,因为它是从数据库共享内存集中分配的。
| 平台 | 实例共享内存 | 数据库共享内存 | 代理私有内存 |
| AIX | 256MB | 1.25 – 2GB (1) | 240MB (2) |
| Solaris | 不固定(3) | 3.5GB | ~220MB (4) |
| HP-UX | 0.75 - 1GB (5) | 0.75 – 1GB | 象限 1 & 2 (6) |
| Linux | 256MB | 1.75 – 2.25GB | 256MB |
| Windows | n/a (7) | n/a (7) | n/a (7) |
注意:
(0) 在多分区环境中,这些限制适用于每个分区。
(1) 当 DB2_MMAP_READ=NO 并且 DB2_MMAP_WRITE=NO 时,限制的最大值为 2GB。以下每种情况都会占用一个 256MB 的段,致使 1.25GB 的最小值出现:fenced 函数和过程;DB2_FORCE_FCM_BP=YES;启用了 intra-parallel/启用了集中器/多分区。
(2) Data (代理私有内存)和 Stack 之间共享 256MB 的段。在 ulimit 中将堆栈设为 16MB,便可以将 240MB 留给代理私有内存。
(3) 在 Solaris 中,实例共享内存可能非常大,因为共享内存段没有固定的地址。实例共享内存和数据库共享内存合起来大约是 3.7GB。
(4) 在 Solaris 中,代理私有内存与 db2sysc 可执行程序共享同一个 256MB 的段。这个可执行程序大约占 36MB。
(5) 在 HP-UX 中,所有共享内存都位于象限 3 (1GB)和象限 4 (0.75 GB)中。
(6) 象限 1 和 2(减去内核内存和其他进程内存)可以一起用作私有内存。
(7) 所有实例共享内存、数据库共享内存和代理私有内存都必须能纳入 2GB 的用户空间限制,或者在 Advanced Server 上使用了 boot.ini 文件中的 /3GB switch 之后 3GB 的限制。如果支持 AWE 则是 64GB。
对于 32 位内存结构,不管物理 RAM 有多大,实例、数据库配置都受到 4GB 可寻址空间的限制。不过,如果有足够的 RAM,只需每个实例或数据库都符合以上限制,就可以在系统中并发地运行多个实例或数据库。为了克服这一限制,应该考虑转换到 64 位的 DB2。
