vmemkv Benchmark Logs

Larger-than-memory Key-Value ストア vmemkv の性能評価データおよび検証実験ログのインデックス。

重要な実験結果 (Important Results)

Date Link Description
2026-09-07 AWS i4i x5 (09/07)

(09/03時点比):

  • ShardedT1Index(T1のrange-sharding、reorganize/checkpointコストのO(コーパスサイズ)問題を解消する設計)をVMemKVImplへ結線し、split protocolの3件のバグ(重複キュー投入によるsplit中断でシャードが無制限肥大化、abortパスのリセット順序による永久stuck、split境界を跨ぐstraggler書き込みの実データ損失)を発見・修正した上での初のフルCRUDマトリクス+background jobs probe計測。
  • KVStoreコンセプトにreorganize/checkpoint/get_statisticsを追加。T1の統計を(シャーディング後は自動split経路を一切捕捉できていなかった)t1_reorg_countから実際のsplit回数を数えるT1_Splitsへ刷新。死んでいたhard_stall_countを削除し、total_hard_stall_duration_usは実態(明示的reorganize/checkpoint呼び出し同士の排他待ち時間)に合わせtotal_reorganize_wait_duration_usに改名。YCSB-Eの強制reorganize()トリガーを撤去(シャーディング後は全シャード同期マージでO(コーパス)化しており、"軽量な対照"ではなくなった上、background-jobs-probeと計測が重複していたため)。
  • Background Jobs計測結果(1KB×1,000万件、in_memory/ltm): reorganize() in_memory 1.482秒(Scan劣化15%)、ltm 14.082秒(Scan劣化2%) -- 09/03時点ではltmが60秒タイムアウトで未完了、in_memoryのScan劣化は83%だった。シャーディング導入前に問題視されていた「コーパス増大に伴うreorganize/checkpointコスト増大」が、実測ベースで解消したことを裏付ける結果。
  • この計測自体は久しぶりのAWSフルベンチ実行だったため、monorepoがimplementation/vmemkvへ再編されて以降放置されていたオーケストレーションスクリプトのパスバグを3件発見・修正(rsync同期先が~/faultkv/vmemkvではなく~/faultkv/implementation/vmemkvを前提にしていた、NVMeデバイス検出がインデックス依存でルートボリュームを誤検出しうる、結果ダウンロード先RESULTS_DIRが同じREPO_ROOT計算ミスで二重パス化していた)。
2026-09-03 AWS i4i x5 (09/03)

(08/21時点比、設計面の差分のみ。rival数値は2026-08-27の計測を再利用):

  • T2をMAP_PRIVATEMAP_SHARED化(page cacheへの書き込みがmsync()でそのまま永続化される設計に変更)、WALを世代単位でセグメント分割。checkpoint()のWALバイト閾値(WalMaxBytesSinceCheckpoint)が大きい値サイズ(64KB等)で実質発火しなかったバグを修正。
  • defragment()を恒久的no-op化した上でAPI・TailEntryTracker・T2-generation-pairing機構ごと完全削除。T1AppendCapacityLog2を2^22→2^21に縮小(RSSフットプリント対策、TODO.md参照)。

新しいレポート生成パイプラインでの初回計測でもある(--without-rivals):

  • Summary tabをWorkload Winners行列と新設のBackground Jobsテーブル(reorganize()/checkpoint() × in_memory/ltm、固定1KB×1,000万件コーパス)のみに簡素化。
  • Background Jobs計測結果: in_memoryでは両ジョブとも完了(reorganize() 1.495秒・Insert劣化49%/Update劣化-6%/Scan劣化83%、checkpoint() 4.193秒・Insert劣化49%/Update劣化2%/Scan劣化27%)。ltmでは両ジョブとも内部タイムアウト(60秒)に到達し未完了 -- 1KB×1,000万件コーパスに対し、LTM(cgroup制約)下でのreorganize()/checkpoint()が60秒を超えることを示す一点のデータ。原因分析は別途。
2026-08-21 AWS i4i (08/21)

