Amplification Factors

RocksDB Tuning 시, 3개의 amplification 요소에서 trade off 발생

: 1) write amplification 2) read amplification 3) space amplification

1. Write amplification

= Storage에 적힌 bytes / Database에 적힌 bytes

ex) Database write rate = 10MB/s , Disk write rate = 30 MB/s => write amplification = 3

  • WAF가 높으면,

    1. workload는 disk throughput 에서 병목현상이 발생할 수 있다.

    2. 플래시의 수명(lifetime) 감소

  • WAF 값을 얻는 방법

    1. DB::GetProperty("rocksdb.stats", &stats) 의 output 읽기

    2. Disk write bandwidth / DB write rate ( ex. iostat 사용)

2. Read amplification

= 한 Query 당 disk read 수

  • Logical Read: Cache ( RocksDB block cache / OS filesystem cache) 로 부터 얻는 데이터
  • Physical Read: Storage Device, flash, disk 로부터 얻는 데이터는
    • iostat output으로 측정 가능 (하지만, 여기에 query 와 compaction 에 의한 read도 포함되어 있음
3. Space amplification

= Disk 상의 DB file 크기 / 데이터 크기

RocksDB smax_background_flushes

is the maximum number of concurrent flush operations. It is usuallytatistics

디버깅 시, 도움되는 tool

  • statistics:

    • setrocksdb::CreateDBStatistics()

    • options.statistics.ToString() 호출하면 읽기 쉬운 RocksDB statistic 결과가 나옴

  • stats___dump_period_sec:​

    • statistics을 LOG 파일로 stats__dump_period\ sec _ 마다 dump 한다.

    • Default 시간: 3600초 (1시간)

    • You can get the same data in the application by calling db->GetProperty("rocksdb.stats");

    • 매 dump_sec 마다 보여지는 LOG file

    ** Compaction Stats **
    
    Level Files  Size(MB) Score Read(GB)  Rn(GB) Rnp1(GB) Write(GB) Wnew(GB) Moved(GB) W-Amp Rd(MB/s) Wr(MB/s) Comp(sec) Comp(cnt) Avg(sec) Stall(sec) Stall(cnt) Avg(ms)     RecordIn   RecordDrop
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    L0      2/0        15   0.5     0.0     0.0      0.0      32.8     32.8       0.0   0.0      0.0     23.0    1457      4346    0.335       0.00          0    0.00             0        0
    L1     22/0       125   1.0   163.7    32.8    130.9     165.5     34.6       0.0   5.1     25.6     25.9    6549      1086    6.031       0.00          0    0.00    1287667342        0
    L2    227/0      1276   1.0   262.7    34.4    228.4     262.7     34.3       0.1   7.6     26.0     26.0   10344      4137    2.500       0.00          0    0.00    1023585700        0
    L3   1634/0     12794   1.0   259.7    31.7    228.1     254.1     26.1       1.5   8.0     20.8     20.4   12787      3758    3.403       0.00          0    0.00    1128138363        0
    L4   1819/0     15132   0.1     3.9     2.0      2.0       3.6      1.6      13.1   1.8     20.1     18.4     201       206    0.974       0.00          0    0.00      91486994        0
    Sum  3704/0     29342   0.0   690.1   100.8    589.3     718.7    129.4      14.8  21.9     22.5     23.5   31338     13533    2.316       0.00          0    0.00    3530878399        0
    Int     0/0         0   0.0     2.1     0.3      1.8       2.2      0.4       0.0  24.3     24.0     24.9      91        42    2.164       0.00          0    0.00      11718977        0
    Flush(GB): accumulative 32.786, interval 0.091
    Stalls(secs): 0.000 level0_slowdown, 0.000 level0_numfiles, 0.000 memtable_compaction, 0.000 leveln_slowdown_soft, 0.000 leveln_slowdown_hard
    Stalls(count): 0 level0_slowdown, 0 level0_numfiles, 0 memtable_compaction, 0 leveln_slowdown_soft, 0 leveln_slowdown_hard
    
    ** DB Stats **
    Uptime(secs): 128748.3 total, 300.1 interval
    Cumulative writes: 1288457363 writes, 14173030838 keys, 357293118 batches, 3.6 writes per batch, 3055.92 GB user ingest, stall micros: 7067721262
    Cumulative WAL: 1251702527 writes, 357293117 syncs, 3.50 writes per sync, 3055.92 GB written
    Interval writes: 3621943 writes, 39841373 keys, 1013611 batches, 3.6 writes per batch, 8797.4 MB user ingest, stall micros: 112418835
    Interval WAL: 3511027 writes, 1013611 syncs, 3.46 writes per sync, 8.59 MB written
    

Compaction Stats

Level N 과 level N+1 사이의 compaction에 대한 compaction stat에 대한 정보는 level N+1에 기록된다.

아래에 나오는 compaction stat에 대한 정보는 모두 level N 과 level N+1사이의 compaction 에 관한 것임.

  • Level - LSM의 level을 나타냄( level compaction / universal은 모든 파일이 L0에 존재)
    • 1) Sum: 모든 레벨의 값을 더한 것
    • 2) Int: last reporting interval 의 데이터로 한정
  • Files - (a/b)
    • a: level에 있는 파일의 개수
    • b: 해당 레벨해서 compaction이 진행 중인 파일의 개수
  • Score -
    • L0를 제외한 다른 레벨: (current level size) / (max level size).
      • 값이 0 또는 1은 괜찮지만, 1보다 큰 경우에는 해당 레벨이 compaction 이 필요하다는 것을 의미한다.
    • L0: 현재 파일의 개수와 compaction 을 유발하는 파일의 개수를 가지고 계산한다.
  • Read(GB) - compaction 시 발생하는 총 read bytes 수( level N 과 level N+1 모두 포함한다)
  • Rn(GB) - compaction 시 level N에서 발생하는 read bytes 수
  • Rnp1(GB) - compaction 시 level N+1에서 발생하는 read bytes수
  • Write(GB) - compaction 시 발생하는 총 write bytes 수
  • Wnew(GB) - level N+1에 새롭게 write 되는 byte 수
    • 계산 방법: (total bytes written to N+1) - ( byes read from N+1 during compaction with level N)
  • Moved(GB) - compaction 시 level N+1으로 옮겨진 byte 수
  • W-Amp - (total bytes written to level N+1) / (total bytes read from level N) => Write Amplification (level N 과 level N+1 사이의)
  • Rd(MB/s) - compaction 시 발생하는 data read rate => (Read(GB) * 1024) / duration
    • duration: level N 과 level N+1 사이 compaction이 진행되는 시간
  • Wr(MB/s) - compaction 시 발생하는 data write rate
  • Rn(cnt) - compaction 시 level N에서 read한 파일 개수
  • Rnp1(cnt) - compaction 시 level N+1 에서 read한 파일 개수
  • Wnp1(cnt) - compaction 시 level N+1 에서 write 한 파일 개수
  • Wnew(cnt) - (Wnp1(cnt) - Rnp1(cnt)) -- compaction 한 뒤 증가한 파일 개수
  • Comp(sec) - compaction 시 걸린 총 시간
  • Comp(cnt) - compaction이 진행된 총 횟수
  • Avg(sec) - compaction 하는 데 걸리는 평균 시간
  • Stall(sec) - level N+1 이 uncompact 인 상태로 인해 write가 지연된 총 시간
  • Stall(cnt) - level N+1 이 uncompact 인 상태로 인해 write가 지연된 총 횟수
  • Avg(ms) - level N+1 이 uncompact 인 상태로 인해 write가 지연된 시간의 평균
  • RecordIn - compaction 시 record가 비교된 횟수
  • RecordDrop - compaction 시 record가 drop 된 횟수

