RipGrep 在 musl 二进制文件中偶发崩溃

RipGrep musl binaries occasionally segfault during very-large searches

在使用 RipGrep 的 x86_64-unknown-linux-musl 二进制文件进行大规模搜索时,我遇到了偶发的段错误(SIGSEGV)崩溃问题。该问题在 OpenSUSE Tumbleweed 系统上复现,特别是在高并发搜索包含约 1.8M 个文件、总计 20GiB 数据的目录树时。崩溃发生在 MUSL 的 mallocng 内存管理器的完整性断言中,具体是在 opendir 调用 calloc 时触发的。通过构建带有调试符号的 RipGrep 版本并运行特定脚本生成的测试数据,我成功复现了该问题并获取了完整的回溯堆栈。这揭示了在极端负载下,RipGrep 与 MUSL 标准库交互时存在的潜在内存安全隐患。

RipGrep 为 x86_64-unknown-linux-musl 构建的二进制文件在高并发搜索超大目录树时,偶尔会因 MUSL 的 mallocng 堆元数据完整性断言失败而触发段错误。
  1. ndesaulniers

    哈哈,来自内核补丁:https://lore.kernel.org/all/CALCETrXbj__SFQMzPZhES5y6-sh4np-...

    > 我在 ripgrep 里看到了一个有趣的 bug 报告,以及一份认真但非常糟糕的 AI 生成分析

    指的是 https://github.com/dfoxfranke/ripgrep-3494-analysis,我当时确实觉得“这写得太多了,不像是人写的”。

    看来那个帖子是……今天发的!

  2. Orphis

    我理解为什么人们不总是去替换 musl 的默认分配器(它就在手边,很方便)。但对于一个以“快”为核心目标的应用来说,我觉得很奇怪他们竟然没费心换成一个性能更好的分配器。

    mallocng 在处理多线程竞争时表现很差。我遇到过一些通常受 I/O 限制的应用,在多线程场景下用 musl 构建时突然变成了“malloc 瓶颈”(而且仅仅只有 8 个线程)。切换到 mimalloc 后性能提升了 20 倍,非常接近 glibc 默认的表现,只是略低于 glibc + mimalloc 的组合。

    我明白这里确实有个真问题,而且对某些人来说解决它很有趣,但它本不该以这种方式暴露出来。

  3. dosman33

    任何在 HPC 集群上针对大型集群文件系统运行 ripgrep 的人,都应该停下来重新设计他们的工作流。这会生成大量的小 I/O,而这是任何大型集群文件系统的阿喀琉斯之踵。你实际上是将工作负载转嫁给了文件系统的元数据机制,而不是将其保留在集群内更高带宽的内存子系统中。只要同时有几个用户运行这类任务,就足以让高带宽文件系统崩溃。别再这么干了。

  4. hyperpape

    链接到内核 bug 的分析可能更好:https://github.com/dfoxfranke/ripgrep-3494-analysis

  5. sligor

    那么,为什么这个 bug 只在 muslc 上触发,而在其他 libc 上不触发呢?

  6. walk12111

    我通常会怀疑是 musl 的线程栈大小问题。内核 bug 确认了吗?

  7. wild_pointer

    哇,一切都坏了 lol

  8. villgax

    难怪 codex 里的搜索功能那么烂

同日更多故事

2026-08-01