3.3. Team WAL/Manifest

Hyphothesis

Options


write_buffer_size

write_buffer_size 값이 클수록 대량 로드 시에 성능이 향상된다.
max_memory_size(= write_buffer_size + block_cache_size) <= 1GB 이므로
1GB 일 때 Load의 성능이 최대가 될 것이다.
WorkloadA : Read(50) + Modify(50) 
WorkloadB : Read(95) + Modify(5)
WorkloadD : Read(95) + Modify(5)
따라서 모든 workload에서 Modify를 하므로 write_buffer_size가 커질수록 
LoadA, RunA, RunB, RunD 모두에서 성능 향상이 있을 것으로 예상된다. 

max_file_size

 파일의 최대 크기가 커지면 compaction 시간이 길어져 latency가 느려질 수 있다.
 따라서 파일 시스템에 적합한 값을 찾는 것이 중요하다고 예상된다.
 만약 파일 시스템이 비교적 큰 파일을 사용하는 것이 효율적이라면 파일 크기를 증가
 시킬 수도 있다.

block_size

 block마다 패킹된 데이터의 대략적인 크기를 설정하는 옵션이다.
 여기에서의 block의 크기는 압축되지 않은 데이터이므로 압축이 빠르게 되려면 크기가 
 작아야 성능에 유리할 것이라고 예상했다.

block_restart_interval

 정확히 어떤 기능을 하는 옵션인지 이해하지 못했지만
 // Most clients should leave this parameter alone.
 leveldb에서는 대부분의 클라이언트에서 변경하지 않는 것을 권장했으므로
 이에 따라 실험을 진행했다.

block_cache_size

 일반적으로 cache의 크기가 클 수록 히트율이 높아지기 때문에 좋다고 생각한다.
 하지만 실제로는 cache의 비용이나 여러 측면에서 무작정 크게 할 수 없으므로 옵션에
 적용한 크기만큼 성능이 나오지는 않을 것이다. 

compression

compression의 옵션은 kNoCompression과 kSnappyCompression 2개의 옵션이 설정 가능하다. 
// Note that these speeds are significantly faster than most
// persistent storage speeds, and therefore it is typically never
// worth switching to kNoCompression.  Even if the input data is
// incompressible, the kSnappyCompression implementation will
// efficiently detect that and will switch to uncompressed mode.
leveldb의 compression 옵션에 대한 설명인데 위의 설명에 따르면 kNoCompression 옵션으로 변경할 필요가
없다고 되어 있어 kSnappyCompression 옵션 일 때 성능이 더 좋을것으로 예상된다.

filter_policy

default로 NewBloomFilterPolicy로 설정이 되어 있고 지난 bloomfilter 팀의 benchmark 발표에서 
10bit 일 때 가장 효율적이라고 발표를 했으므로 따로 설정하지 않고 10bit로 실험을 진행했다.

Experiments

Options


write_buffer_size

64, 128, 256, 512MB를 3개의 다른 서버에서 실험을 진행했다.
실험을 진행해 보니 64MB를 넘어가면 큰 변화가 없었다.

max_file_size

3개의 다른 서버 환경에서 max_file_size의 default 값이 2MB에서 2배씩 증가시키면서 실험을 진행했고 64MB ~ 1GB까지 실험을 해보았다.

block_size

default 값인 4kB에서 2배씩 증가 또는 감소시켜서 여러 개의 값을 설정해서 실험을 진행했다. 

block_restart_interval

default 값인 16으로 실험을 진행했다.

block_cache_size

최대한 크기를 증가시켜보고 성능이 향상되지 않는 시점의 값을 찾는 것을 목표로 실험을 진행했다.

compression

kNoCompression과 kSnappyCompression에서 모두 실험을 진행해보았는데 큰 차이가 없었지만 kNoCompression에서 성능이 향상되지는 않았다.

filter_policy

10bit로 두고 다른 옵션들을 변경해가며 실험을 진행했다.

Results

Options


write_buffer_size

특정한 값을 넘어가면 미리 정해진 값으로 고정이 되는 것 같다.
서버가 다른 것도 영향을 줄 수 있는지는 확인을 해봐야겠지만 3개의 서버에서 같은 결과가 나오지는 않아서 평균값을 결과값으로 정했다.

max_file_size

64MB 이상부터는 큰 차이가 없었고 일반적인 경우에 파일의 크기가 클수록 성능에 안 좋을 수 있다고 생각해서 비슷한 결과 값 중에서 
가장 작은 64MB을 결과값으로 정했다.

block_size

우리의 실험에서는 8kB 일 때 값들이 일관적으로 잘 나오는 것을 확인했고 공통된 결과가 나왔으므로 8kB를 결과값으로 정했다.

block_restart_interval

16

block_cache_size

캐시의 크기가 128MB부터는 성능이 향상 되지 않았고 반복적으로 실험을 돌려봐도 높은 성능이 나오는 것을 확인해서 
128MB를 결과값으로 정했다.

compression

kSnappyCompression

filter_policy

10bit