在默认情况下,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 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),在这种形式中:
- 第 1 段(0x0)用于内核文本和数据。
- 第 2 段(0x1)用于用户文本。
- 第 3 段(0x2)用于用户堆栈。但是,共享的库文本和数据也使用这个段(0x2)。
- 如果使用动态段分配,那么第 4 段到第 16 段(0x3 到 0xF)供用户堆使用。
- 如果动态段分配调用 shmat() 或 mmap(),那么 0xB 到 0xF 段供用户进程使用。
第三种形式适用于进程堆小于 256 MB 的程序(见图 5)。在这种形式中:
- 第 1 段(0x0)用于内核文本和数据。
- 第 2 段(0x1)用于用户文本。
- 第 3 段(0x2)用于用户堆栈和数据。但是,共享的库文本和数据也可能存储在这个段中。
- 如果动态段分配调用 shmat() 或 mmap(),那么其余的段(0x3 到 0xF)供用户进程使用。
|
既然已经了解了关于 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 设置。