-
Notifications
You must be signed in to change notification settings - Fork 436
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Mc doc #985
Open
caijieming-ng
wants to merge
3
commits into
baidu:master
Choose a base branch
from
caijieming-ng:mc-doc
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Mc doc #985
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
#compact优化——多线程compact | ||
##背景 | ||
|
||
leveldb的compact策略是采用单线程执行的,顺序的读写逻辑减少了磁盘抖动,有利于发挥单机的机械磁盘的高效顺序读写性能。而类似rocksdb和tera的使用场景,底层直接使用ssd或使用ssd做本地cache或使用分布式文件系统,突破了机械磁盘的限制,在这种场景下,tera目前仍然使用levelbd的单线程模型做compact,业务的写热点很容易导致写入失败。因此本次实现多线程compact,充分利用底层存储带宽,提升compact性能,保证写分裂前,不会因为写热点导致写失败。 | ||
|
||
##实现 | ||
###自动compact的改造 | ||
|
||
1. 每个sst文件增加compact的互斥标记位,设置该位表示该sst正在被compact。具体添加位置是FileMetaData.being_compacted | ||
2. PickCompaction选择sst进行compact时,会判断sst的being_compacted标记位,若正在被compact,则选下一个。 | ||
3. 将新产生的sst记入manifest时,LogAndApply函数采用类似Write的流程的互斥方式,保证多线程manifest文件是安全的。 | ||
4. 删除旧sst文件时,由于正在被compact的临时文件放到了pending_outputs_集合中被保护起来,所以需要先执行ReadDir获得所有临时文件,再将不在pending_outputs_集合中的临时文件删除,确保多线程时,不会误删其他compact线程的临时文件。 | ||
5. 打分机制的修改:维护每层的打分,level0的分数在文件个数较少时,采用个数/2;若文件个数较多时,采用sqrt(个数)/2;保证灌库时打压level0分数,非灌库时积极compact level0; | ||
6. 调度compact前,仍选择最高分的自动compact任务进行compact,但在每次PickCompaction最后,会过滤being_compacted的sst,重新打分;compact完成或失败后也重新计算各层分数。 | ||
|
||
###flush memtable的改造 | ||
|
||
1. memtable增加互斥标记位,保证flush imm时,有且仅有一个线程在执行flush | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 为啥要有这个标记位,还是不懂。。flush imm原本就是单线程的呀? |
||
|
||
###手动compact的改造 | ||
|
||
1. manual_compact描述结构增加互斥标记,保证手动compact时,有且仅有一个线程在执行手动compact。 | ||
|
||
##测试 | ||
###单测 | ||
单测采用leveldb的各种单元测试,make check | ||
|
||
###集群测试 | ||
|
||
###性能测试 | ||
1. 单机测试使用db_bench | ||
2. 集群测试采用使用tera_bench | ||
|
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
磁盘抖动
是啥。。大致明白你意思,不过好像没这个专业术语?