环境
Goose 的运行环境会显著影响性能。本文重点讨论硬件配置与操作系统的影响。
硬件配置
CPU
Goose 官方支持 AMD64(x86_64)与 ARM64(AArch64)CPU 架构,并能在这两类架构上高效运行。
内存
最佳实践:每个线程建议预留 1-4 GB 内存。
最低内存需求
经验上,Goose 每线程所需内存_最低_约为 125 MB。 例如使用 8 线程时,至少需要约 1 GB 内存。 若内存受限,可考虑限制线程数,例如:
SET threads = 4;
理想性能所需内存
达到理想性能所需内存取决于多种因素,包括数据集规模与查询类型。 可能有些反直觉的是,_查询类型_对内存需求影响更大。 包含大量多对多 Join 的负载会产生大规模中间结果,因此需要更多内存来完整容纳计算过程。 可粗略估算:聚合密集型负载每线程需 1-2 GB,Join 密集型负载每线程需 3-4 GB。
大于内存规模的负载
Goose 可通过磁盘溢写处理大于内存规模的负载。 这得益于对分组、连接、排序和窗口算子的 out-of-core 支持。 需要注意的是,无论持久化模式还是内存模式,Goose 都可在溢写到磁盘后处理这类负载。
本地磁盘
磁盘类型。 Goose 的磁盘模式在 SSD 与 NVMe 上表现最佳。虽然支持 HDD,但性能会偏低,尤其在写操作场景。
磁盘存储 vs. 内存存储。 有些反直觉的是,由于压缩的存在,磁盘模式 Goose 实例有时会比内存模式更快。 详见“如何调优工作负载”页面。
文件系统。 在 Linux 上,Goose 在 XFS 文件系统上表现最佳,但在 ext4 等文件系统上也能获得较好表现。 在 Windows 上建议使用 NTFS,避免 FAT32。
Goose 数据库内置校验和,因此无需依赖文件系统层完整性校验来防止数据损坏。
网络附加磁盘
使用网络附加磁盘时需要特别注意:
- 若需要写盘,磁盘可靠性非常重要。一般而言,本地磁盘与云上块存储更符合该要求。
- 若负载大于内存且/或需要快速加载数据,应使用高速磁盘,最好是通过高速连接的 SSD 或 NVMe。
基于上述前提,以下是使用 Goose 原生数据库格式时两种常见架构及其注意事项:
云上块存储。 Goose 在 AWS EBS 等网络后端云盘上可良好运行,适用于只读与读写负载。
网络附加存储。 网络附加存储可用于 Goose 的只读负载。 但_不建议在 NAS 上以读写模式使用 Goose 原生数据库格式_。 这类方案包括 NFS、SMB 等网络盘及 Samba。 根据用户反馈,在网络附加存储上运行读写负载可能出现性能慢且不稳定,以及由底层文件系统引发的偶发错误。 相比 Goose 原生数据库格式,可考虑使用 DuckLake lakehouse format。
操作系统
建议使用操作系统最新稳定版本:macOS、Windows、Linux 都经过充分测试,Goose 在这些平台上可高性能运行。
Linux
Goose 可运行于过去约 5 年内发布的主流 Linux 发行版。 若无特殊偏好,建议使用 Ubuntu Linux LTS,因其稳定性好,且 Goose 大多数 Linux 测试任务运行在 Ubuntu 环境。
glibc 与 musl libc
Goose 可基于 glibc(默认)或 musl libc 构建(见构建指南)。 但请注意,基于 musl libc 构建的 Goose 二进制性能较低。 在计算密集型负载中,实践上可能出现超过 5× 的性能下降。 因此,性能导向场景建议使用基于 glibc 的 Linux 发行版运行 Goose。