[转载]AIX 上 Lotus Domino 的内存使用

在默认情况下,AIX 上的 32 位虚拟地址空间由 16 个段组成,每个段 256 MB。对于使用默认段布局的任何应用程序,虚拟地址空间看起来像图 1 这样:

  • 第 1 段(0x0)用于内核文本和数据。
  • 第 2 段(0x1)用于用户文本。
  • 第 3 段(0x2)用于用户堆栈和数据。
  • 第 4 段到第 13 段(0x3 到 0xC)供用户进程使用,如果调用 shmat() 或 mmap() 的话。
  • 第 14 段(0xD)为共享的库文本保留。
  • 第 15 段(0xE)供用户进程使用。
  • 最后一段(0xF)用于每个进程共享的库数据。

对于不熟悉图 1 中使用的术语的读者,下面给出其定义:

  • 文本。 只读和可执行的代码。它可以有三种类型:内核代码、用户代码和共享的库代码。
  • 数据。 可读/写数据区域,可以有三种类型:内核数据、用户数据和共享的库数据。

注: Shmat() 和 mmap() 在 Lotus Domino 中用于获得共享内存。



虚拟地址空间示例

使用 AIX 大内存模型的程序具有图 2 所示的内存布局:

  • 第 1 段(0x0)用于内核文本和数据。
  • 第 2 段(0x1)用于用户文本。
  • 第 3 段(0x2)用于用户堆栈和数据。
  • 第 4 段到第 7 段(0x3 到 0x6)为进程堆保留。
  • 第 8 段到第 13 段(0x7 到 0xC)供用户进程使用,如果调用 shmat() 或 mmap() 的话。
  • 第 14 段(0xD)为共享的库文本保留。
  • 第 15 段(0xE)供用户进程使用。
  • 最后一段(0xF)用于每个进程共享的库数据。

Lotus Domino 的当前版本使用 AIX 大内存模型。



AIX 大内存模型

在 AIX 5L 版本 5.2 和更高版本中,有一个非常大的内存模型。我们希望 Lotus Domino 以后会使用这个模型,但是当前没有使用。这个模型有三种形式:第一种形式适用于进程堆(用户数据)小于 2.5 GB 并大于 256 MB 的程序(见图 3)。这个模型看起来与默认的 AIX 段布局相似,但是如果使用动态段分配(DSA),那么第 4 段到第 8 段(0x3 到 0x7)供进程堆使用。另外,如果动态段分配调用 shmat() 或 mmap(),那么 0xA 到 0xE 段供用户进程使用。



AIX 非常大内存模型:第一种形式

第二种形式适用于进程堆大于 2.5 GB 的程序(见图 4),在这种形式中:

  • 第 1 段(0x0)用于内核文本和数据。
  • 第 2 段(0x1)用于用户文本。
  • 第 3 段(0x2)用于用户堆栈。但是,共享的库文本和数据也使用这个段(0x2)。
  • 如果使用动态段分配,那么第 4 段到第 16 段(0x3 到 0xF)供用户堆使用。
  • 如果动态段分配调用 shmat() 或 mmap(),那么 0xB 到 0xF 段供用户进程使用。



AIX 非常大内存模型:第二种形式

第三种形式适用于进程堆小于 256 MB 的程序(见图 5)。在这种形式中:

  • 第 1 段(0x0)用于内核文本和数据。
  • 第 2 段(0x1)用于用户文本。
  • 第 3 段(0x2)用于用户堆栈和数据。但是,共享的库文本和数据也可能存储在这个段中。
  • 如果动态段分配调用 shmat() 或 mmap(),那么其余的段(0x3 到 0xF)供用户进程使用。



AIX 非常大内存模型:第三种形式 




回页首

既然已经了解了关于 AIX 内存模型的一些基本信息,我们就来研究一下 Lotus Domino 使用的模型,以及 Domino 内存控制选项如何影响虚拟地址空间。

