至此,我们已经基本分析完整个leveldb,本文给出leveldb中的各组件的默认大小。
-
log 文件,由一系列的32kb物理块组成。
-
manifest 文件,目前来看未限制其大小,但是在系统Open时,有一次机会重新**(文件大小超过2M)**开辟一个新的manifest,并移除旧文件。这部分在ReuseManifest函数中有体现:
1 | bool VersionSet::ReuseManifest(const std::string& dscname, |
- memtable: 4MB,源自:
leveldb/options.h
1 | // Amount of data to build up in memory (backed by an unsorted log |
- sstable:2MB,来源:
1 | static uint64_t MaxFileSizeForLevel(const Options* options, int level) { |
具体应在,在DoCompactionWork函数内部,有一段代码:
1 | // Close output file if it is big enough |
-
SStable的datablock, 变长,但最小为4kb。
-
各level的大小
-
level0,不按大小算,而是按照文件个数算,level0默认为4个文件触发一次compaction。其他还有两个配置,1个8个文件,在MakeRoomForWrite函数中使用,一个12,达到12个文件,系统将暂停写入。
1
2
3
4
5
6
7
8
9// Level-0 compaction is started when we hit this many files.
static const int kL0_CompactionTrigger = 4;
// Soft limit on number of level-0 files. We slow down writes at this point.
static const int kL0_SlowdownWritesTrigger = 8;
// Maximum number of level-0 files. We stop writes at this point.
static const int kL0_StopWritesTrigger = 12; -
其他level, level1 10M, level 2 100M, 逐层递乘10.
-