4 ポイント 投稿者 GN⁺ 2024-03-20 | まだコメントはありません。 | WhatsAppで共有
  • 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_exprrelease_contextreset_after_error の3つのコールバックを初期化するだけで十分である。
  • copy-patchアルゴリズムは単純で、各opcodeに対応するステンシルを見つけて追加し、必要な値を穴に埋め込む。

現在の状況

  • PostgreSQL 16で動作し、現時点ではAMD64のみをサポートしている。
  • コード生成は数百マイクロ秒で完了するため、短いクエリにも利用できる。
  • まだ最適化段階には至っていないが、性能はすでにインタプリタより改善していることが分かる。
  • 実装されたopcodeは少ないが、まだサポートしていないクエリについてはPostgreSQLインタプリタが代わりに実行する。

今後の課題...

  • これは概念実証の段階であり、簡単にビルドやパッケージ化ができるようにすることはまだ検討対象ではない。
  • より多くのopcodeを実装し、最適化の余地を探すことに注力している。
  • 他のアーキテクチャへの移植も真剣に検討している。

謝辞

  • 現在の勤務先であるEntr’ouvertに感謝しており、同僚たちがこのプロジェクトに時間を割けるよう支援してくれた。
  • DBAの友人たちにも感謝し、PoWAを試してみることを勧めている。

GN⁺の意見

  • この記事は、PostgreSQLデータベースサーバーの性能を向上させるための新しいアプローチを紹介している。これはデータベース管理者や開発者にとって興味深い内容かもしれない。
  • 実験的なコードを実運用環境に適用する前には、徹底したテストと検証が必要である。これはデータ損失やダウンタイムのようなリスクを防ぐためである。
  • LLVMのような既存のJITコンパイラと比べると、copy-patch方式はより高速なコード生成を可能にし、短いクエリにも有用である可能性がある。
  • この技術がPostgreSQLコミュニティで広く受け入れられれば、さまざまなアーキテクチャへの対応拡大とともに、データベース性能最適化の新たな道を開く可能性がある。
  • 批判的な視点で見ると、まだ初期段階であり、実際の性能向上が本番環境でどのように現れるかについては、さらなる研究と開発が必要である。

まだコメントはありません。

まだコメントはありません。