- Python 3.13に新しいJITコンパイラの構築手法(copy-patch)が導入されたことを受け、これをPostgreSQLに適用してみることにした。
- pg-copyjitという新しい方式を紹介しており、これはPostgreSQLサーバーの速度を向上させる方法である。
- すべてのコードは実験的なものであり、実運用環境で使用する前に専門家によるレビューが必要である。
最初はJITがなく、その後LLVM JITコンパイラが登場した
- PostgreSQLにはLLVMを用いたJITコンパイルが導入されたが、LLVMにはJITコンパイルに適していない部分がある。
- LLVMの最適化はコストが高く、使わなければコンパイル自体が無意味になることもある。
- PostgreSQLのクエリコスト見積もりは実際の実行時間と直接の関係がなく、多くのユーザーがJITコンパイラを無効化している。
2021年、copy-and-patchが説明された
- できるだけ速く、高速で十分なコードを生成する必要がある。
- copy-patch方式は、Cで書かれたステンシル(テンプレート関数)を使ってコードを高速に生成する。
- ステンシルを新しいメモリ領域にコピーし、穴を埋めれば、そのまま「コンパイル済み」の関数へジャンプできる。
PostgreSQLにcopy-and-patchを導入する
- PostgreSQLに新しいJITエンジンを構築するのはそれほど難しくなく、LLVMをプラグイン化して他のJITコンパイラを導入できるようにすることが提案されている。
- 単一の
_PG_jit_provider_init 関数を提供し、compile_expr、release_context、reset_after_error の3つのコールバックを初期化するだけで十分である。
- copy-patchアルゴリズムは単純で、各opcodeに対応するステンシルを見つけて追加し、必要な値を穴に埋め込む。
現在の状況
- PostgreSQL 16で動作し、現時点ではAMD64のみをサポートしている。
- コード生成は数百マイクロ秒で完了するため、短いクエリにも利用できる。
- まだ最適化段階には至っていないが、性能はすでにインタプリタより改善していることが分かる。
- 実装されたopcodeは少ないが、まだサポートしていないクエリについてはPostgreSQLインタプリタが代わりに実行する。
今後の課題...
- これは概念実証の段階であり、簡単にビルドやパッケージ化ができるようにすることはまだ検討対象ではない。
- より多くのopcodeを実装し、最適化の余地を探すことに注力している。
- 他のアーキテクチャへの移植も真剣に検討している。
謝辞
- 現在の勤務先であるEntr’ouvertに感謝しており、同僚たちがこのプロジェクトに時間を割けるよう支援してくれた。
- DBAの友人たちにも感謝し、PoWAを試してみることを勧めている。
GN⁺の意見
- この記事は、PostgreSQLデータベースサーバーの性能を向上させるための新しいアプローチを紹介している。これはデータベース管理者や開発者にとって興味深い内容かもしれない。
- 実験的なコードを実運用環境に適用する前には、徹底したテストと検証が必要である。これはデータ損失やダウンタイムのようなリスクを防ぐためである。
- LLVMのような既存のJITコンパイラと比べると、copy-patch方式はより高速なコード生成を可能にし、短いクエリにも有用である可能性がある。
- この技術がPostgreSQLコミュニティで広く受け入れられれば、さまざまなアーキテクチャへの対応拡大とともに、データベース性能最適化の新たな道を開く可能性がある。
- 批判的な視点で見ると、まだ初期段階であり、実際の性能向上が本番環境でどのように現れるかについては、さらなる研究と開発が必要である。
まだコメントはありません。