服务器 频道

DB2如何使用内存(下篇)

  【IT168 服务器学院】32 位 HP-UX 中的 DB2 内存配置

  在 32-位 HP-UX 平台上,默认 HP-UX 内存管理是基于象限(quadrant)的,其中每个进程都有其自己的空间。每个进程(包括 DB2 代理)可以寻址最多 4GB 的内存。4G 的可寻址内存被拆分成 4 个象限,每个象限大小为 1G,如 图 11所示。

  

  图 11 - HU-UX 中的 DB2 32 位内存地址空间

 

  象限 1 (1GB) 被预留给程序文本(可执行代码)。

  象限 2 (1GB) 被预留给全局程序数据。

  象限 1 和象限 2(减去内核内存和其他进程的内存)可一起用于私有内存。象限 1 和 2 存在了 n 次(每个进程一次)

  象限 3 (1GB) 被预留给全局共享内存。

  象限 4 (0.75GB) 被预留给全局共享内存。最后 0.25GB 用于 I/O 映射。

  系统范围共享内存的限制是 1.75GB。也就是说,所有共享对象(不仅仅是 DB2)都被映射到象限 3 和 4 上由所有进程共享的一个单独的空间内。这个共享内存空间分为象限 3 中的 1GB 和象限 4 中的 0.75GB。但是,共享内存段不能跨象限“拆分”,而应该保证是一个连续的地址空间。根据进程的不同,DB2 分配各种不同的段。每个段只能映射到象限 3 或象限 4 中的某一个象限,但是不能同时映射到这两个象限。因此,DB2 允许分配的最大共享内存段在象限 3 中的大小为 1GB,在象限 4 中的大小为 0.75GB。实际上,很可能不会分配这么大的内存段,因为之前可能已经分配了一些小的内存段(或者是由 DB2 分配的,或者是由其他进程分配的)。这意味着数据库共享内存集实际上被限制在大约 0.75 到 1GB。这比其他 UNIX 平台上可用的任何数据库共享内存集要少得多。

  注意: 缺省的 HP-UX 内存架构使用 SHARE_MAGIC 内核可执行程序。随着 HP-UX 10.20 内核的更改,可以通过编译应用程序使之使用 SHMEM_MAGIC 内核可执行程序,可以将全局共享内存的限制从 1.75G 增加到 2.75GB。不过,目前还没有计划使用 SHMEM_MAGIC 可执行程序编译 DB2 代码。

  对于 HP-UX 11.0 或更新的版本,有一种方法可以以内存窗(Memory Windows)的形式绕过 1.75GB 的共享内存限制。内存窗允许每个进程从共享内存中定义最多 1GB 的惟一的全局空间。放在这个惟一空间内的共享内存段只能被相同内存窗中的进程访问。但是不同的应用程序或同一应用程序的不同实例可以放在不同的内存窗中,并消耗系统上更多的可用物理内存。

  内存窗使象限 3 能够作为 /etc/services.window 中定义的一个进程组的私有共享内存空间。在内存窗的 DB2 实现中,每个实例都被映射到一个单独的内存窗。换句话说,每个 DB2 实例都可以有自己的象限 3 内存空间。象限 4 仍然用作全局共享内存区,其中任何共享进程都可以分配段。注意,如果象限 4 有可用的空间,那么共享库总是首先被映射到象限 4。于是,每个实例的可用共享内存就变为 1GB 加上象限 4 中仍然可用的空间。不过,共享内存段依然不能跨越象限边界。根据段的类型和大小,DB2 可以指定在象限 4 中创建段。数据库共享内存集仍然有大约 1GB 的限制。因此,内存窗的好处是允许我们为一个 DB2 实例分配整个象限(象限 3,大约 1GB)。然而,如果没有内存窗,则所有实例都必须共享最多 1.75GB 的系统范围的共享«内存。

  提示: 如果为每个实例都创建一个数据库,就可以有效地为所有数据库分配最多 1GB 的数据库共享内存。

  注意: 内存窗只是为 32 位应用程序扩展了系统范围的虚拟容量。通过扩展虚拟容量,可以使用更多的底层 RAM。在不使用内存窗的情况下,不管 RAM 有多大,最多只能消耗 1.75GB 的物理内存。

  要了解有关如何为 DB2 启用内存窗的更多信息,请参阅

  需要从这种结构中了解到的最重要的事情是:

  • HP-UX 默认内存体系结构只允许所有进程(不仅仅是 DB2)共享最多 1.75GB 的共享内存。只有启用了内存窗,HP-UX 才能为每个实例分配共享内存。
  • 共享内存段要求是连续的,因此不能跨越象限边界。这有效地将数据库共享内存集限制为 1GB。
  • 内存窗可以用来为每个 DB2 实例提供一个有效的 1GB 私有数据库共享内存空间,再加上全局共享内存象限(象限 4)中的所有可用空间。
  • 如果为每个实例都创建一个数据库,那么就可以为一个数据库分配最多 1GB 的空间作为共享内存。

  32 位 HP-UX 上与分配数据库共享内存有关的常见问题

  没有充分配置内核参数或者初始化数据库共享内存失败可能导致以下失败:

  • 在数据库管理器启动时 - SQL1220N
  • 在数据库启动时(激活数据库或第一次连接到数据库) - SQL1478W, SQL1084C, SQL3605C, hang condition
  • 在运行时 - SQL2043N, hang condition

  最常见的未能正确设置的内核参数是 shmmax。请参考 Quick Beginnings,以了解如何根据物理 RAM 设置适当的值。SHMMAX 按字节指定系统上可以分配的最大共享内存段。如果将 UDB 配置为创建一个大于该值的数据库共享内存集,则请求将遭到失败。

  下面的例子展示了会导致问题的不正确的配置。

  例 1

  考虑如下配置: (所有页的大小都为 4K)

  服务器:

  • 服务器上的物理 RAM 1GB
  • shmmax = 966 367 641 (1GB)
  • shmseg = 32

  数据库:

  • IBMDEFAULTBP 100,000 页
  • UTILHEAP 5000 页
  • DBHEAP 10,000
  • LOCKLIST 17,500 页
  • PCKCACHE 5000 页
  • CATALOGCACHE 2500 页

  计算:
  数据库共享内存 = (140,000 页 x 4KB/页) x 1.1% = ~616MB

  问题: 可能仍然可以激活数据库或连接到数据库。但是,当尝试连接到数据库时,在 db2diag.log 中可能间歇地出现如下错误消息。
