从BMC看出一个 idiot 的思维变化
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。
那一天我二十一岁,在我一生的黄金时代。我有好多奢望。我想爱,想吃,还想在一瞬间变成天上半明半暗的云。后来我才知道,生活就是个缓慢受锤的过程,人一天天老下去,奢望也一天天消失,最后变得像挨了锤的牛一样。可是我过二十一岁生日时没有预见到这一点。我觉得自己会永远生猛下去,什么也锤不了我。
大学生活没什么意外的话确实是要结束了。
毕设开始是在CLK2021上看到华为用eBPF去加速Redis这样基于TCP的应用,霎时间我像是土猪看到细糠一样无法自拔的陷入到这个项目里。
Idea本身是在NSDI2021《BMC: Accelerating Memcached using Safe In-kernel Caching and Pre-stack Processing》这篇文章上提出,但是论文本身把想法局限在使用eBPF在网络堆栈前加速Memcache基于UDP的GET请求和基于TCP的SET请求,华为尝试扩展了此想法到基于TCP传输的Redis中,两方都声称自己达到了最低三倍以上,最高十八倍的性能提升。
看起来太酷了不是吗!
事实上原本以为最终我会花费半年时间在毕设上,我也确实在前一个月投入了近乎全部精力,因为我是没挨过锤的小黄牛,我臆想自己会把这个绝妙的思想通用化,臆想自己会做的比论文作者和华为更好,但是事实证明论文作者是智慧的,我是愚蠢的。
事实上讲这种既要可拔插,又要堆栈前处理数据的思想通用化最大的问题就是TCP状态的维护,这个问题几乎是不可解的。DPDK是一种Bypass内核网络栈的方案,解决TCP状态维护的做法是用户态协议栈[6]。
TCP协议是一种保证可靠的字节流协议,和客户端正常通信的唯一方式就是保证你能够去确保TCP协议本身的正确,然后才是数据的正确,这意味着我们几乎必须在维护TCP协议时拥有一个TCP协议栈,这是网络堆栈前在eBPF中处理数据包最大的问题。
在简单学习了TCP网络栈以后我做出了如下尝试在eBPF中对tcp_sock
结构进行修改:
- bytes_sent
- bytes_acked
- bytes_received
- packets_out
- copied_seq
诚然窗口维护正确以后理想环境下就可以跑起来了,但是重传怎么办?乱序怎么办?拥塞怎么办?分包怎么办?嗯,没法处理,换句话说处理了这些问题就是一个用eBPF实现的TCP协议栈,所以没有TCP协议栈就没法处理这些问题。
所以用eBPF实现个TCP协议栈吗?智慧的论文作者已经告诉我们了,让我大声的为您朗读一遍:BMC’s design is well suited for high throughput performance as it does not introduce unnecessary complexity. 嘿!我们这么快是因为我们没引入复杂性,没引入复杂性的原因是不需要维护多余状态,不维护多余状态的原因是我们不支持TCP协议的协议栈前处理,所以,这篇NSDI2021的文章优化的目标是Memcache基于UDP的GET请求和基于TCP的SET请求。
原文也用dummy cache
来说明eBPF中不应该有复杂逻辑:
简单解释下这幅图,首先Dummy cache
会在一段时间睡眠后直接返回给数据包,所以其睡眠时间和吞吐量的比率可以很清楚的类比eBPF本身复杂性和吞吐量,蓝点是原文eBPF缓存一般的处理时间。可以看到基本处理的时间和吞吐是线性降低的。
原作者早已经委婉的告诉后来者了,路走到头了,别搞了。要我说,想实现TCP协议的支持还是先去搞基于eBPF的TCP网络栈吧。
至于后面这个项目引出的一系列事情,我也是过于无奈,一个连我自己都骗不了的东西我实在没法拿来骗别人,而且换我也绝对不敢代表公司讲这么一个完全不成熟的东西,怎么敢的呀你们。。
参考:
- An Analysis of Linux Scalability to Many Cores
- BMC: Accelerating Memcached using Safe In-kernel Caching and Pre-stack Processing
- Network Stack Specialization for Performance
- Workload Analysis of a Large-Scale Key-Value Store
- Reconciling high server utilization and sub-millisecond quality-of-service
- mTCP: a Highly Scalable User-level TCP Stack for Multicore Systems
- The eXpress Data Path: Fast Programmable Packet Processing in the Operating System Kernel
- The Tail at Scale Managing Tail Latency in Datacenter-Scale File Systems Under Production Constraints