使用 I/O 加速提升 AlloyDB Omni 性能

本页面介绍了如何在 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_uringlibaio 库提供异步 I/O (AIO) 功能。我们建议您使用 io_uring,以避免旧版 libaio 库的限制。如果未检测到 io_uring 支持,AlloyDB Omni 会回退到 libaio。这种方法克服了丢失缓冲 I/O 优势(例如预读和写入合并)的问题,还可确保最大限度地利用底层提供的存储空间的可用 I/O 带宽。

流式读取

AlloyDB Omni 使用流式读取,类似于 PostgreSQL 17 功能,通过使用向量化 I/O 将多个区块读入缓冲区缓存,从而提高顺序扫描、ANALYZEpg_prewarm 的性能。向量化 I/O 是一种方法,其中单个过程调用可以从多个缓冲区预提取数据,从而通过减少上下文切换和系统调用来提高效率。

AlloyDB Omni 扩展了对使用流式读取的支持,以便使用 AIO 从 AlloyDB Omni 磁盘缓存读取数据,从而提高读取性能。这种方法有助于有效地提前将缓冲区从存储空间读入共享内存池,以供查询使用,而无需在每次需要时从存储空间读取这些区块。

准备工作

  1. 检查您的操作系统和文件系统支持。

    1. 如需确保内核支持 RWF_ATOMIC,请检查内核版本。在以下示例中,您使用的是运行支持原子写入的 Linux 6.14 内核的 Ubuntu 24.10 机器。

      > sudo hostnamectl
       ...
       Operating System: Ubuntu 24.10
            Kernel: Linux 6.14.0-061400rc5-generic
      ...
      
    2. 如果您的内核不支持 RWF_ATOMIC,我们建议您更新到支持 RWF_ATOMIC 的内核版本。

  2. 如需使用 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_writesio_combine_limitdebug_io_direct 配置。您可以使用可选的 on/on_unsafe 配置替换这些配置。

设置 AlloyDB Omni I/O 加速功能

  1. 为数据目录设置 XFS 文件系统。之所以使用 XFS,是因为它支持大于页面大小的文件系统区块大小。AlloyDB Omni 可以使用 XFS 以原子方式写入 8KiB 区块,并提供完整的 RWF_ATOMIC 支持。

    1. 创建一个区块大小为 8KiB 的 XFS 文件系统,并将其装载到所需的数据目录 (DATA_DIR) 位置。

      sudo mkfs.xfs -f -b size=8k /dev/$DEVICE
      sudo mount /dev/$DEVICE DATA_DIR
      

      进行以下替换:

      • DATA_DIR:数据目录位置。
    2. 检查内核日志,确保使用的是 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
      ...
      
  2. 可选:设置 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 磁盘缓存。如需了解详情,请参阅使用磁盘缓存提升数据库性能

  3. 下载并运行 AlloyDB Omni。

    1. 下载最新的 AlloyDB Omni Docker 容器。如需了解详情,请参阅在虚拟机上安装 AlloyDB Omni
    2. 如需使用磁盘缓存,请按照使用磁盘缓存提升数据库性能中的说明操作。
    3. 如需允许 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 端口。
  4. 将 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 可能会遇到内存分配问题。