Benchmark Results (2026080400)
AWS 32コア物理環境における vmemkv と RocksDB の性能比較ベンチマーク。
Stacking Variants
各最適化の詳細は Design Document を参照。
- RocksDB: LSM-Tree のベースライン比較
- LMDB: B+Tree / mmap ベースの比較対象
- RocksDB-BlobDB: RocksDB の Blob 分離ストレージ変種(大きな Value 向け)
- Baseline: vmemkv 最適化なし
- +BF: + T1 Bloom Filter
- +Simd: +BF + SIMD Scan(T1 sorted_region の SIMD 線形探索)
- +Inline: +Simd + T1 Inline Value (<8B のValueをT1のみで処理)
- +Prefault: +Inline + T2 Async Prefaulting(全部盛り)
Environment
- Instance: AWS i4i.8xlarge (ap-northeast-1)
- CPU: Intel Xeon Platinum 8375C @ 2.90GHz (32 cores)
- L2 Cache: 1,280 KiB × 16 (per-core private)
- RAM: 66.3 GB
- RAM (Larger-Than-Memory): cgroup で DRAM を 1GiB に制限し予めデータ量を4GiBぶん挿入した状態で開始
- Disk: Local NVMe SSD (Swap Media for LTM)
- Kernel: 6.17.0-1019-aws
- Git Rev: 8c3f686 + uncommitted fairness-capture fix (T1Index::scan() based, no new library interfaces)
Workloads
- Insert: 順次挿入(1/4/16/32 スレッド)
- Get Hit/Miss (Zipf/Uniform): ポイントルックアップ
- Update / Delete: Zipf 分布での更新・削除
- Scan After Reorg (Zipf/Uniform): T1 reorganize 後(sorted_region のみ)のレンジスキャン。VMemKV 内部専用
- Scan After Full Reorg T1+T2 (Zipf/Uniform): T1+T2 完全 reorganize 後のレンジスキャン。全エンジン比較可能
- YCSB-E: 95% Scan + 5% Insert 混合(32スレッド / 30秒タイムライン)
Overall Notes & Annotations
Insert Workload
Update (Zipf) Workload
Delete (Zipf) Workload
Get Miss (Zipf) Workload
Get Hit (Zipf) Workload
Get Hit (Uniform) Workload
Scan After Reorg (Zipf)
Scan After Reorg (Uniform)
Scan After Full Reorg (T1+T2) (Zipf)
Scan After Full Reorg (T1+T2) (Uniform)
YCSB-E — Scan + Insert 混合スループット(30秒タイムライン)
YCSB-E ワークロード: 95% Scan(100件レンジスキャン)+ 5% Insert を 32スレッドで 30秒間実行。
Workload-Adaptive Soft Limit により、スキャン検出時に append_region を
L2キャッシュ容量(~26,000件 / 1MB ÷ 40B)以下に保つ。Reorg 直後に走査対象が
sorted_region のみになりスキャン QPS が V字回復する。
藍色の点線: 自然発生のT1 Reorganize(Adaptive Soft Limitによる自動トリガー)。
橘色の点線: t=15秒時点で強制的に1回実行されるT1 Reorganize(LTMなど、30秒のタイムウィンドウ内で自然発生が保証されないシナリオ用の強制トリガー。自然発生と混同しないよう区別して表示)。
Scan QPS タイムライン
32 threads / 30 secondsReorganize Duration vs. Corpus Size (T1-only vs T1+T2)
単発のreorganize()呼び出し1回の所要時間を、コーパスサイズ(件数)を横軸にスイープ計測。
populate自体は計測対象外(reorganize()本体のみ内部60秒でタイムアウト、外側の実行スクリプトはさらに緩い300秒のバックストップ)。
藍色 = T1-only(force_t2_gc=false)、
赤色 = T1+T2(force_t2_gc=true)。
▲マーカーはタイムアウト(60秒到達、実際の所要時間はそれ以上)を示す。
Reorganize Duration
single-shot, threads:1Insert Workload
Update (Zipf) Workload
Delete (Zipf) Workload
Get Miss (Zipf) Workload
Get Hit (Zipf) Workload
Get Hit (Uniform) Workload
Scan After Reorg (Zipf)
Scan After Reorg (Uniform)
Scan After Full Reorg (T1+T2) (Zipf)
Scan After Full Reorg (T1+T2) (Uniform)
YCSB-E — Scan + Insert 混合スループット(30秒タイムライン)
YCSB-E ワークロード: 95% Scan(100件レンジスキャン)+ 5% Insert を 32スレッドで 30秒間実行。
Workload-Adaptive Soft Limit により、スキャン検出時に append_region を
L2キャッシュ容量(~26,000件 / 1MB ÷ 40B)以下に保つ。Reorg 直後に走査対象が
sorted_region のみになりスキャン QPS が V字回復する。
藍色の点線: 自然発生のT1 Reorganize(Adaptive Soft Limitによる自動トリガー)。
橘色の点線: t=15秒時点で強制的に1回実行されるT1 Reorganize(LTMなど、30秒のタイムウィンドウ内で自然発生が保証されないシナリオ用の強制トリガー。自然発生と混同しないよう区別して表示)。
Scan QPS タイムライン
32 threads / 30 secondsReorganize Duration vs. Corpus Size (T1-only vs T1+T2)
単発のreorganize()呼び出し1回の所要時間を、コーパスサイズ(件数)を横軸にスイープ計測。
populate自体は計測対象外(reorganize()本体のみ内部60秒でタイムアウト、外側の実行スクリプトはさらに緩い300秒のバックストップ)。
藍色 = T1-only(force_t2_gc=false)、
赤色 = T1+T2(force_t2_gc=true)。
▲マーカーはタイムアウト(60秒到達、実際の所要時間はそれ以上)を示す。
Reorganize Duration
single-shot, threads:1Insert Workload
Update (Zipf) Workload
Delete (Zipf) Workload
Get Miss (Zipf) Workload
Get Hit (Zipf) Workload
Get Hit (Uniform) Workload
Scan After Reorg (Zipf)
Scan After Reorg (Uniform)
Scan After Full Reorg (T1+T2) (Zipf)
Scan After Full Reorg (T1+T2) (Uniform)
YCSB-E — Scan + Insert 混合スループット(30秒タイムライン)
YCSB-E ワークロード: 95% Scan(100件レンジスキャン)+ 5% Insert を 32スレッドで 30秒間実行。
Workload-Adaptive Soft Limit により、スキャン検出時に append_region を
L2キャッシュ容量(~26,000件 / 1MB ÷ 40B)以下に保つ。Reorg 直後に走査対象が
sorted_region のみになりスキャン QPS が V字回復する。
藍色の点線: 自然発生のT1 Reorganize(Adaptive Soft Limitによる自動トリガー)。
橘色の点線: t=15秒時点で強制的に1回実行されるT1 Reorganize(LTMなど、30秒のタイムウィンドウ内で自然発生が保証されないシナリオ用の強制トリガー。自然発生と混同しないよう区別して表示)。
Scan QPS タイムライン
32 threads / 30 secondsReorganize Duration vs. Corpus Size (T1-only vs T1+T2)
単発のreorganize()呼び出し1回の所要時間を、コーパスサイズ(件数)を横軸にスイープ計測。
populate自体は計測対象外(reorganize()本体のみ内部60秒でタイムアウト、外側の実行スクリプトはさらに緩い300秒のバックストップ)。
藍色 = T1-only(force_t2_gc=false)、
赤色 = T1+T2(force_t2_gc=true)。
▲マーカーはタイムアウト(60秒到達、実際の所要時間はそれ以上)を示す。
Reorganize Duration
single-shot, threads:1Insert Workload
Update (Zipf) Workload
Delete (Zipf) Workload
Get Miss (Zipf) Workload
Get Hit (Zipf) Workload
Get Hit (Uniform) Workload
Scan After Reorg (Zipf)
Scan After Reorg (Uniform)
Scan After Full Reorg (T1+T2) (Zipf)
Scan After Full Reorg (T1+T2) (Uniform)
YCSB-E — Scan + Insert 混合スループット(30秒タイムライン)
YCSB-E ワークロード: 95% Scan(100件レンジスキャン)+ 5% Insert を 32スレッドで 30秒間実行。
Workload-Adaptive Soft Limit により、スキャン検出時に append_region を
L2キャッシュ容量(~26,000件 / 1MB ÷ 40B)以下に保つ。Reorg 直後に走査対象が
sorted_region のみになりスキャン QPS が V字回復する。
藍色の点線: 自然発生のT1 Reorganize(Adaptive Soft Limitによる自動トリガー)。
橘色の点線: t=15秒時点で強制的に1回実行されるT1 Reorganize(LTMなど、30秒のタイムウィンドウ内で自然発生が保証されないシナリオ用の強制トリガー。自然発生と混同しないよう区別して表示)。
Scan QPS タイムライン
32 threads / 30 secondsReorganize Duration vs. Corpus Size (T1-only vs T1+T2)
単発のreorganize()呼び出し1回の所要時間を、コーパスサイズ(件数)を横軸にスイープ計測。
populate自体は計測対象外(reorganize()本体のみ内部60秒でタイムアウト、外側の実行スクリプトはさらに緩い300秒のバックストップ)。
藍色 = T1-only(force_t2_gc=false)、
赤色 = T1+T2(force_t2_gc=true)。
▲マーカーはタイムアウト(60秒到達、実際の所要時間はそれ以上)を示す。