服务器 频道

DB2如何使用内存(上篇)

  【IT168 服务器学院】简介

  理解 DB2 如何使用内存,可以防止过度分配内存,并有助于对内存的使用进行调优,从而获得更好的性能。

  本文将向您传授 DB2 内存使用的基础,以及共享内存和私有内存的概念。这些内容同时适用于 32 位和 64 位的系统。虽然对于 64 位系统有一些限制,但是在未来的一段时间内还不大可能触及这些限制。因此,我们将焦点放在影响 32 位系统的内存限制,并对之进行详细的讨论。

  我们首先讨论一般情况下 DB2 如何使用内存,接着讨论内存管理如何随着平台(AIX、Sun、HP、Linux 和 Windows)的不同而变化,以及它们对 DB2 的影响。最后,我们将给出一些实际生活中客户处境/问题以及他们的解决方案的有意义的例子。

  本文的内容适用于 DB2 version 8。

  DB2 内存结构概述

  图 1中说明了 DB2 内存结构。这种内存结构在所有平台上都是一致的。

  注意:在多分区环境中,下面的图适用于多分区实例中的每个分区。

  图 1 - DB2 内存结构

 

  DB2 在 4 种不同的内存集(memory set)内拆分和管理内存。这 4 种内存集分别是:

  • 实例共享内存(instance shared memory)
  • 数据库共享内存(database shared memory)
  • 应用程序组共享内存(application group shared memory)
  • 代理私有内存(agent private memory)

  

  每种内存集由各种不同的内存池(亦称堆)组成。图 1 也给出了各内存池的名称。例如, locklist是属于数据库共享内存集的一个内存池。 sortheap是属于代理私有内存集的一个内存池。

  我们将详细讨论每一种内存集。

  实例共享内存

  每个 DB2 实例都有一个实例共享内存。实例共享内存是在数据库管理器启动(db2start)时分配的,并随着数据库管理器的停止(db2stop)而释放。这种内存集用于实例级的任务,例如监控、审计和节点间通信。下面的数据库管理器配置(dbm cfg)参数控制着对实例共享内存以及其中个别内存池的限制:

  • 实例内存( instance_memory)。
  • 监视器堆( mon_heap_sz):用于监控。
  • Audit Buffer( audit_buf_sz):用于 db2audit 实用程序。
  • Fast Communication buffers ( fcm_num_buffers):用于分区之间的节点间通信。仅适用于分区的实例。

  instance_memory参数指定为实例管理预留的内存数量。默认值是 AUTOMATIC。这意味着 DB2 将根据监视器堆、审计缓冲区和 FCM 缓冲区的大小计算当前配置所需的实例内存数量。此外,DB2 还将分配一些额外的内存,作为溢出缓冲区。每当某个堆超出了其配置的大小时,便可以使用溢出缓冲区来满足实例共享内存区内任何堆的峰值需求。在这种情况下,个别堆的设置是 限制的,它们可以在内存使用的峰值期间进一步增长。

  如果 instance_memory被设置为某一个数字,则采用 instance_memorymon_heap_szaudit_buf_szfcm_num_buffers的和之间的较大者。这时,对实例内存就施加了一个硬性的限制,而不是软限制。当达到这个限制时,就会收到内存分配错误。出于这个原因,建议将 instance_memory的设置保留为 AUTOMATIC

  如果 instance_memory被设为 AUTOMATIC,则可以使用下面的命令来确定它的值:

  • db2 attach to instance_name(其中 instance_name是实例的名称)
  • db2 get dbm cfg show detail

  

  下面的输出表明有 42 MB 的内存被预留给实例共享内存集(10313 页 * 4096 字节/页):

  • Size of instance shared memory (4KB) (INSTANCE_MEMORY) = AUTOMATIC(10313) AUTOMATIC(10313)

  

  instance_memory参数只是设置了实例共享内存的限制。它并没有说出当前使用了多少内存。要查明一个实例的内存使用情况,可以使用 DB2 内存跟踪器工具 db2mtrk。例如,

  • db2start
  • db2mtrk -i -v

  

  

  • Memory for instance
  • FCMBP Heap is of size 17432576 bytes
  • Database Monitor Heap is of size 180224 bytes
  • Other Memory is of size 3686400 bytes
  • Total: 21299200 bytes

  

  上面的例子表明,虽然预留给实例共享内存集的内存有 42 MB,但在 db2mtrk运行时只用到了大约 21 MB。

  注意: 在某些情况下,db2mtrk 显示的大小会大于指定给配置参数的值。在这种情况下,赋予配置参数的值被作为一种软限制,内存池实际使用的内存可能会增长,从而超出配置的大小。

0
相关文章