Rustのstd fsはPythonより遅いのか? いや、ハードウェアの問題だった
(xuanwo.io)OpenDALのPythonバインディングはPythonより遅いのか?
- OpenDALは、さまざまなストレージサービスからデータを効率的に取得できるようにするデータアクセスレイヤー。
- OpenDALのPythonバインディングが、Python自体より遅いという報告がある。
- 原因として、Python内部のキャッシュ、ファイル読み取りの高速化、PyO3の追加オーバーヘッドなどの可能性が仮説として示されている。
OpenDALのFsサービスはPythonより遅いのか?
- Rust、OpenDAL、Python、PyO3など、複数の要素が関係する問題。
- Rustで実装されたOpenDALのfsサービスも、Pythonより遅いことが判明した。
Rustのstd fsはPythonより遅いのか?
- OpenDALは
std::fsを通じてfsサービスを実装している。 - Rustの
std::fsを使った実装でも、Pythonより遅いことが確認された。
Rustのstd fsはPythonより遅いのか? 本当に!?
- Rustのstd fsがPythonより遅いという結果に疑問を呈している。
straceを使ってシステムコールを分析する方法を学んだ。straceの結果を分析したものの、両者ともmmapを使っているにもかかわらず、なぜPythonのほうが速いのかは分からなかった。
なぜここでmmapを使うのか?
mmapはファイルをメモリにマップする以外にも、大規模なメモリ領域の割り当てに使われる。mallocでメモリを要求すると、glibcがmmapを使ってメモリを割り当てる。
PythonはRustと同じメモリアロケータを持っているのか?
- Pythonは、小さな割り当てに最適化された
pymallocというメモリアロケータを使っている。 pymallocは小さなオブジェクトに最適化されており、大きな割り当てにはPyMem_RawMalloc()とPyMem_RawRealloc()を使う。
RustはデフォルトのメモリアロケータでPythonより遅いのか?
mmapが問題を引き起こしていると疑われた。jemallocに切り替えたRustプログラムが、Pythonより速く動作することが分かった。
Rustは自分のコンピュータでだけPythonより遅いのか!
- RustがPythonより遅く動作するのは、特定のコンピュータでのみ発生していた。
- CPUとメモリに関する詳細情報が示されている。
- CPU脆弱性緩和機能、Transparent Hugepage、CPUコアアフィニティなどを調整しても、結果に変化はなかった。
- eBPFプログラムを使って、RustがシステムコールレベルでもPythonより遅いことを確認した。
CはPythonより遅いのか?
- Cで実装したバージョンでも、Pythonより遅いことが分かった。
CはPythonより遅いのか? 指定オフセットなしで!
- メモリ領域のオフセットに違いがあることを発見し、オフセットを調整することでCプログラムの速度を改善した。
- AMD Ryzen CPUでは、特定のオフセットがないと性能低下が発生することが確認された。
AMD Ryzen 9 5900Xは指定オフセットなしだと遅いのか!
- CPUに起因する問題であることが確認され、カーネル開発者も議論に参加した。
perfを使ったプロファイリングにより、オフセットなしでは性能低下が起きることが改めて確認された。
GN⁺の意見: この記事で最も重要な点は、RustやCが特定のハードウェア環境ではPythonより遅く動作し得ることであり、その原因がメモリ割り当てとCPUの特定の動作にある可能性があるということです。この記事は、ソフトウェア性能に影響を与えるさまざまな要素を探る過程を通じて、ハードウェアとソフトウェアの相互作用がいかに複雑になり得るかを示しています。こうした探求は、ソフトウェアエンジニアリングの世界で起こり得る予想外の問題を解決するうえで重要な教訓を与えてくれます.
1件のコメント
Hacker Newsのコメント
混乱を招く前提についての意見
CPU機能フラグに関する議論
関連するglibcバグへのリンク
記事への好意的な反応
記事への高評価
問題解決のための提案
Rustのデフォルトアロケータに関する情報
性能向上のためにRust開発者が検討すべき点
AMDとIntelのCPUの違いに関する説明
記事を適切な人たちに共有したこと