本文的余下部分讲解如何通过配置 Domino 服务器的 Notes.ini 文件中的设置来改变段布局。在开始之前,先提供一些说明,帮助您更好地理解表格中的信息。

  • 程序名。 这是一个典型的 Domino 应用程序示例。
  • 内核文本和数据。 此内存是共享的。
  • 用户文本。 此内存由具有相同可执行文件的所有程序共享(例如,在三个 update 任务之间共享一块内存。)
  • 用户堆栈。 这个段是每个进程专用的。
  • 进程堆。 这个段是每个进程专用的。
  • 共享的内存。 这个段由所有 Domino 进程共享。
  • 共享的库文本。 这个段由系统上的所有进程共享。
  • 不可用的段。 Lotus Domino 当前不能使用这个段。
  • 共享的库数据。 这个段是每个进程专用的。
  • 非 Domino。 这个段由第三方应用程序共享和使用。

所有 Domino 应用程序共享的程序共享数据从 256 MB 开始,并根据需要增加 256 MB 的段,直到到达最大空闲段数量。

第一个表显示没有启用 Domino 内存设置时的结果。

程序名 内核文本/数据 
256 MB
用户文本 
256 MB
用户堆栈 
256 MB
进程堆 
512 MB
共享的内存 
2 GB
共享的库文本 不可用的段 共享的库数据
Server 1 2 3 4 和 5 6 到 13 14 15 16
HTTP 1 2 3 4 和 5 6 到 13 14 15 16
Update 1 2 3 4 和 5 6 到 13 14 15 16
N/A 1 2 3 4 和 5 6 到 13 14 15 16
进程堆栈 进程私有数据 Domino 共享的内存 第三方 API 应用程序共享的内存
256 MB 512 MB 2048 MB 0 MB

这是共享内存的布局:

  • NSF Buffer Pool(UBM=3/8 shm) = 750 MB
  • 其他 Domino 共享内存 = 1250 MB

Domino 服务器的 Notes.ini 文件中的 ConstrainedSHMSizeMB 设置对共享内存进行限制。使用这个设置有两种方式。如果 ConstrainedSHMSizeMB=1,那么共享内存被限制为默认大小。在 AIX 中,默认大小是 2.25 GB。还可以以 MB 为单位为这个设置指定大小。例如,如果将这个设置修改为:

ConstrainedSHMSizeMB = 1744

那么会得到下表中列出的结果。

程序名 内核文本/数据 
256 MB
用户文本 
256 MB
用户堆栈 
256 MB
进程堆 
512 MB
共享的内存 
1.744 GB
非 Domino 
256 MB
共享的库文本 不可用的段 共享的库数据
Server 1 2 3 4 和 5 6 到 12 13 14 15 16
HTTP 1 2 3 4 和 5 6 到 12 13 14 15 16
Update 1 2 3 4 和 5 6 到 12 13 14 15 16
N/A 1 2 3 4 和 5 6 到 12 13 14 15 16
进程堆栈 进程私有数据 Domino 共享的内存 第三方 API 应用程序共享的内存
256 MB 512 MB 1744 MB 256 MB

这是共享内存的布局:

  • NSF Buffer Pool(UBM=3/8 shm) = 654 MB
  • 其他 Domino 共享内存 = 1099 MB

如果在 Notes.ini 文件中配置 ConstrainedSHMSizeMB= 1744 并将 dataseg 设置为 3(数据段的数量),那么会得到下表中列出的结果。

程序名 内核文本/数据 
256 MB
用户文本 
256 MB
用户堆栈 
256 MB
进程堆 
768 MB
非 Domino 
1.744 GB
共享的库文本 不可用的段 共享的库数据
Server 1 2 3 4 到 6 7 到 13 14 15 16
HTTP 1 2 3 4 到 6 7 到 13 14 15 16
Update 1 2 3 4 到 6 7 到 13 14 15 16
N/A 1 2 3 4 到 6 7 到 13 14 15 16
进程堆栈 进程私有数据 Domino 共享的内存 第三方 API 应用程序共享的内存
256 MB 768 MB 1744 MB 0 MB

这是共享内存的布局:

  • NSF Buffer Pool(UBM=3/8 shm) = 654 MB
  • 其他 Domino 共享内存 = 1099 MB

在下表中,ConstrainedSHMSizeMB 设置为 1024 MB。

