从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结构进行修改:

在这里插入图片描述

  1. bytes_sent
  2. bytes_acked
  3. bytes_received
  4. packets_out
  5. 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网络栈吧。

至于后面这个项目引出的一系列事情,我也是过于无奈,一个连我自己都骗不了的东西我实在没法拿来骗别人,而且换我也绝对不敢代表公司讲这么一个完全不成熟的东西,怎么敢的呀你们。。

参考:

  1. An Analysis of Linux Scalability to Many Cores
  2. BMC: Accelerating Memcached using Safe In-kernel Caching and Pre-stack Processing
  3. Network Stack Specialization for Performance
  4. Workload Analysis of a Large-Scale Key-Value Store
  5. Reconciling high server utilization and sub-millisecond quality-of-service
  6. mTCP: a Highly Scalable User-level TCP Stack for Multicore Systems
  7. The eXpress Data Path: Fast Programmable Packet Processing in the Operating System Kernel
  8. The Tail at Scale Managing Tail Latency in Datacenter-Scale File Systems Under Production Constraints
posted @ 2022-07-02 13:16  李兆龙的博客  阅读(65)  评论(0编辑  收藏  举报