Level Style Compaction

level compaction 에서 데이터베이스 파일은 level들로 구성된다. Memtable들은 level 0안의 file들로 flush되고, 가장 최신 데이터를 의미한다. level 이 클수록 더 오래된 데이터를 가진다. Level 0에 있는 file들은 overlap 될 수 있지만, 그 외의 나머지 level에 존재하는 files들은 overlapping 되지 않는다. 그 결과, Get()은 level 0에서는 보통 각 file들을 모두 확인해야 하지만, 각각의 연속적인 level에 대해서는 get하고자 하는 key는 한 file 넘게는 가지고 있지 않는다. 각 level은 전 level보다 10배 더 크다. (배수는 조정가능)

compaction은 leven N에서 몇 가지 file들과 겹치는 level N+1 파일들을 파일들을 compact 한다. 다른 레벨에서 진행중인 compaction 또는 다른 key range를 가지고 하는 compaction은 모두 독립적으로 동시에 진행이 가능하다. Compaction 속도는 max write rate에 직접적으로 비례한다. 만약 compaction이 write rate를 따라가지 못한다면, database에 의해 사용되는 공간은 계속 증가할 것이다. 높은 동시성과 스토리지의 완전한 활용을 하며 compaction을 실행하도록 설정하는것이 매우 중요하다.

