观澜交警大队电话:DB2内存概念

来源:百度文库 编辑:九乡新闻网 时间:2024/04/25 14:45:24

DB2 在 4 种不同的内存集(memory set)内拆分和管理内存。这 4 种内存集分别是:
实例共享内存(instance shared memory)
数据库共享内存(database shared memory)
应用程序组共享内存(application group shared memory)
代理私有内存(agent private memory)

1、实例共享内存(instance shared memory)
每个 DB2 实例都有一个实例共享内存。实例共享内存是在数据库管理器启动(db2start)时分配的,并随着数据库管理器的停止(db2stop)而释放。这种内存集用于实例级的任务,例如监控、审计和节点间通信。
实例内存( instance_memory):指定为实例管理预留的内存数量。默认值是 AUTOMATIC。。
监视器堆( mon_heap_sz):用于监控。
Audit Buffer( audit_buf_sz):用于 db2audit 实用程序。
Fast Communication buffers ( fcm_num_buffers):用于分区之间的节点间通信。仅适用于分区的实例。

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

$ db2mtrk -i -v
Tracking Memory on: 2007/03/08 at 09:44:08
Memory for instance
Database Monitor Heap is of size 81920 bytes
Other Memory is of size 2768896 bytes
FCMBP Heap is of size 33652736 bytes
Total: 36503552 bytes

2、数据库共享内存(database shared memory)
每个数据库有一个数据库共享内存集。数据库共享内存是在数据库被激活或者第一次被连接上的时候分配的。该内存集将在数据库处于非激活状态时释放(如果数据 库先前是处于激活状态)或者最后一个连接被断开的时候释放。这种内存用于数据库级的任务,例如备份/恢复、锁定和 SQL 的执行。

UTIL_HEAP_SZ:当一个数据库第一次启动时,不管 util_heap_sz的值是多少,只有大约 16 KB 的内存被分配给实用程序堆。当一个数据库实用程序(例如备份、恢复、导出、导入和装载)启动时,才会按util_heap_sz指定的大小分配全额的内 存。
sheapthres_shr:如果启用了内部分区并行性(intra-partition parallelism)或者集中器concentrator),那么当 DB2 断定共享排序比私有排序更有效时,DB2 就会选择执行共享排序。如果执行共享排序,那么就会在数据库共享内存中分配用于这种排序的排序堆。用于共享排序的最大内存量是由 sheapthres_shr数据库参数指定的。这是对共享排序在任何时刻可以消耗的内存总量在数据库范围内的 硬限制。当达到这个限制时,请求排序的应用程序将收到错误 SQL0955 (rc2)。之后,在共享内存总消耗量回落到低于由 sheapthres_shr指定的限制之前,任何共享排序内存的请求都得不到允许。
PCKCACHESZ:maxappls * 8(maxappls 是动态值)
CATALOGCACHE_SZ:maxappls * 4 (maxappls 是动态值)
DBHEAP(包括LOGBUFSZ):
LOCKLIST:
隐藏的bufferpool:4k、8K、16K、32K
主数据缓存:数据库缓冲池通常是数据库共享内存中最大的一块内存。DB2 在其中操纵所有常规数据和索引数据。一个数据库必须至少有一个缓冲池,并且可以有多个缓冲池,这要视工作负载的特征、数据库中使用的数据库页面大小等因素 而定。例如,页面大小为 8KB 的表空间只能使用页面大小为 8KB 的缓冲池。通过 SELECT * FROM SYSCAT.BUFFERPOOLS 显示。如果主缓冲池配置得太大,则可能出现主缓冲池不适合可寻址内存空间的情况(在此情况下,用户将收到一条警告(SQLSTATE 01626)),这时,应该连接到数据库,并减少主缓冲池的大小。

数据库共享内存 = (主缓冲池 + 4 个隐藏的缓冲池 + 数据库堆 +实用程序堆 + locklist + 包缓存 + 编目缓存 + sheapthres_shr) + (estore 的页数 * 100 字节) + 大约 10% 的开销

