《DB2性能管理与实战》——2.2 共享内存与私有内存

    xiaoxiao2024-02-19  111

    本节书摘来自异步社区出版社《DB2性能管理与实战》一书中的第2章,第2.2节,作者: IBM中国开发中心(CDL) 信息管理软件开发部,更多章节内容可以访问云栖社区“异步社区”公众号查看。

    2.2 共享内存与私有内存

    DB2性能管理与实战至此,已经讨论了实例共享内存、数据库共享内存和应用程序组共享内存以及代理私有内存。但是共享内存和私有内存的意义是什么呢?

    为了理解共享内存与私有内存之间的不同之处,首先通过快速阅读DB2进程模型来了解一下DB2代理进程。在DB2中,所有数据库请求都是由DB2代理或子代理来服务的。例如,当一个应用程序连接到一个数据库时,就有一个DB2代理指派给它。当该应用程序发出任何数据库请求(例如一个SQL查询)时,该代理就会执行完成这个查询所需的所有任务——它代表该应用程序工作(如果数据库是分区的,或者启用了INTRA_PARALLEL,那么可以分配不止一个的代理来代表应用程序工作,这些代理叫做子代理)。

    每个代理或子代理都被当作一个DB2进程,它获得一定数量的内存来执行工作。这种内存被称作 代理私有内存——它不能与其他任何代理共享。之前曾提到过,代理私有内存包括一些内存池,例如应用程序堆大小、排序堆大小和语句堆大小(见图2-5)。

    除了私有内存(代理在其中使用排序堆执行“私有”任务,例如私有排序)外,代理还需要数据库级的资源,例如缓冲池、LOCKLIST和日志缓冲区。这些资源在数据库共享内存中(见图2-5)。DB2的工作方式是数据库共享内存中的所有资源都由连接到相同数据库的所有代理或子代理共享。因此,该内存集被称作共享内存,而不是私有内存。例如,连接到数据库A的代理x使用数据库A的数据库共享内存中的资源。现在又有一个代理,即代理y也连接到数据库A。那么代理y将与代理x共享数据库A的数据库内存(当然,代理x和代理y都有其自己的代理私有内存,这些代理私有内存不是共享的)。

    这样的逻辑同样适用于实例共享内存和应用程序组共享内存。

    图2-5所示为了当两个DB2代理(代理x和代理y)连接到数据库A时分配的DB2内存集。假设:

    boll 数据库A属于实例db2inst1;

    boll 数据库A为应用程序组1启用了INTRA_PARALLEL;

    boll 代理x和代理y都属于应用程序组1。

    boll 用于实例db2inst1的实例共享内存集。

    boll 用于数据库A的数据库共享内存集。

    boll 用于应用程序组1的应用程序组共享内存。

    boll 用于代理x的代理私有内存集。

    boll 用于代理y的代理私有内存集。

    boll 为内核和库之类的东西预留的内存。

    代理x和代理y共享相同的实例内存、数据库内存和应用程序组内存,因为它们属于相同的实例、相同的数据库和相同的应用程序组。此外,它们有其自己的代理私有内存。

    每个DB2代理进程都有其自己的内存地址空间。在内存空间中的内存地址允许代理访问物理RAM中的内存。可以把这些地址看作指向RAM的指针,如图2-5所示。对于任何DB2进程,这个地址空间必须能够容纳上述所有4种内存集。

    本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

    相关资源:敏捷开发V1.0.pptx
    最新回复(0)