level 0 과 level 1 에서의 compaction은 다른 level에 비해 까다롭다. level 0에 있는 파일들은 전체 key 공간을 아우른다. L0-> L1으로 compacting을 할 때, level 1에 있는 모든 파일들은 compaction에 포함된다. L0 과 함께 compact 되고 있는 level 1 의 모든 파일들과 함께, L1->L2 compaction은 진행될수 없다. 반드시 L0->L1이 끝날 때까지 기다려야 한다. 만약 L0->L1 compaction이 느리다면, 이 compaction이 시스템에서 진행되고 있는 compaction 의 대부분의 시간을 차지할 것이다.

L0 -> L1 compaction 은 single-threaded 된다. Single-threaded compaction 으로는 좋은 throughput을 얻기 어렵다. 이게 문제를 일으키는지 확인하고 싶싶다면, disk utilization을 보보면 된다. 만약 disk가 fully-utilize 되지 않았다면 compaction configuration에 문제가 있을 수도 있다. level 0의 크기를 level 1의 크기와 비슷하게 만듦으로써 L0->L1 을 가능한 가장 빨리 되도록 만드는것을 추천한다.

Level 1 의 적정한 크기를 정한 뒤에는, level 의 크기가 증가하는 배수를 저해야 한다.(multiplier). Level 1의 크기가 512 MB, level muliplier 가 10 그리고 database가 500GB라고 가정하면, level 2의 크기는 5GB, level 3 는 51GB 그리고 level 4는 512GB가 된다. Database 크기는 500GB이므로 level 5 또는 그 이상은 비어있게 된다.

Size amplification : (512 MB + 512 MB + 5GB + 51GB + 512GB) / (500GB) = 1.14

Write amplification : 모든 byte는 처음에는 level0에 쓰여지고 나서 level 1으로 compact 된다. level 의 크기가 level 0와 같기 때문에, L0->L1 compaction의 write amplification 은 2이다. 하지만, L1-> L2로 한 바이트가 compact 될 때, 이는 level2 에서 10 바이트와 함께 compact 된다. ( level 2가 10배 더 크기 때문) L2->L3와 L3->L4 도 동일하다. ㄹㅇㄹㅇㄹ총 Write amplification 은 약 1 + 2 + 10 + 10 + 10 = 33 이 된다.

Point lookups는 반드시 level 0 에 있는 모든 파일과 다른 각 level에서는 최대 1 파일을 봐야 한다. Bloom filter는 read amplification을 줄이는데 큰 도움이 된다. 작은 범위의 scan 은 더 비용이 많이 들지만, bloom filter는 range scan에 유용하지 않다. 따라서 read amplification은 number_of_level0_files + number_of_non_empty_levels 이다.

<level compaction 을 조절하는 option들>

  • level0_file_num_compaction_trigger --
    • level 0가 level0_file_num_compaction_trigger 만큼의 파일 개수에 도달하면, L0->L1 compaction이 시작된다.
    • 이를 통해 stable state인 level0의 크기를 예상할수 있다.
      • write_buffer_size * min_write_buffer_number_to_merge * level0_file_num_compaction_trigger
  • max_bytes_for_level_base and max_bytes_for_level_multiplier --

    • max_bytes_for_level_base 는 level 0의 총 크기이다. 앞서 말했듯이, level1과 level0의 크기는 비슷하게 가지는것을 추천한다. 각 일련의 level의 크기는 max_bytes_for_level_multiplier 만큼 크다. 디폴트 값은 10이고 바꾸지 않는 것을 추천한다.
  • target_file_size_base and target_file_size_multiplier--

    • Level 1에 있는 file들은 target_file_size_base bytes를 가진다. 다음 level의 파일 크기는 이전의 것보다 target_file_size_multiplier 만큼 더 크다. Default 는 1로, 모든 level의 파일 크기는 같다. target_file_size_base 를 증가시키면 총 database file의 개수가 줄어든다. target_file_sizebase 는 level 1 에 10개의 파일이 있도록 max_bytes_for_level_base / 10 을 추천한다.
  • compression_per_level--

    • 다른 level에 대해 다른 compression을 set 하는옵션이다. 보통 이 옵션은 level 0 과 level 1의 compress를 피하고 다른 높은 level만 compress하기 위해 사용한다. 가장 높은 level 에는(Lmax) 느린 compression을, 낮은 level들에는는 빠른 compression 을 하도록 설정이 가능하다. 은은
  • num_levels --

    • database에서 예상하고 있는 level 의 개수보다더 큰 num_levels을 가지는 것이 안전하다. 몇 개의 높은 level들은 비어있을 수 있지만 성능에는 영향을 미치진 않는다. level의 개수가 7보다 클 경우에만 이 옵션을 바꾼다.(Default)

results matching ""

    No results matching ""