看到了 xuanwo 的一篇 博客,感觉很有意思。

完整读一遍也可以,不过也可以看我的省流。

Python IO 比 C / Rust IO 更快

  • 有人发现在 AMD Ryzen 9 5900X 和 AMD Ryzen 7 5700X 上访问页对齐的前10个 byte 会比其他偏移有更多的 L1 prefetch 和 load 的 miss 。
  • 学过 x86 汇编的应该知道不同于 RISC ,x86 是有专门用于复制字符串的指令的。有人发现上述问题的底层原因来自于 AMD 对 FSRM(Fast Short REP MOV) 的实现,逆天的是在 Zen 3 上,访问页对齐的数据比不对齐慢

更有趣的事情

  • 作者发现将 C 的分配器换成 jemalloc 后速度就可以击败 Python 了,我个人猜测可能是 mmap 后分配的页对齐的内存使用了更多(也就是大于 glibc 的 10 byte)来存 meta data ,恰巧避免了这个硬件 bug 。
  • 有人使用 eBPF profile 发现 Rust 和 Python 的 fs read 在系统调用的延迟上存在差距,Rust 更慢。
  • 为了解决这个奇怪的性能问题,作者(开源大手子漩涡)和他的开源伙伴(包括了热心网友、国内开源大佬依云和一些内核开发者)使用了 strace, perf, eBPF 等各种性能分析工具,以及分析了各种可能导致性能问题的原因(内存大页、CPU 核亲和性、mmap 分配匿名内存、Linux 启动选项例如 Enable Mitigations、系统调用延迟等)。
  • 朋友 告诉我「Intel 前几天刚出了 rep mov 导致的 Dos 漏洞」。
  • 好消息是 FSRM 是微码实现,也许在未来的某一次更新就修好了🥰。

相关链接