linux内核源码阅读之facebook硬盘加速利器flashcache之初

这个星期偷着点闲看下flashcache,所谓知其然知其所以然,本着程序员追根抛底的职业素养,看看flashcache究竟是何等的三头六臂。
一、flashcache是什么
flashcache是一个linux内核模块,主要目的是用SSD加速块设备,相当于用SSD盘作为块设备的缓存。
二、flashcache在内核的哪一层
位于内核的dm层(device mapper),在块设备之上,在VFS之下。
三、flashcache适用于哪些场景
最初是作为数据库InnoDB的缓存,适用于大多数块设备为瓶颈的系统中。
四、flashcache可以作为软RAID的缓存吗
如果RAID下面的磁盘是HDD,那么可以。如果已经是SSD盘的RAID,那就多此一举了吧。
五、flashcache工作原理是什么
就是在块设备之上建立一个逻辑层,这个逻辑层缓存了读写数据,在命中的情况下,读可以立即返回不用发送到磁盘上。
同样,写也不用等待写到磁盘上,而直接返回并由后台慢慢把数据刷回。
六、flashcache可以同时用做读缓存和写缓存吗
是的。但是个人认为其优势在于写缓存,因为写SSD比写HDD等块设备还是快了不少。
如果是读的话,不命中照样得去HDD取,那命中不就快了很多吗?
理想总是丰满的,现实总是残酷的。在实际应用中,例如上面是VFS层,VFS层已有自己的缓存,对读没有明显提高。
七、那哪里可以下载到最新的版本
八、如何搭建环境
如果你已经下载代码,查看flashcache-sa-guide.txt文件吧,里面有详细的说明。
我这边暂且就当个剧透吧,说个基本。
第一,当然是编译,编译完成生成一个内核文件flashcache.ko 和三个用户态程序flashcache_create,flashcache_destroy,flashcache_load。ko文件用于在内核,放入/lib/module/version/kernel/driver/内核模块相应目录,然后depmod -a;;modprobe加载该模块。也可以添加开机加载模块脚本/etc/modules-load.d/实现。
第二,用flashcache_create创建块设备对应的缓存设备,具体参见flashcache-sa-guide.txt。
第三,创建好flashcache设备之后就可以使用该设备了。这时候就可以比较一下有flaschcache与没有之间有差别了。
九、如果你觉得还不够过瘾,那么就深入源代码看看究竟
其实源代码非常少,也不难。看看1.0版本的Makefile,内核态的也就4个文件,flashcache_conf.c flashcache_main.c flashcache_subr.c flashcache_ioctl.c,当然还有头文件,头文件的魅力是无穷的,因为写linux内核的哥们总是喜欢把最精华的设计和数据结构放在头文件里,flashcache也是继承了这一光荣传统。只要把flashcache.h中数据结构看懂,就已经入门三分之一了,把把头文件中状态宏看懂就知道读写流程的状态机了,接着再看源代码,带着这些宏观的概念再去看源代码,基本上就是游山玩水般惬意了。
下面几篇文章开始讲源码。

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: MD是Linux内核中的一个模块,可实现磁盘阵列的软件级RAID,它和RAID0、RAID1、RAID4、RAID5、RAID6一样,就是一种磁盘阵列方案。 MD中最主要的部分是驱动程序,它运行在内核态中。它将多个磁盘设备组合在一起,成为一个逻辑设备,该逻辑设备对应着一个块设备文件。在这个逻辑设备上,可实现磁盘阵列的软件级RAID功能。 MD驱动程序的主要源代码是在/drivers/md目录下的md.c文件中,它包括了MD的全部源代码,还有一些其他相关文件,比如raid5.c等。 在这个文件中,最值得学习的是内核的模块化编程思想。模块化编程是一种将代码划分为模块的软件设计方法,通过将代码划分为不同的模块,实现代码的解耦、可重用、可维护性等目标。 在MD.c中我们还可以看到内核中的锁、内存管理等基本的内核技术的应用。通过对MD.c进行源代码解读,能够深入了解Linux内核的实现原理,特别是MD的RAID功能的实现,对于我们进一步学习Linux内核的相关知识和对其进行应用开发具有很大的帮助。 总之,通过对MD.c源代码的解读,我们可以学习到Linux内核模块化编程思想、内存管理、锁机制等基本内核技术,进一步掌握Linux内核的实现原理,从而在Linux应用开发中更加熟练娴熟。 ### 回答2: MD(Multiple Devices)是一种常用的软件RAID方案,可以在Linux内核中实现,同时也是Linux内核中最基本的RAID模式之一。MD在实现中使用了驱动程序和用户空间工具,其中驱动程序包含在内核中,因此我们需要对MD的源代码进行解读。 MD的源代码是由C语言编写的,主要包含在drivers/md/目录下。在这个目录下,可以看到一些重要的文件和子目录,例如md.c、md.h、raid1.c、raid5.c等。这些文件和子目录定义了MD的基本结构和函数,如磁盘阵列的基本信息结构、磁盘块的操作函数等。 MD的实现思路比较清晰,可以简单地理解为将多个物理磁盘组合在一起,形成一个虚拟的块设备。在这个虚拟的块设备上,可以进行读写等操作,而具体的数据操作则由MD提供的不同RAID模式实现。例如,MD支持的RAID1模式就是将数据同步写入两个物理磁盘,以实现磁盘容错。而MD支持的RAID5模式则是将数据分散写入多个物理磁盘,通过奇偶校验等方式实现磁盘容错。 在MD的源代码解读过程中,需要重点关注这些RAID模式的实现方式和相关函数。同时,还需要了解整个MD的插入和移除机制、数据恢复机制等,以便更好地理解和修改MD的源代码。 总之,对于想要深入了解Linux内核中RAID相关实现的开发者来说,对MD的源代码进行解读是一个非常有价值的学习和探索过程。 ### 回答3: md是linux内核中的一个重要模块,支持多种存储设备,包括硬盘、闪存和网络存储等。如果想要深入了解linux内核的运行机制,就必须掌握md的源代码。下面就对md源代码进行解读。 md源代码的核心是md.c文件。这个文件中定义了md模块的核心函数,包括md_init()、md_run()和md_stop()等。其中md_init()函数主要负责初始化md模块的各个子系统,包括raid核心、hotplugging、proc文件系统和sysfs文件系统等。md_run()函数则是md模块的主要循环,负责轮询设备状态并执行相应的IO操作。md_stop()函数则是md模块的关闭函数,用于释放模块占用的各种资源。 除了md.c文件外,md模块的代码还包括一些关键性质的文件,例如mddev.c、md.h和md_u.h等。其中,mddev.c文件定义了md设备的数据结构,包括磁盘阵列、线性设备和伪设备等。md.h和md_u.h文件则分别定义了用户空间和内核空间的md控制接口,包括创建和删除设备、添加和删除磁盘等。 在理解md源代码时需要注意的是,md模块涉及到多个子系统,包括块设备、文件系统和RAID等,因此需要对这些子系统的工作原理和相互关系有清晰的理解。同时,由于md模块的代码相当复杂,需要仔细地阅读和调试,才能完成内核的定制和优化工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值