Space amplification
Disk에 있는 데이터크기와 실제 DB 사이즈의 비율
만약 DB에 10MB를 넣었는데 100MB의 디스크 공간을 사용했다면 이때 space amplification은 10이다.
db_bench로 RocksDB의 space amplification을 측정해보자.
rocksdb 디렉토리로가서 db_bench를 실행시켜준다.
./db_bench --benchmarks="readrandomwriterandom" \
-db="/home/koh/rocksdb" \
-use_direct_io_for_flush_and_compaction=true \
-use_direct_reads=true \
-compaction_style=0 \
-target_file_size_base=2097152 \
-write_buffer_size=2097152 \
-max_bytes_for_level_base=33554432 \
-max_bytes_for_level_multiplier=3 \
-duration=4800 \
-statistics \
-stats_dump_period_sec=30 \
-stats_interval_seconds=10 2>&1 | tee result.txt
--benchmarks="readrandomwriterandom"
: 1 writer, N threads doing random reads
-db="/home/koh/rocksdb"
: RocksDB 데이터 디렉토리 path
-use_direct_io_for_flush_and_compaction=true
: Use O_DIRECT for background flush and compaction I/O
-use_direct_reads=true
: Use O_DIRECT for reading data
-compaction_style=0
: style of compaction; level-based (0), universal(1)
(level-based를 사용했는데 level이 0,1에서 더 증가하지 않을 때가 있다. 이땐 execution time을 늘려주면 된다.)
-write_buffer_size=209715
: Number of bytes to buffer in memtable before compacting
(사양에 따라 조절)
-max_bytes_for_level_base=16777216
: Max bytes for level-1
(사양에 따라 조절)
-max_bytes_for_level_multiplier=10
: A multiplier to compute max bytes for level-N (N >= 2)
(사양에 따라 조절)
-duration=4800
: Execution tim
-stats_dump_period_sec=30
: Gap between printing stats to log in seconds
-stats_interval_seconds=10
: Report stats every N second
(더 많은 옵션은 다음 링크를 참고
https://github.com/EighteenZi/rocksdb_wiki/blob/master/Benchmarking-tools.md)
rocksdb디렉토리안에 있는 LOG 파일을 보면 db_bench에서 설정한 30초간격으로 stat이 기록되어있는 것을 볼 수 있다. 가장 마지막 Compaction stat을 보고 계산해보자.
Space amplification은 (L1 size + L2 size) / L2 size로 구할 수 있다.
L1 size = 31.59MB
L2 size = 55.66MB
Space amplification
= (31.59 + 55.66) / 55.66 = 1.568
Reference