狠狠撸

狠狠撸Share a Scribd company logo
flashcache 内部原理和优化
核心系统部-内核组
Robin Dong <robin.k.dong@gmail.com>
讲师介绍
? 核心系统部-内核组-董昊(花名:三百)
? 2006年加入阿里巴巴-雅虎中国 从事c/c++服务端程序开发
? 2008年转入淘宝,继续从事c/c++服务端程序及公用库开发
? 2011年转入核心系统部内核组,目前从事文件系统和IO相关的内核开
发和调优
? 内核组百科:http://baike.corp.taobao.com/index.php/Kernel
? 内核组wiki:http://kernel.taobao.org/
课程目标与目标学员
? 面向学员:>=P6,有linux上编程开发经验
? 课程目标:通过本课程,学员可以:
1. 更深的理解linux的block层结构
2. 了解linux的device mapper框架
3. 了解flashcache的原理
课程大纲页
1. Linux内核的block层
2. Device Mapper原理
3. 贵濒补蝉丑肠补肠丑别原理
4. 贵濒补蝉丑肠补肠丑别改造
Linux内核的Block层
? Block层位于文件系统层之下,设备驱动层之上
图片来自 http://adrianhuang.blogspot.com/
Linux内核的Block层
? BIO与request
图片来自 http://lwn.net/Articles/26404/
Linux内核的Block层
? Linux内核的所有IO最后都走到submit_bio函数
图片来自
http://adrianhuang.blogspot.com/
Linux内核的Block层
? request_queue
图片来自 http://blog.csdn.net/fudan_abc/article/details/2034264
Linux内核的Block层
? IO调度器
? cfq (为每个进程准备一个队列)
? deadline (读请求、写请求两个队列)
? anticipatory (deadline的改进)
? noop
课程大纲页
1. Linux内核的block层
2. Device Mapper原理
3. 贵濒补蝉丑肠补肠丑别原理
4. 贵濒补蝉丑肠补肠丑别改造
Device Mapper原理
? 将两个(或多个设备)聚合成一个虚拟设备
图片来自 http://www.ningoo.net/
Device Mapper原理
? 线性聚合
? dmsetup create my_linear table.txt
? table.txt:
0 1048576 linear /dev/sda 0
1048576 2097152 linear /dev/sdb 0
Device Mapper原理
Device Mapper原理
? striped聚合(RAID0)
? dmsetup create my_stripe table.txt
? table.txt:
0 2097152 striped 2 32 /dev/sda 0 /dev/sdb 0
Device Mapper原理
课程大纲页
1. Linux内核的block层
2. Device Mapper原理
3. 贵濒补蝉丑肠补肠丑别原理
4. 贵濒补蝉丑肠补肠丑别改造
贵濒补蝉丑肠补肠丑别原理
? Flashcache用device mapper框架实现
贵濒补蝉丑肠补肠丑别原理
? 直接处理传入虚拟设备的BIO
? 默认每8个sector(512Bytes)为一个block,每512个block为一
个set; cache和disk都按此划分
? set内的block由LRU链表管理
? 非常简单的Hash算法:在disk上属于哪个set,直接模上cache
的set数
贵濒补蝉丑肠补肠丑别原理
贵濒补蝉丑肠补肠丑别原理
? Writeback(回写)模式
– 写操作迅速完成(只写cache)
– 利用work_queue(由keventd内核线程执行)把cache中的
dirty block写往disk
贵濒补蝉丑肠补肠丑别原理
? Flashcache的可调参数
? /proc/sys/dev/flashcache/fioa3+fioa1/
? dirty_thresh_pct (可以最多保持多少dirty blocks,针对单个set)
? do_sync
? fallow_clean_speed/fallow_delay
? skip_seq_thresh_kb (用32个seqio结构来跟踪连续的IO流)
课程大纲页
1. Linux内核的block层
2. Device Mapper原理
3. 贵濒补蝉丑肠补肠丑别原理
4. 贵濒补蝉丑肠补肠丑别改造
贵濒补蝉丑肠补肠丑别改造
线上RDS平台(mysql hosting)需要按比例控制IO
– 某些进程可以使用50%的IO带宽,某些只能用20%
– 肠蹿辩调度器可以调整每个进程分配的时间片做到这一点
贵濒补蝉丑肠补肠丑别改造
? blokio-controller
– mount -t cgroup -o blkio none /cgroup
– mkdir -p /cgroup/test1/ /cgroup/test2
– echo 1000 > /cgroup/test1/blkio.weight
echo 500 > /cgroup/test2/blkio.weight
– echo ${PID1} > /cgroup/test1/tasks
echo ${PID2} > /cgroup/test2/tasks
贵濒补蝉丑肠补肠丑别改造
? 直接把flashcache的io scheduler改为cfq?
Flashcache是BIO based,根本不走io scheduler !
贵濒补蝉丑肠补肠丑别改造
? 直接在flashcache_map里调用__make_request?
? IRQ没有关闭,会报BUG_ON()
? 直接利用device mapper带的map_rq?
? 一个request可能会包含多个bio
贵濒补蝉丑肠补肠丑别改造
? Device mapper提供的struct target_type
struct target_type {
uint64_t features;
const char *name;
struct module *module;
unsigned version[3];
dm_ctr_fn ctr;
dm_dtr_fn dtr;
dm_map_fn map;
dm_map_request_fn map_rq;
......
}
贵濒补蝉丑肠补肠丑别改造
? 改造方法:
– 在struct target_type里添加mk_rq方法
– 实现map_rq
– dm_io_async_bvec函数的改造:原先发出去的BIO现在改为放
入flashcache设备的request_queue里
贵濒补蝉丑肠补肠丑别改造
贵濒补蝉丑肠补肠丑别改造
按照每个进程的比例划分占用的cache空间
每个group一个LRU
可以从 cat /proc/flashcache/fioa3+fioa1/flashcache_blocks 里查看
每个group的名称、权重、已经使用了多少个block
推荐学习资料
BIO介绍: http://lwn.net/Articles/26404/
Block layer介绍:
http://blog.csdn.net/fudan_abc/article/details/2034264
Flashcache介绍:
http://www.ibm.com/developerworks/cn/linux/l-
devmapper/index.html
Q & A
Thanks!

More Related Content

蹿濒补蝉丑肠补肠丑别原理及改造