より高速なSQLiteを求めて
(avi.im)- SQLiteはすでに高速なデータベースシステムだが、研究者たちはこれをさらに高速化する方法を探っている
- ヘルシンキ大学とケンブリッジ大学の研究者が「非同期I/Oによるサーバーレスランタイム/データベース共同設計」という論文を発表し、テールレイテンシを最大100倍削減できることを示した。この論文は、Rustで再実装されたSQLiteであるLimboの基礎となっている。
io_uring
-
io_uringの説明: Linuxカーネルのio_uringサブシステムは、非同期I/Oのためのインターフェースを提供する。これはユーザー空間とカーネル空間の間のリングバッファを通じてバッファコピーのオーバーヘッドを減らす。アプリケーションはI/Oリクエストを送信し、OSからI/O処理完了の通知を受けるまで他の作業を実行できる。
-
SQLiteのクエリ実行: SQLiteはデータ保存にファイルを使用し、
sqlite3_open()関数でデータベースを開き、sqlite3_prepare()関数でSQL文をバイトコードに変換する。sqlite3_step()関数はバイトコード命令を実行してクエリを処理する。
前提
-
サーバーレスコンピューティングの台頭: サーバーレス環境ではデータベースのレイテンシが問題になりうる。データベースをエッジランタイムに直接組み込めばレイテンシはなく、SQLiteはこのような環境に適している。
-
SQLiteの問題点: 同期I/Oの利用によりリソース使用が最適化されず、並行性とマルチテナンシーの問題を引き起こす。
-
io_uringへの移行: POSIX I/O呼び出しをio_uringに置き換えるのは簡単ではなく、SQLiteを非同期I/Oモデルに合わせて再設計する必要がある。
Limbo
-
非同期I/Oのサポート: VMとBTreeコンポーネントを修正して非同期I/Oをサポートし、同期バイトコード命令を非同期命令に置き換える。非同期I/Oはブロッキングをなくし、並行性を向上させる。
-
クエリエンジンとストレージエンジンの分離: リソース使用を最大化するため、クエリエンジンとストレージエンジンを分離することを提案している。
評価と結果
-
ベンチマーク: マルチテナントのサーバーレスランタイムをシミュレーションし、各テナントが独自の組み込みデータベースを持つようにした。SQLiteとLimboのクエリレイテンシを比較した結果、Limboはp999でテールレイテンシを100倍削減した。
-
今後の作業: 複数のリーダーとライターを含む追加ベンチマークを計画しており、性能上の利点はp999以降でのみ顕著に現れる。
-
オープンソースコード: Limboのコードはオープンソースとして提供されている: Limbo GitHub
1件のコメント
Hacker Newsの意見
AWS Lambda のようなサーバーレスコンピューティングの特定のユースケースは、中央データベースを持つサーバーレス構成のアプリとうまく噛み合わないことがある、という議論がある
/tmpディレクトリがあり、Python ランタイムに SQLite が含まれているため、関数以外のコードをアップロードする必要がないことに気づいた2人の研究者のうち1人が著者の上司であることは明記する価値があるかもしれない
「利点が目立つのは p999 以上だけで、p90 や p99 では性能は SQLite とほぼ同じ」という点に同意する
SQLite には広範なテストスイートがあり、非常に徹底してテストされている
ベンチマークのために、各テナントが独自の組み込みデータベースを持つマルチテナントのサーバーレスランタイムをシミュレーションした
以前、Postgres に非同期 I/O を導入しようとする試みがあったが、中止された
非同期 I/O が動作している間に別の作業ができる、という考えに対する疑問がある
ブログ記事の著者として、この投稿がトップページに載るとは予想していなかった
SQLite はオープンソースだが、重要なテストハーネスはそうではない
SQLite ファイル形式の厳密なサブセットとして JSON ライクな形式を作る簡単な道を探したことがあるが、うまくいかなかった