程序名 内核文本/数据 
256 MB
用户文本 
256 MB
用户堆栈 
256 MB
进程堆 
512 MB
共享的内存 
1024 MB
非 Domino 
1024 MB
共享的库文本 不可用的段 共享的库数据
Server 1 2 3 4 和 5 6 到 9 10 到 13 14 15 16
HTTP 1 2 3 4 和 5 6 到 9 10 到 13 14 15 16
Update 1 2 3 4 和 5 6 到 9 10 到 13 14 15 16
N/A 1 2 3 4 和 5 6 到 9 10 到 13 14 15 16
进程堆栈 进程私有数据 Domino 共享的内存 第三方 API 应用程序共享的内存
256 MB 512 MB 1024 MB 1024 MB

这是共享内存的布局:

  • NSF Buffer Pool(UBM=3/8 shm) = 384 MB
  • 其他 Domino 共享内存 = 640 MB

Domino 服务器的 Notes.ini 文件中的 PercentAvailSysResources 设置允许控制服务器上的内存分配。这个设置的值从 2% 到 100%。在下表中,PercentAvailSysResources 设置为 25%,系统具有 4 GB 内存。换句话说,1 GB 内存分配给 Domino 服务器。

程序名 内核文本/数据 
256 MB
用户文本 
256 MB
用户堆栈 
256 MB
进程堆 
512 MB
共享的内存 
2048 MB
共享的库文本 不可用的段 共享的库数据
Server 1 2 3 4 和 5 6 到 13 14 15 16
HTTP 1 2 3 4 和 5 6 到 13 14 15 16
Update 1 2 3 4 和 5 6 到 13 14 15 16
N/A 1 2 3 4 和 5 6 到 13 14 15 16
进程堆栈 进程私有数据 Domino 共享的内存 第三方 API 应用程序共享的内存
256 MB 512 MB 2028 MB 0 MB

这是共享内存的布局:

  • NSF Buffer Pool(UBM=3/8 shm) = 384 MB
  • 其他 Domino 共享内存 = 1664 MB

在这个配置中,NSF Buffer Pool 设置为 3/8 * (RAM * .25)。除了操作系统对段施加的限制之外,没有定义对 Domino 共享内存增长的限制。

下一个表显示在 Notes.ini 文件中设置 NSF_BUFFER_POOL_SIZE_MB= 512 和 PercentAvailSysResources=25 的结果。

程序名 内核文本/数据 
256 MB
用户文本 
256 MB
用户堆栈 
256 MB
进程堆 
512 MB
共享的内存 
2048 MB
共享的库文本 不可用的段 共享的库数据
Server 1 2 3 4 和 5 6 到 13 14 15 16
HTTP 1 2 3 4 和 5 6 到 13 14 15 16
Update 1 2 3 4 和 5 6 到 13 14 15 16
N/A 1 2 3 4 和 5 6 到 13 14 15 16
进程堆栈 进程私有数据 Domino 共享的内存 第三方 API 应用程序共享的内存
256 MB 512 MB 2028 MB 0 MB

这是共享内存的布局:

  • NSF Buffer Pool(UBM=3/8 shm) = 512 MB
  • 其他 Domino 共享内存 = 1536 MB

在这个配置中,NSF Buffer Pool 是直接配置的,PercentAvailSysResources 被忽略。除了操作系统对段施加的限制之外,没有定义对 Domino 共享内存增长的限制。




回页首

我们建议不要以任何形式使用 ConstrainedSHMSizeMB。在当前使用的 AIX 大内存模型中,ConstrainedSHMSizeMB 应该只用来支持需要共享内存的第三方应用程序。如果使用它,那么 Lotus Domino 可用的虚拟地址空间就少了。这与 Domino 支持的其他平台不一样。在其他平台上,使用 ConstrainedSHMSizeMB 减少共享内存,就会自动地增加应用程序的私有空间。

为了进行说明,现在举一个例子:一台 Domino 服务器正在运行非常沉重的 Lotus Domino Web Access HTTP 负载,它需要 1024 MB 的私有数据空间。在 AIX 上,在 Domino 程序目录中使用 dataseg –f 4 *,从而让所有 Domino 程序文件可以使用 4 个私有内存段。在其他平台上,需要使用操作系统决定的虚拟地址空间大小。然后减去程序文本和共享的库文本使用的空间。这会得到 Lotus Domino 可用的虚拟数据空间。在这个例子中,从 Lotus Domino 可用的虚拟数据空间中减去 1024 MB,并使用这个值配置 ConstrainedSHMSizeMB 设置。

posted @ 2011-09-18 12:45  hannover  阅读(389)  评论(0编辑  收藏  举报