本页面介绍了如何在 AlloyDB Omni 中启用一组 I/O 加速功能,这些功能有助于提高计算和 I/O 资源利用率,从而加快工作负载和查询性能。
这些功能包括:
- 撕裂写保护
O_DIRECT
支持- 异步 I/O (AIO)
- 流式读取
如需启用这些 I/O 加速功能,您需要启用 alloydb_omni_atomic
Grand Unified Configuration (GUC),并设置 AlloyDB Omni 以便使用 GUC。
I/O 加速功能
以下部分介绍了 alloydb_omni_atomic
GUC 启用的 I/O 加速功能。
撕裂写保护
启用 alloydb_omni_atomic
配置时,关闭整页写入,以防止因必须生成整页图片进行日志记录而产生性能开销。
O_DIRECT 支持
O_DIRECT
支持是原子写入的前提条件。O_DIRECT
适用于 PostgreSQL 数据目录和 AlloyDB Omni 磁盘缓存。如需了解详情,请参阅使用磁盘缓存提升数据库性能。
O_DIRECT
还提供以下优势:
- 使用
O_DIRECT
可避免 PostgreSQL 中的双缓冲问题。PostgreSQL 管理自己的缓冲区缓存,并且可以绕过操作系统内核缓冲区缓存。 O_DIRECT
可减少维护内核缓冲区缓存所需的系统 CPU 和内存开销。
异步 I/O
alloydb_omni_atomic
配置使用 io_uring
和 libaio
库提供异步 I/O (AIO) 功能。我们建议您使用 io_uring
,以避免旧版 libaio
库的限制。如果未检测到 io_uring
支持,AlloyDB Omni 会回退到 libaio
。这种方法克服了丢失缓冲 I/O 优势(例如预读和写入合并)的问题,还可确保最大限度地利用底层提供的存储空间的可用 I/O 带宽。
流式读取
AlloyDB Omni 使用流式读取,类似于 PostgreSQL 17 功能,通过使用向量化 I/O 将多个区块读入缓冲区缓存,从而提高顺序扫描、ANALYZE
和 pg_prewarm
的性能。向量化 I/O 是一种方法,其中单个过程调用可以从多个缓冲区预提取数据,从而通过减少上下文切换和系统调用来提高效率。
AlloyDB Omni 扩展了对使用流式读取的支持,以便使用 AIO 从 AlloyDB Omni 磁盘缓存读取数据,从而提高读取性能。这种方法有助于有效地提前将缓冲区从存储空间读入共享内存池,以供查询使用,而无需在每次需要时从存储空间读取这些区块。
准备工作
检查您的操作系统和文件系统支持。
如需确保内核支持
RWF_ATOMIC
,请检查内核版本。在以下示例中,您使用的是运行支持原子写入的 Linux 6.14 内核的 Ubuntu 24.10 机器。> sudo hostnamectl ... Operating System: Ubuntu 24.10 Kernel: Linux 6.14.0-061400rc5-generic ...
如果您的内核不支持
RWF_ATOMIC
,我们建议您更新到支持RWF_ATOMIC
的内核版本。
如需使用 AlloyDB Omni I/O 加速功能来测试具有撕裂写保护的性能提升,请启用
alloydb_omni_atomic
Grand Unification Configuration (GUC)。如需使用此 GUC,您必须拥有支持内核和文件系统,以提供原子 I/O 并防止写入撕裂。RWF_ATOMIC
标志用于原子写入支持。默认情况下,系统会在启动期间检查RWF_ATOMIC
的兼容性。如果无法确认具有RWF_ATOMIC
标志的原子写入,PostgreSQL 将无法启动。您可以替换此默认行为,但我们建议您使用受支持的平台和
force
选项,以免意外替换最佳配置设置。您可以使用
force_unsafe
选项替换RWF_ATOMIC
兼容性检查,但此替换无法保证数据安全。我们建议您不要使用此选项,除非您要在无法升级到使用相应内核和文件系统的环境中评估 AlloyDB Omni。下表列出了
alloydb_omni_atomic
配置设置和相应的兼容性检查。alloydb_omni_atomic
值启动兼容性检查 说明 off
不适用 此值会关闭原子模式。该功能处于非活跃状态。 force
执行启动兼容性检查。如果 RWF_ATOMIC
写入失败,则无法启动。设置原子模式配置。 force_unsafe
不执行启动兼容性检查。返回警告,但如果 RWF_ATOMIC
写入失败,则继续执行。设置原子模式配置。 在
force
/force_unsafe
配置中,系统会自动设置full_page_writes
、io_combine_limit
和debug_io_direct
配置。您可以使用可选的on
/on_unsafe
配置替换这些配置。
设置 AlloyDB Omni I/O 加速功能
为数据目录设置 XFS 文件系统。之所以使用 XFS,是因为它支持大于页面大小的文件系统区块大小。AlloyDB Omni 可以使用 XFS 以原子方式写入 8KiB 区块,并提供完整的
RWF_ATOMIC
支持。创建一个区块大小为 8KiB 的 XFS 文件系统,并将其装载到所需的数据目录 (
DATA_DIR
) 位置。sudo mkfs.xfs -f -b size=8k /dev/$DEVICE sudo mount /dev/$DEVICE DATA_DIR
进行以下替换:
DATA_DIR
:数据目录位置。
检查内核日志,确保使用的是 8k 区块:
> sudo journalctl -f ... kernel: XFS (sdc): EXPERIMENTAL large block size feature enabled. Use at your own risk! kernel: XFS (sdc): Mounting V5 Filesystem 350aa26a-7555-4566-94c1-74e54ddc9250 ...
可选:设置 AlloyDB Omni 磁盘缓存。
请使用以下示例使用
ext4,
创建文件系统,然后装载文件系统。sudo /sbin/mkfs.ext4 -m 1 -F -E lazy_itable_init=0,lazy_journal_init=0 /dev/DEVICE sudo mount --make-shared -o noatime,discard,errors=panic /dev/DEVICE /OMNI_DISK_CACHE_DIRECTORY
进行以下替换:
DEVICE
:应用与之互动以执行 I/O 操作(读取或写入数据)的实体。
为了在主存储空间无法提供更高的每秒输入/输出操作数 (IOPS) 的情况下支持 AlloyDB Omni I/O 加速功能的最佳性能,我们建议您设置 AlloyDB Omni 磁盘缓存。如需了解详情,请参阅使用磁盘缓存提升数据库性能。
下载并运行 AlloyDB Omni。
- 下载最新的 AlloyDB Omni Docker 容器。如需了解详情,请参阅在虚拟机上安装 AlloyDB Omni。
- 如需使用磁盘缓存,请按照使用磁盘缓存提升数据库性能中的说明操作。
如需允许
io_uring
,请添加一个额外的参数--security-opts="seccomp:unconfined"
docker run -d --name CONTAINER_NAME \ -e POSTGRES_PASSWORD=NEW_PASSWORD \ -v DATA_DIR:/var/lib/postgresql/data \ -v /OMNI_DISK_CACHE_DIRECTORY:/CACHE_DIRECTORY_PATH_INSIDE_CONTAINER \ # Only if disk cache is enabled -p HOST_PORT:5432 \ --security-opts="seccomp:unconfined" \ --restart=always \ google/alloydbomni:16
进行以下替换:
CONTAINER_NAME
:在宿主机的容器注册表中 AlloyDB Omni 容器的名称。NEW_PASSWORD
:分配给容器的 PostgreSQL 用户的密码。DATA_DIR
:数据目录位置。CACHE_DIRECTORY_PATH_INSIDE_CONTAINER
:容器内的磁盘缓存目录路径。HOST_PORT
:容器应将自己的端口 5432 发布到的宿主机上的 TCP 端口。
将 AlloyDB Omni 配置为使用原子 I/O。
将
alloydb_omni_atomic
GUC 设置为适当的值,然后重启容器。alter system set alloydb_omni_atomic='force'; sudo docker restart CONTAINER_NAME;
进行以下替换:
CONTAINER_NAME
:在宿主机的容器注册表中 AlloyDB Omni 容器的名称。
限制
- PostgreSQL 16 包含执行单个区块 I/O 的路径,这会导致
O_DIRECT
速度变慢。在数据库恢复(重做路径)、真空扫描和 Omni 磁盘缓存预热期间,读取速度可能会变慢。 - 预览版不支持读取副本中的 AlloyDB Omni I/O 加速功能。
- 在繁重的工作负载下,基于 ARM 的系统可能会因架构差异而表现出较低的性能。
- 由于
libaio
在工作负载增加时存在局限性,因此容易出现资源不可用的情况。当可用系统内存不足时,io_uring
可能会遇到内存分配问题。