目录
数据中心的RPC可以既通用且快
这篇是2019年NSDI会议的最佳论文[1]。看到6.824的2020年课程也即将讲这篇文章,安排在明年4月17日。这里先自己试着读一下。
作者要达成什么目标?
- 不用特殊的硬件。(比如RDMA,比如不丢包的网络,比如FPGA)——只用普通的网卡,普通的交换机,达到高速RPC。
- 小消息速率快
- 大消息带宽高
- 能上规模scales well
- 可以很通用——可以作为一个drop-in的网络库,直接用在现有的软件中。
- 在UDP(或者InfiniBand的不可靠数据报传输协议)之上实现。能处理丢包、网络拥堵、RPC请求在背景执行(异步?)。
基本思路
optimize for the common case
- 针对普通情况(common case)做优化。对于小概率事件则不优化,故而导致小概率事件发生时可能更慢。
- 普通情况的假设是:
- 网络不丢包(不需要重发)。
- 消息都很小——1个UDP包就装得下。
- 网络不拥堵。
- RPC处理程序都很小。
- 疑问:刚才不是说不用特殊硬件吗?怎么又假设网络不丢包?
- 答:数据中心内会丢包都是因为交换机缓冲区满了!eRPC限制每台机outstanding的网络流量,最多不能超过带宽延迟乘积(19k)。这既保证了用满带宽,又足够小,不会造成交换机缓冲区(12MB)满——也就极少会有丢包情况发生。
关键数据结构:msgbuf
消息缓冲区。
- 支持DMA。用户程序、eRPC和网卡共享这块内存。
- 零拷贝。就是说CPU不需要把数据从内存的一个区域拷贝到另一个区域。应用程序将数据写入到msgbuf以后,数据由网卡以DMA方式直接读取。
- 1个msgbuf存放1条消息。这条消息可以是单个UDP包,也可以是多个,根据消息长度决定。假定通常情况是1个包的小消息。
这张图解释了msgbuf的排列。
- 数据区是连续的,所以应用程序只要把数据区当成一个连续区域,尽管放数据就好了。
- 如果1个UDP包无法发送完整个RPC request,数据区就会被拆分成N块( D a t a 1 Data_1 Data