内存参数交互和局限性

虽然您可以启用自调整内存功能并对大多数与内存相关的配置参数使用缺省的 AUTOMATIC 设置,但了解不同内存参数的局限性以及它们之间的交互非常有用,这样您就可以更好地控制它们的设置并了解特定情况下仍可能发生“内存不足”错误的原因。

内存类型

基本上, Db2® 数据库管理器使用两种类型的内存:
性能内存
这是用来提高数据库性能的内存。 性能内存由自调整内存管理器 (STMM) 控制并分发给各种性能堆。 您可以将 database_memory 配置参数设置为性能内存的最大容量,也可以将 database_memory 设置为 AUTOMATIC 以便让 STMM 管理性能内存的全部容量。
功能内存
此内存由应用程序使用。 您可以使用 appl_memory 配置参数来控制 DB2 数据库代理程序为了为应用程序请求提供服务而分配的功能内存(即应用程序内存)的最大容量。 缺省情况下,此参数设置为 AUTOMATIC,这意味着只要有系统资源可用,就允许功能内存请求。 如果您要使用具有内存使用限制的 DB2 数据库产品,或者您将 instance_memory 设置为特定值,那么在数据库分区所分配的内存总量未超过 instance_memory 限制的情况下,将强制使用 instance_memory 限制并且允许功能内存请求。

AUTOMATIC 设置可用之前,可以使用各种操作系统和 DB2 工具来查看不同类型的内存(例如,共享内存、专用内存、缓冲池内存、锁定列表、排序内存(堆)等等)所耗用的空间量,但几乎不可能查看 DB2 数据库管理器耗用的内存总量。 如果其中一个堆达到内存限制,那么应用程序中的某个语句将失败,并且将显示“内存不足”错误消息。 即使增大该堆的内存量并重新运行应用程序,执行针对另一个堆的另一个语句时也可能会发生“内存不足”错误。 现在,可以使用缺省的 AUTOMATIC 配置参数设置来移除各个功能内存堆的硬上限。

必要时(例如,为避免出现性能不佳的数据库应用程序需要极大量内存的情况),可使用 appl_memory 配置参数在数据库级别对整体应用程序内存应用限制。 另外,还可以将该堆的相应数据库配置参数由 AUTOMATIC 设置更改为固定值,从而对各个堆应用限制。 如果所有功能内存堆的所有配置参数都设置为 AUTOMATIC,并且强制施加了 instance_memory 限制,那么对应用程序内存耗用量的唯一限制是 instance_memory 限制。 如果您还将 instance_memory 设置为 AUTOMATIC,并且您要使用具有内存使用限制的 DB2 数据库产品,那么 DB2 数据库管理器将自动确定内存耗用量上限。

您可以通过使用 db2pd -dbptnmem命令或 ADMIN_GET_MEM_USAGE 表函数来轻松查看已使用的实例内存总量和当前 instance_memory 使用量。

内存配置参数之间的交互

当自调整内存管理器 (STMM) 处于活动状态并且启用了数据库内存的自调整时(database_memory 设置为 AUTOMATIC),那么 STMM 将检查系统上的可用内存量,并自动确定为了获取最佳性能而应该供性能堆专用的内存量。 所有性能堆都将计入 database_memory 总大小。 除了性能内存需求以外,还需要一定内存来确保 DB2 数据库管理器的操作和完整性。 instance_memory 耗用的空间量与这两个内存使用者所需空间量之差将供应用程序内存(appl_memory)使用。 将根据需要来分配应用程序的功能内存。 如果未施加 instance_memory 限制,那么对单个应用程序可分配的内存量没有其他限制。

如果存在 instance_memory 限制,根据配置,STMM 还会定期查询剩余的可用系统内存量以及剩余的可用 instance_memory 空间量。 为了防止应用程序发生故障,STMM 认为应用程序需求优先于性能条件。 如果需要,它将通过减少可用于性能堆的空间量来降低性能,从而提供足够的可用系统内存和 可用 instance_memory 空间来满足应用程序内存请求。 应用程序完成时,使用的内存将被释放,从而可供其他应用程序重复使用或者为 database_memory 回收以供 STMM 使用。 如果数据库系统的性能在应用程序活动频繁期间变得不可接受,那么最好对允许数据库管理器运行的应用程序数目进行控制(使用连接集中器或者 DB2 V9.5 新增的工作负载管理功能部件),或者考虑对系统添加内存资源。