在默认情况下,AIX 上的 32 位虚拟地址空间由 16 个段组成,每个段 256 MB。对于使用默认段布局的任何应用程序,虚拟地址空间看起来像图 1 这样:
对于不熟悉图 1 中使用的术语的读者,下面给出其定义:
注: Shmat() 和 mmap() 在 Lotus Domino 中用于获得共享内存。
使用 AIX 大内存模型的程序具有图 2 所示的内存布局:
Lotus Domino 的当前版本使用 AIX 大内存模型。
在 AIX 5L 版本 5.2 和更高版本中,有一个非常大的内存模型。我们希望 Lotus Domino 以后会使用这个模型,但是当前没有使用。这个模型有三种形式:第一种形式适用于进程堆(用户数据)小于 2.5 GB 并大于 256 MB 的程序(见图 3)。这个模型看起来与默认的 AIX 段布局相似,但是如果使用动态段分配(DSA),那么第 4 段到第 8 段(0x3 到 0x7)供进程堆使用。另外,如果动态段分配调用 shmat() 或 mmap(),那么 0xA 到 0xE 段供用户进程使用。
第二种形式适用于进程堆大于 2.5 GB 的程序(见图 4),在这种形式中:
第三种形式适用于进程堆小于 256 MB 的程序(见图 5)。在这种形式中:
![]() ![]() |
![]()
|
既然已经了解了关于 AIX 内存模型的一些基本信息,我们就来研究一下 Lotus Domino 使用的模型,以及 Domino 内存控制选项如何影响虚拟地址空间。
本文的余下部分讲解如何通过配置 Domino 服务器的 Notes.ini 文件中的设置来改变段布局。在开始之前,先提供一些说明,帮助您更好地理解表格中的信息。
所有 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 |
这是共享内存的布局:
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 |
这是共享内存的布局:
如果在 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 |
这是共享内存的布局:
在下表中,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 |
这是共享内存的布局:
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 设置为 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 是直接配置的,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 设置。