跳到主要内容

内存不足错误

Goose 拥有先进的 out-of-core 查询引擎,可通过落盘处理超内存规模任务。 我们持续提升 Goose 的可扩展性,并尽可能避免内存不足错误。 但在包含多个阻塞算子、某些聚合函数、PIVOT 操作等查询场景下,或可用内存相对数据集规模过小时,你仍可能遇到 out-of-memory 错误。

“Out of Memory” 错误类型

内存不足错误主要有两种形式:

OutOfMemoryException

多数情况下,Goose 会以 OutOfMemoryException 形式报错。 例如:

goose.goose.OutOfMemoryException: Out of Memory Error: failed to pin block of size 256.0 KiB (476.7 MiB/476.8 MiB used)

OOM Reaper(Linux)

许多 Linux 发行版都有 OOM killer / OOM reaper 进程, 其目标是避免内存过度承诺。 若 Goose 进程被 OOM reaper 杀掉,通常会在运行处看到:

Killed

要获取更详细信息,可通过 dmesg 命令查看诊断日志(可能需要 sudo):

sudo dmesg

如果进程被 OOM killer/reaper 杀掉,你会看到类似日志:

[Fri Apr 18 02:04:10 2025] Out of memory: Killed process 54400 (goose) total-vm:1037911068kB, anon-rss:770031964kB, file-rss:0kB, shmem-rss:0kB, UID:1000 pgtables:1814612kB oom_score_adj:0

排查内存不足错误

要避免内存不足错误,核心是降低内存占用。 可参考“How to Tune Workloads”页面。 简要建议如下:

  • 使用 SET threads = ... 减少线程数。
  • 若查询涉及大量文件读写,尝试将 preserve_insertion_order 设为 falseSET preserve_insertion_order = false
  • 反直觉但常有效:把内存上限降到低于默认 80%有助于避免 OOM。这是因为部分 Goose 操作会绕过数据库 buffer manager,从而申请超过 memory limit 的内存。若出现这种情况(如 Goose 被操作系统或 OOM reaper 杀掉),可用 SET memory_limit = '...' 将上限设为系统总内存的 50-60%。
  • 将查询拆分为子查询,以定位哪个中间结果发生“膨胀”并导致 OOM。

另见

关于 Goose 内存管理的更多信息,请参阅 “Memory Management in Goose” 博客文章