Ceph开发每周谈 Vol 13 — Cache on SPDK / bufferlist

2016年03月 · 麦子迈

这是Ceph开发每周谈的第十三篇文章,记录从16年2月29号到16年3月6号的社区开发情况。笔者从前年开始做Ceph的技术模块分析到今年中告一段落,想必有挺多人期待下一篇Ceph技术分析。考虑到Ceph的发展已经从前年的一穷二白到现在的如火如荼,但对于社区的方向和实况仍有所脱节,笔者考虑开始Ceph开发每周谈这个系列。每篇文章都会综述上周技术更新,围绕几个热点进行深度解析,如果正好有产业届新闻的话就进行解读,最后有读者反馈问题的话并且值得一聊的话,就附上答疑部分。

上周综述

上周并没有合并太多新的特性,主要针对一些大的特性在做测试,而从目前的情况看,RBD 和 RadosGW 进展还算顺利,CephFS 仍然有一些距离。

Cache Layer Above NVME(SPDK) driver

这是年初提出的基于 NVMEDevice(SPDK) 之上的 Cache Layer,背景是目前 BlueStore 主要利用 pagecache 作为读缓存,来命中 Rocksdb 和其他关键元数据,但是 NVMEDevice 由于绕过了 Kernel 使得丧失了 PageCache 的能力。因此,关键元数据也需要落盘读取,即使后端是 NVMESSD,这个延迟也比内存命中要来得高很多。因此,这限制了 NVMEDevice 的进一步性能提升。

因此我们需要一个提供读缓存带来关键元数据的命中,同时提供预读支持。这个项目也可以参考 MySQL 或类似成熟 DB 的块缓存实现和算法。

这个项目目前作为 GSoC 2016 的项目之一,仍然在招纳学生加入。

bufferlist 改进

bufferlist 是 Ceph 中最重要的数据结构之一,从客户端库到 OSD 落盘基本都伴随着 bufferlist,因此 bufferlist 的性能关乎整个 IO 路径。目前 bufferlist 单纯从实现角度的改进比较有限,Sage 提出将 ptr 结构和数据合并分配/释放来减少内存分配次数。通过富士通的性能测试和分析,合并分配确实能带来一些延迟提高。而另一个想法是内置 ptr 到 bufferlist 结构,但是大部分 bufferlist 集中在 1-13 个ptr,而 1-4 个 ptr 并不是主流,因此内置 ptr 返回会造成性能损耗。

另外一个想法是单独实现一个不需要计数器的轻量级 bufferlist,用于模块内部非共享使用,比如 encode/decode,ObjectStore 里面。

XSKY-Ceph开发每周谈