【Rust日报】2026-09-29 24 核机器在 Polars 里空转

💡 原文中文,约2800字,阅读约需7分钟。
📝

内容提要

Polars 在 24 核机器上并行效率低:正则缓冲池锁竞争使过滤仅约 7.5 倍加速,改为每线程独立正则后提升至约 20 倍;窗口函数在分组少时空转,改走 Rayon 并行排序后耗时减半。另发布 fframes 1.0(Rust+SVG GPU 渲染视频)、纯 Rust AEGIS 库 Philbin,以及 Rust 领导理事会九月更新。

🔎

延伸解读

锁竞争:并行加速的隐形瓶颈

Polars 在 24 核机器上过滤仅获约 7.5 倍加速,根源是正则缓冲池的锁竞争:池中仅一个免锁槽,其余线程需互斥锁,导致 23 个线程排队。改为每线程独立正则后,24 线程扩展提升至约 20.4 倍。这提醒我们,并行效率低下未必是算法问题,共享资源的争用常是主因,尤其在使用外部库时需留意其线程模型。

窗口函数空转:分组少时的并行策略

窗口函数在分组数少时出现空转:sum() over 约 23 核忙碌,而带 order by 的 row_number() 仅约 2.29 核忙碌,耗时约 50 秒。原因是组内排序只利用少数线程。当分组数少于线程数时,顶层调用改走 Rayon 并行排序,3 个分组的查询耗时从约 20.4 秒降至约 10.6 秒,而 50 个分组的对照查询持平。这说明并行策略需随数据特征动态调整。

Philbin:安全与性能兼顾的纯 Rust 加密库

Philbin 是 AEGIS 认证加密算法的纯 Rust 实现,对应 RFC 10032。它通过运行时 CPU 探测分发到 SIMD 实现,普通 release 二进制即可覆盖 x86-64 与 AArch64,无需 target-cpu=native。实现中仅两行 unsafe,并包含差分 fuzz 和 TVLA 测试。API 分 easy 和 careful,easy 模式自动处理 nonce 并使用 CSPRNG,默认 256 位标签和 AEGIS-256X4,适合需要高性能加密的 Rust 项目。

❓

Q&A

Polars 在 24 核机器上为什么并行效率低?

主要原因是正则缓冲池的锁竞争。Polars 将同一个正则对象交给每个解码线程,而正则库的缓冲池只有一个免锁槽,其余线程需要互斥锁,导致 23 个线程在借还缓冲时阻塞,过滤操作仅获得约 7.5 倍加速。

如何优化 Polars 中正则过滤的并行性能?

给每个线程一份自己的正则对象,避免共享缓冲池的锁竞争。优化后,在 8 通道内存机器上,like '%special%' 查询从 2544.0 ms 降至 1085.9 ms,24 线程扩展从约 8.6 倍提升到约 20.4 倍。

Polars 窗口函数在什么情况下会空转?如何解决?

当分组数很少(少于线程数)时,窗口函数中的组内排序只占用少数线程,导致 CPU 空转。解决方案是在组数少于线程数时,顶层调用改走 Rayon 并行排序。例如,3 个分组的查询从 20402 ms 降至 10557 ms,提升约 48%。

fframes 是什么?它有什么特点?

fframes 是一个用 Rust 编写视频、用 SVG 描述画面、并在 GPU 上渲染的视频框架。它通过 svgr! 宏返回 SVG 树,静态片段编译期缓存;GPU 后端使用 Skia(macOS 用 Metal,Linux/Windows 用 Vulkan),比 CPU 后端快约 10 倍;编码直接链接 ffmpeg 的 libav 库。

Philbin 库有什么优势?

Philbin 是纯 Rust 实现的 AEGIS 认证加密库,支持运行时 CPU 探测分发到对应 SIMD 实现,无需 target-cpu=native。在有 AES 硬件加速的 CPU 上,它比 AES-GCM 和 ChaCha20-Poly1305 更快。代码中仅两行 unsafe,并包含差分 fuzz 和 TVLA 测试。

Rust 领导理事会九月更新了哪些内容?

更新包括:9 月代表选举结果(Jakub Beránek、Pete LeVasseur、Mark Rousskov、Oli Scherer 连任);启动两名 Rust Foundation 项目董事选举;Funding 团队再获 12 万美元;项目优先级预算改为当年用完;Mentors 团队追加 3.2 万美元;差旅预算追加 32325 美元;新建 LLM policy 团队;Rust Foundation 全职聘用 Tomáš Šedovič 为项目经理。

🏷️

标签

➡️

继续阅读