自动内存管理简介

AlloyDB Omni 使用自适应算法进行内存管理。

您可以在启动 AlloyDB Omni 时确定共享缓冲区的上限。如果您未设置上限,AlloyDB Omni 会自动将共享缓冲区备份大小设置为系统内存的 80%。共享缓冲区的初始备份大小可以与上限不同。

AlloyDB Omni 由智能内存工作器组成,该工作器会持续监控内存状态,并调整共享缓冲区备份大小,以便在缓存数据时实现最佳性能。

自动内存

默认情况下,shared_buffers 参数设置为 0,这是一个特殊值,用于将 shared buffers 缓存大小的上限设置为系统内存的 80%。AlloyDB Omni 的起始值为 shared_buffers 上限的 10%。如果 shared_buffers 被自定义值替换,AlloyDB Omni 会将该值视为 shared_buffers 大小的上限,并从该指定的自定义大小开始。

如需指定自定义大小,请修改 postgresql.conf 配置文件。例如,您可以使用以下任一方法将 shared_buffers 设置为 1GB

  • docker run --name CONTAINER_NAME -e INITDB_ARGS="-c shared_buffers=1GB" $image

  • docker run --name CONTAINER_NAME $image -c shared_buffers=1GB

    CONTAINER_NAME 替换为您在安装 AlloyDB Omni 容器时为其分配的名称。

优化查询性能

shared_buffers 参数的默认值适用于常见场景。

不过,您可以调整此值以获得最佳性能。如果您选择依赖 shared_buffers 的默认值来推断共享缓冲区上限,则可以使用 cgroup memory.max 值来影响计算。

列式引擎内存

动态 shared_buffers列式引擎内存无关。启用列式引擎后,可通过将列式引擎使用的内存量从系统或 cgroup 可用总内存的 80% 中减去来派生动态 shared_buffers 大小。

大内存页

超大页面可提升数据库性能。AlloyDB Omni 会尽可能显式管理大型页面,否则会依赖于操作系统的透明大型页面 (THP) 功能。如果系统不支持这两种超大页类型,AlloyDB Omni 会回退到 4k 页,并在 docker 容器日志 docker logs $container_name 中输出一条警告,其中包含设置超大页的具体说明。如需了解如何启动容器,请参阅启动 AlloyDB Omni

警告类似于以下内容:

HINT:  Please either execute the all-in-one setup script:
          docker run --rm --privileged $image setup-host
        OR manually execute:
          echo within_size | sudo tee /sys/kernel/mm/transparent_hugepage/shmem_enabled
          sudo sysctl -w vm.nr_overcommit_hugepages=1048576

运行时自动内存管理

AlloyDB Omni 会持续监控系统负载,并调整其内存用量以提升性能。具体而言,您可能会看到以下情况:

动态 shared_buffers 大小更改
AlloyDB Omni 会在系统内存消耗较低时增加动态 shared_buffers 大小,在系统内存消耗较高时减小大小。如需监控动态 shared_buffers 大小,请使用以下命令:
CREATE EXTENSION IF NOT EXISTS g_memory;
SELECT g_dynamic_shared_size();
当系统内存极低时终止 PostgreSQL 连接
当 AlloyDB Omni 检测到系统内存极低时,会尝试删除占用内存最多的 PostgreSQL 连接,直到负载恢复到合理水平。发生此类事件时,AlloyDB Omni 会在 docker 容器日志中记录以下内容:
WARNING: Sending SIGTERM to pid=xxx NSpid=xxx (VA size = xxxMB) (RSS size = xxxMB)