自动内存管理简介

选择文档版本:

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 大小的上限,并以该指定的自定义大小为起点。

如需指定自定义尺寸,您可以将 shared_buffers 设置为 1GB。具体方法取决于您的部署类型:

对于基于 Linux 的安装(包括 RPM),您可以使用以下方法之一设置 shared_buffers 参数。应用更改后,您必须重启服务。

  • 方式 1:修改配置文件

    1. 打开 postgresql.conf 文件进行修改。

    2. 添加或修改以下行:

      shared_buffers = 1GB
      
    3. 保存文件并重启 AlloyDB Omni 服务:

      sudo systemctl restart alloydbomniMAJOR_VERSION

      MAJOR_VERSION 替换为 AlloyDB Omni 安装的主要版本,例如 18

  • 方法 2:使用 ALTER SYSTEM 命令

    1. 使用 SQL 客户端连接到数据库实例。

    2. 运行以下命令:

      ALTER SYSTEM SET shared_buffers = '1GB';
      
    3. 重启 AlloyDB Omni 服务:

      sudo systemctl restart alloydbomniMAJOR_VERSION

      MAJOR_VERSION 替换为 AlloyDB Omni 安装的主要版本,例如 18

优化查询性能

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

不过,您可以对该值进行调优以实现最佳性能。如果您选择依靠 shared_buffers 的默认值来推断共享缓冲区上限,请使用 cgroup memory.max 值来影响计算。

列式引擎内存

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

大内存页

大内存页可提高数据库性能。AlloyDB Omni 会尽可能明确管理大内存页,否则它会依赖于操作系统的透明大内存页 (THP) 功能。如果不支持这两种大内存页类型,AlloyDB Omni 会回退到 4k 页,并在数据库日志中输出一条警告,其中包含设置大内存页的具体说明。

警告类似于以下内容:


HINT:  Please manually execute:
          echo within_size | sudo tee /sys/kernel/mm/transparent_hugepage/shmem_enabled
          sudo sysctl -w vm.nr_overcommit_hugepages="$(/usr/bin/awk '/MemTotal/ { printf "%.0f", $2/1024 }' /proc/meminfo)"

运行时的自动内存管理

AlloyDB Omni 会持续监控系统负载,并调整其内存消耗以提高性能。具体而言,您可能会观察到以下情况:

动态 shared_buffers 大小更改
AlloyDB Omni 会在系统内存消耗较低时增大动态 shared_buffers 大小,并在系统内存消耗较高时减小该大小。`g_memory` 扩展程序包含在 AlloyDB Omni 分发版中。如需启用该功能并监控动态 `shared_buffers` 大小,请运行以下命令:
CREATE EXTENSION IF NOT EXISTS g_memory;
SELECT g_dynamic_shared_size();
在系统内存极低时终止 PostgreSQL 连接
当 AlloyDB Omni 检测到系统内存极低时,会尝试删除内存消耗量最大的 PostgreSQL 连接,直到负载回落到合理水平。发生此类事件时,AlloyDB Omni 会在数据库日志中记录类似以下示例的条目:
WARNING: Sending SIGTERM to pid=12345 NSpid=67890 (VA size = 1024MB) (RSS size = 512MB)