2025/08/17 13:17 Faster Index I/O with NVMe SSDs

ロボ子、マルジナリアサーチのインデックスが新しくなったらしいのじゃ!

博士、それはすごいですね!具体的に何が変わったんですか?

データ構造が書き換えられて、パフォーマンスが大幅に向上したらしいぞ。クエリの予算が100-250msの場合、より高速に結果を見つけてランク付けする設計が良い検索結果をもたらすとのことじゃ。

なるほど。検索結果のランキングが重要なんですね。

そうじゃ!新しい広告検出アルゴリズムも組み込まれて、インデックス対象ドキュメントが3億5000万件から8億件に増えたらしいぞ!

それは大規模なアップデートですね。データ構造はどのように変わったんですか?

`inverted_index`構造は、メモリマップされたB-treeとして実装されているらしい。データ構造は事実上immutable(不変)と見なせるらしいぞ。

B-treeですか。検索効率が良さそうですね。

クエリは、各用語のドキュメントリストをintersect(共通部分を抽出)して、位置情報を取得して、ドキュメントをランク付けして、上位N件の結果を返すらしいぞ。

intersectですか。効率的なアルゴリズムが必要になりそうですね。

Linuxでは、ファイルをbuffered readsとdirect readsの2つのモードで読み取ることができるのは知ってるか?

はい、buffered readsはシステムのページキャッシュを経由し、direct readsはシステムキャッシュをバイパスしますね。

B-treeの再設計では、最初にdirect-mode readsを使用して既存のB-tree構造を再実装したらしいが、高速ではなかったらしい。deterministic block-based skip listが実装されたらしいぞ。

skip listですか。実装が気になりますね。

パフォーマンス評価には、「to be or not to be」というクエリを中心に2つのベンチマークが使用されたらしいぞ。lookupとexecutionじゃ。

lookupは単語のすべての交差を特定するが、ランク付けはしない。executionは150msの時間枠内で可能な限り多くの交差を見つけてランク付けするんですね。

Samsung PM9A1でのベンチマーク結果によると、ブロックサイズが大きくなるにつれて、転送速度は向上するらしい。128 KBが収穫逓減点らしいぞ。

128KBが最適なんですね。でも、検索エンジンは、ドキュメントリストをディスクから読み取る速度によって制限されておらず、結果のランキングがボトルネックなんですね。

そう!位置データの取得が特にボトルネックらしい。io_uringを使うと、位置データの取得が5〜20倍高速になるらしいぞ!

io_uringは非同期I/Oの仕組みでしたっけ。そんなに速くなるんですね。

位置データの場所を再配置して、同じドキュメントからの位置が不必要に離れないようにしたらしいぞ。本番環境でのパフォーマンス評価後、POSIX_FADV_RANDOMを使用したbuffered readsが、これらのタスクでO_DIRECT readsよりも優れたパフォーマンスを発揮したらしい。

へー。buffered readsの方が良かったんですね。

現在のボトルネックはIOPSにあるらしい。128 KBのブロックサイズが本番環境で使用されているが、64 KB〜256 KBの値もほぼ同等のパフォーマンスを発揮するらしいぞ。

なるほど。柔軟に対応できるんですね。

io_uringを無効にし、ブロックサイズを小さくすると、SATA SSDでも適切に動作するはずじゃ。

SATA SSDでも動作するのは良いですね。博士、今日のまとめをお願いします。

今回のアップデートで、マルジナリアサーチはインデックスのデータ構造を改善し、検索速度と対象ドキュメント数を大幅に向上させたのじゃ。特に、io_uringの活用と位置データの最適化が効果的だったみたいじゃな。

ありがとうございます、博士。とても勉強になりました!

ところでロボ子、検索エンジンのボトルネックがIOPSなら、次はロボ子の処理速度がボトルネックになるかもな!

えっ、私ですか!?それは困ります!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。