(08/17時点比、要点のみ):

  • クローン用T2チェックポイントファイルのディスク枯渇バグを2件修正: (1) クローンパスがベンチマークケースごとに増分カウンタで新規生成され、ディスクを使い切るまで蓄積していたのを固定パスの再利用へ変更、(2) std::filesystem::copy_file()がsparse fileのホールを認識せず、論理サイズ1TiBのT2チェックポイントをクローンごとにフル実体化していたのを、pread/pwriteで実データ範囲のみコピーしホールを保持する専用ヘルパーへ変更。これにより、これまで全ての4並列フルベンチ試行を失敗させていたルート原因を解消し、本ラウンドが修正後初めて4シナリオ全てが成功したフルラン。
  • checkpoint()/defragment()実装のDRY/YAGNIレビューを実施し共通ヘルパーを抽出。両者とベンチマークハーネスのコメント・生成レポート文言でdefragment()と誤表記されていた箇所(実際は全てreorganize()/checkpoint()呼び出し)を修正。Summaryタブの「Reorganize Duration (T1-only vs T1+T2)」チャートも同様に誤解を招く表記だった(T1+T2側は実際にはcheckpoint()のブートストラップ呼び出しで、reorganize()ではない)ため凡例・見出しを修正。
  • defragment()単体を測定する新実験(--mode=defrag/defrag_contention)を追加。当初はrun_bench_aws_c6id.sh/run_4parallel_bench.shに組み込まれておらず本ラウンドの4並列フルランでは未計測だったため、--defrag-scaling-probeとして両ランナーへ組み込み、加えて新設の--skip-matrixフラグでスタンドアロンインスタンス上で単体実行し、結果を本レポートに追記(Summaryタブ「Defragment Scaling & Contention」)。churn-ratio(0〜1.0)に対して所要時間がほぼ一定(24.4〜25.6秒、8M件corpus)である一方、コーパスサイズには強く依存し、ltmシナリオでは複数点が60秒(または300秒の外側バックストップ)キャップに到達。
  • XFS+reflink依存を完全撤去(ext4へ移行)。T2ストレージはプレーンなPOSIX I/Oのみで、reflink/punch-holeのioctl依存は既に無かったため撤去は provisioning/CI/テスト基盤側のみ。
2026-08-17 AWS i4i (08/17)

(08/13時点比、要点のみ):

  • checkpoint()/defragment()をreflink clone + hole punchで統一する再設計を実施(O(N)コピーからO(diff)へ)。実測3件のライブロック(run_reorganize()の自己競合ループ、acquire_write_handle()のバックオフ無しリトライストーム、Wal::drain_pending()のLSN追いかけっこ)を発見・修正し、32並列での正しい動作を確認。
  • 新実験2件を追加: Churn-Ratio Scaling(churn_ratio≥0.05で定常defragment()が60秒キャップに到達)、Corpus-Size Invariance across Generations(定常状態のreflink/punch経路をコーパスサイズに対してスイープ)。
  • --without-rivalsモードでVMemKVのみ再計測し、RocksDB/RocksDB-BlobDB/LMDBは08/13の数値を再利用してマージ(コスト削減)。
2026-08-13 AWS i4i (08/13)

(08/10時点比、要点のみ):

  • ScanBaseSequentialのbase領域読み取りを、単一固定madviseからレコードサイズ別3経路(base_mmap_scan_seq/base_mmap_scan/read_fd)のper-record動的選択へ変更。旧方式(コーパス先頭レコードのサイズをサンプリングして方針決定)が引き起こしていた1KB LTM Scanの退行(0.40〜0.78x)を解消(64KB LTMのGet/Hitも2.0〜3.3x、Scan(Zipf)も2.2x改善)。
  • 上記の過程で、Getの小レコード(1ページ以下)経路が誤ってScan専用のbase_mmap_scan_seq(MADV_SEQUENTIAL)を再利用していたバグを発見・修正。LTM/1KBのGetはランダムアクセスなので広いreadaheadが逆効果(major fault毎のカーネル時間が約10倍)だった。既にMADV_RANDOMを持つプライマリのbaseマッピングへ直接読みに変更(seqlock無し)し、1KB LTMのGet/HitがZipf 5.2倍、Uniform 6.5倍改善、+Prefaultと同等以上に回復。
  • try_scan_base_record()/try_get_base_record()を単一のtry_read_base_record()エントリポイントへ統合し、マッピング選択方針をBaseReader switch文の1箇所に集約(再発防止)。
2026-08-10 AWS i4i (08/10)

