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)