DIA3605C Memory allocation failure occurred.

  注意,对数据库共享内存的计算表明,我们仍然没有超出 1GB 可用共享内存的限制。接下来我们看一看内核参数的设置。查看 "Quick Beginnings for DB2 Servers" 以获得对 32 位 HP-UX 平台上调优内核参数的建议。在查看这本书时,实际上您会发现其中没有写到 shmseg 参数。这意味着您应该使用默认设置。shmseg 的默认设置是 120。(由于 SHMSEG 内核参数被设得太低,有些共享内存段不能适当地分配。)

  要解决这个问题,需适当地配置内核参数。

  • 在这种情况下,设置 shmseg = 120

  例 2

  考虑如下配置: (所有页的大小都为 4K)

  服务器:

  • 服务器上的物理 RAM 1GB
  • shmmax = 966 367 641 (1GB)
  • shmseg = 120
  • 服务器上的交换空间 500MB

  数据库 A:

  • IBMDEFAULTBP 100,000 页
  • UTILHEAP 2500 页
  • DBHEAP 10,000
  • LOCKLIST 20,000 页
  • PCKCACHE 5000 页
  • CATALOGCACHE 2500 页

  数据库 B:

  • IBMDEFAULTBP 160,000 页
  • UTILHEAP 7,500 页
  • DBHEAP 20,000 页
  • LOCKLIST 10,000 页
  • PCKCACHE 5000 页
  • CATALOGCACHE 2500 页

  限制: 由于物理 RAM 只有 1GB,数据库共享内存集只能映射到它在物理上可以使用的空间,即 1GB + 交换空间。

  计算:

  • 数据库 A 共享内存 = (140,000 页 x 4KB/页) x 1.1% = ~616MB
  • 数据库 B 共享内存 = (205,000 页 x 4KB/页) x 1.1% = ~902MB

  问题: 分别激活或连接到数据库 A 或数据库 B 是可行的,但是不能并发进行。尝试同时激活这两个数据库将产生如下错误消息:
SQL1478W The defined buffer pools could not be started. Instead, one small buffer pool for each page size supported by DB2 has been started. SQLSTATE=01626

  如果同时启动数据库 A 和数据库 B,需要至少 1.52GB (616MB + 902MB) 的共享内存。将数据库 A 映射到象限 4 (~0.75GB 可用共享内存)和将数据库 B 映射到象限 3 (~1GB)应该没有问题。但是,这一次,我们会受到物理内存的限制。显然,1GB 的 RAM 不足以处理 1.52GB 的共享内存映射。此外,SWAP 空间也被设置得太低。要解决这一问题:

  • 尝试减少这两个数据库的缓冲池大小。或者
  • 尝试将交换空间增加到物理 RAM 的两倍。或者
  • 最好的解决方案是,增加更多的物理 RAM。在这种情况下,您将需要至少 2GB 的物理 RAM,才能同时启动这两个数据库。
0
相关文章