(08/06時点比、要点のみ):

  • NoMadvise/SimdScanアブレーションは実測の結果撤去。
  • T2 reorganize: T2再構築をkey順ソート書き込みから物理オフセット順コンパクションへ再設計し、reorganize所要時間を大幅短縮(WALトリガー間隔に対して追いつかない問題を解消)。
  • WAL/checkpoint: T1-onlyチェックポイントを導入してWALチェックポイントをT2 GCから分離、reorganize()reorganize()/defragment()/checkpoint()に分割。
  • 並行性バグ2件を修正(torn read、reorganize残存ウィンドウのrace)。
  • T2のcheckpoint済み領域をimmutable化し、別のmmapでアクセスするScanBaseSequential アブレーションを追加。
2026-08-06 AWS i4i (08/06) コンパイル時アブレーション実験として madvise(..., MADV_RANDOM) を無効化した NoMadvise バリアントを新規導入。
2026-07-29 AWS c6id (07/29) WAL / Checkpoint 実装完了。ベンチマークのバグ修正済み。
その他の実験結果 (Other Results)
Date Link Description
2026-08-04 AWS i4i (08/04) reorganize_internal()の残存ウィンドウ競合(T1エントリが退避直前のT2世代を指したまま生き残るレース)をドレインバリアで修正。Scan T1Reorg/T1T2Reorgベンチマークの不公平(挿入順序の違いによりT2物理レイアウトが実質同一になっていた)を、共有マスターをランダム順で構築しreorganize()の呼び分けだけで両モードを差別化する方式に修正。そのT1-onlyスナップショット構築が背景reorg_worker_スレッドとレースしエントリを1件だけ恒久的に取りこぼす不具合(ltm/1KBが無限ハング)を発見・修正——専用フックや新規ロック付きラッパーを追加する案を経て、reorganize(false)収束後にT1Index::scan()で読み出すだけで済むと判明し、ライブラリへの新規インタフェース追加なしで解決。YCSB-Eタイムラインでt=15sの強制reorganizeと自然発生reorganizeを区別して縦線表示するよう変更(LTMシナリオは自然発生がほぼ起きないため、強制トリガーを自然発生と誤認しないように)。単発reorganize()の所要時間をコーパスサイズに対してスイープする新実験(T1-only vs T1+T2、各タブのYCSB-E直下に追加)を実施:T1-onlyはLTM下でも8.26M件で2.7秒と軽量だが、T1+T2はLTM下でターゲットの25%(1KB, 206万件)や100%(64KB, 13万件だがT2実データは~8.6GB)で60秒キャップに到達し、実用限界を確認。これに伴い、「T1-onlyでもLTM cgroup制約下で1分優に超える」という誤った旧コメントを削除・訂正(実際に遅いのはpopulate中の並行reorg競合であり、単発reorganize()自体は高速)。
2026-07-31 AWS i4i (07/31) T1Index::scan()が候補を毎回全件ソートしていた無駄を、ソート済みsorted_region分をスキップする直接マージに変更(8B In-MemoryのScanがRocksDB比3.5x→7.5xへ改善)。update_impl()がinline値の更新時に不要なT2メモリハンドルを取得していたのを高速パス化。write_stripeロック保持中のreorganizeチェックをロック外へ移動。THP(Transparent Huge Pages)の実際の設定を確認しmadviseへ強制する仕組みを追加。書き込み系の改善効果はAWS実行間のノイズに埋もれ有意差を確認できず。
2026-07-30 AWS i4i (07/30) WAL group commit通知方式をnotify_one()ループからnotify_all()に変更、T1 append領域のbounds-skipスキャン最適化、reorganize()の直接マージ化、チェックポイント書き込み時のメモリ逼迫対策を実施。インスタンスをc6idからi4i(現行世代・最速ローカルNVMe)に変更。
2026-07-15 AWS c6id (07/16) YCSB-E (Scan 95% / Insert 5%)追加。Reorganizeのトリガをadaptiveに変更。ベンチマークにバグあり(slack参照)
2026-07-15 AWS c6id (07/15) ゼロアロケーションAPIに変更。Scanの性能が大幅に向上。
2026-07-13 AWS c6id (07/13) ScanがO(N)になっていたのを修正。および並行 Reorganize 中の Lost Update 整合性バグ修正。
2026-07-12 AWS c6id (07/12) 初期実装の全 CRUD / Scan 性能 of vmemkv。WAL / Checkpoint 未実装につき書き込み性能は高めに出ていることに注意。