Ceph开发每周谈 Vol 25 | Ceph & DPDK 网络插件开源

2016年06月 · 麦子迈

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

  • 上周综述

上周 Ceph 社区进入新一轮的特性开发流程中。

  • Ceph DPDK 网络插件开源

众所周知,在 BlueStore 的 SPDK Driver 合并进主线以后,为了让整个 IO 路径全用户态化,同时因为 Polling 线程去 poll NVME SSD 的有效 CPU 利用率是不高的。因此我们把同样的 Polling 线程用于网络的读写上。

因此在基于 AsyncMessenger 再上实现了 NetworkStack API,来抽象对于具体网络读写的功能,使得原来的 Kernel 路径成为 PosixStack,新的 DPDK 驱动将构建新的 DPDKStack。而在 DPDKStack,每个 Polling 线程成为一个独立的网络栈,负责本地连接的收发,不需要任何锁的同步。因此,在 Ceph 会话层所有的功能都留在 AsyncMesenger 上,而将纯粹的网络实现分离开来,使得 DPDK Driver 能够快速对接 Ceph 已有网络会话层要求。XSKY 已将网络部分代码开源。

https://github.com/ceph/ceph/pull/9230

至此,网络和存储协议栈都已经完成 Upstream 的全用户态化并全部由 XSKY 贡献。整个 IO 路径的打通和无锁运行也已经完成大部分,在 DPDK 插件合并后会开始整合部分代码的 Upstream 化。

  • Messenger V2协议

为了应对新的 Encryption 要求,同时重构一部分网络协议,Sage 发起了新一版 Messenger Handshake 协议的讨论,主要是将原来的 Auth 层消息转移到 Messneger 原生协议,同时将加密的 Handshake 也拉进去。另一方面,为了减轻 Kernel 对于 Reconnect 特性的复杂度,会将 Reconnect 特性单独拿出来而不需要 Client 支持。

同时,原来 Ceph Message 的结构是 Header,Front,Middle,Data,Footer,将精简为 Header,Front,Data。避免额外的系统调用。原来在 Messenger 实现的消息 Ack Id 也会移到 Header 里避免额外的 Ack 消息。这将大大降低潜在的 TCP Packet 数量。另一方面,由于 Mesenger 新协议不需要兼容 V1(通过 Mon 的不同端口绑定实现平滑升级) 使得我们可以在 V2 协议重置所有 Message Version!这也使得我们有机会重构很多 Message 而不需要考虑 Legacy 协议。