使用 db2mtrk 工具显示当前使用的内存量: db2mtrk -i -d -v (在 Windows 中,-i 必须指定。在 UNIX 中,-i 是可选的。)
$ db2mtrk -v -d
Tracking Memory on: 2007/03/08 at 10:16:52
Memory for database: SAFEDB
Backup/Restore/Util Heap is of size 16384 bytes
Package Cache is of size 131072 bytes
Catalog Cache Heap is of size 65536 bytes
Buffer Pool Heap is of size 16728064 bytes
Buffer Pool Heap is of size 4325376 bytes
Buffer Pool Heap is of size 655360 bytes
Buffer Pool Heap is of size 393216 bytes
Buffer Pool Heap is of size 262144 bytes
Buffer Pool Heap is of size 196608 bytes
Shared Sort Heap is of size 0 bytes
Lock Manager Heap is of size 21102592 bytes
Database Heap is of size 3948544 bytes
Other Memory is of size 16384 bytes
Application Control Heap is of size 16384 bytes
Application Control Heap is of size 98304 bytes
Application Group Shared Heap is of size 18644992 bytes
Total: 66600960 bytes

3、应用程序组共享内存(application group shared memory)
这种共享内存集仅适用于以下环境。(对于其他环境,这种内存集不存在。)
多分区(multi-partitioned)数据库。
启用了内部并行(intra-parallel)处理的未分区(non-partitioned)数据库。
支持连接集中器的数据库。当 max_connections的值大于 max_coordagents的值时,连接集中器便被启用。

应用程序组内存集是从数据库共享内存集中分配的。其大小由 appgroup_mem_sz数据库配置参数决定。

最大应用程序内存集大小 (4KB) (APPGROUP_MEM_SZ) = 40000
最大应用程序控制堆大小 (4KB) (APP_CTL_HEAP_SZ) = 512
用于应用程序组堆的内存所占百分比 (GROUPHEAP_RATIO) = 70
可以计算出下面的值:
应用程序组共享内存集是: 40000 页 * 4K/页 = 160 MB
应用程序组共享堆的大小是: 40000 * 70% = 28000 4K 页 = 114MB
该应用程序组内可容纳的应用程序数为: 40000/512 = 78 (appgroup_mem_sz / app_ctl_heap_sz )
用于每个应用程序的应用程序控制堆为: (100-70)% * 512 = 153 4K 页 = 0.6MB

如果有200个应用程序,需要应用程序组数目: 200/78 = 3 个,应确保系统有足够多的 RAM 来支持这一配置。否则就会发生 SQL10003N 错误。

4、代理私有内存(agent private memory)
每个 DB2 代理进程都需要获得内存,以执行其任务。代理进程将代表应用程序使用内存来优化、构建和执行访问计划,执行排序,记录游标信息(例如位置和状态),收集统 计信息,等等。为响应并行环境中的一个连接请求或一个新的 SQL 请求,要为一个 DB2 代理分配代理私有内存。

数据库连接数量(connections)受下面两者中的较低者限制:
db参数: maxappls 的总和,这指定了允许的活动应用程序的最大数量。
dbm参数: maxagents 的值,这指定了允许的最大代理数。

Application Heap ( applheapsz)
Sort Heap ( sortheap)
Statement Heap ( stmtheap)
Statistics Heap ( stat_heap_sz)
Query Heap ( query_heap_sz)
Java Interpreter Heap ( java_heap_sz)
Agent Stack Size ( agent_stack_sz) (仅适用于 Windows)
私有内存是在一个 DB2 代理被“指派”执行任务时分配给该代理的。那么,私有内存何时释放呢?答案取决于 dbm cfg 参数 num_poolagents的值。该参数的值指定任何时候可以保留的闲置代理的最大数目。如果该值为 0,那么就不允许有限制代理。只要一个代理完成了它的工作,这个代理就要被销毁,它的内存也要返回给操作系统。如果该参数被设为一个非零值,那么一个代理 在完成其工作后不会被销毁。相反,它将被返回到闲置代理池,直到闲置代理的数目到达 num_poolagents指定的最大值。当传入一个新的请求时,就要调用这些闲置代理来服务该新请求。这样就减少了创建和销毁代理的开销。

当代理变成闲置代理时,它仍然保留了其代理的私有内存。这样设计是为了提高性能,因为当代理被再次调用时,它便有准备好的私有内存。如果有很多的闲 置代理,并且所有这些闲置代理都保留了它们的私有内存,那么就可能导致系统耗尽内存。为了避免这种情况,DB2 使用一个注册表变量来限制每个闲置代理可以保留的内存量。这个变量就是 DB2MEMMAXFREE。它的默认值是 8 388 608 字节。这意味着每个闲置代理可以保留最多 8MB 的私有内存。如果有 100 个闲置代理,那么这些代理将保留 800MB 的内存,因此它们很快就会耗尽 RAM。您可能希望降低或增加这一限制,这取决于 RAM 的大小。