在数据中心内,RoCE的出现是有其历史背景的,主要原因是为了替代TCP实现低延迟高带宽的可靠传输并降低CPU的overhead, 也就是Kernel Bypass的一些工作(结果现在RDMA over TCP真是讽刺啊)。
当然Kernel Bypass的工具也不止RDMA,还有后来的DPDK,以及衍生出来用在存储网络中的SPDK...
两者在设计思路上的跟不同点在哪?RDMA实际上是将传输层协议栈下沉到硬件,然后采用DMA Push的方式,而DPDK则是将协议栈上移,在用户态处理,而PMD(Poll Mode Driver)这个词也说明了采用Poll的方式。
一推一拉,各有异同。DPDK虽然消耗了额外的CPU资源,但是很多内容是按需读取的,CPU自己好控制。而RDMA的问题呢?数据是直接DMA push到内存的,而问题就出在DMA上, 看似好像DMA不用CPU核心的资源,但是DMA实现的时候,毕竟会对主内存带来干扰,特别是当网卡速率越来越高时。过去已经有很多论文pcie_bench[1] rdma_bench[2] 谈论到这个话题,结论就是RDMA的性能受到很多因素影响,DMA、PCIe、IOMMU都是需要考虑的东西,特别是PCIe本身的传输贡献了很大一部分延迟。
那么下一步的关键就是如何绕开PCIe DMA对整个系统的影响了?当然过去很多厂家也做了一些Direct Cache Access的尝试,例如Intel DDIO、CAT等技术,但是也会存在一些问题,具体分析可以看Reexaming DCA[3]
其实从本质上来看,就是RDMA网卡产生的DMA请求来自于外部主机具有高度的不可预测性,然后RootComplex又在CPU里没法可编程去控制和调度,外设DMA对于内存读写的争抢和CPU多核一起争抢,还有LastLevelCache的影响....让网卡根据CPU每个核的空闲程度去调度会搞得更复杂...
所以一个非常朴素的想法就产生了,能不能把I/O相关的内存和计算相关的内存隔离开来?或者在DMA的路径上绕开PCIe?
当然Kernel Bypass的工具也不止RDMA,还有后来的DPDK,以及衍生出来用在存储网络中的SPDK...
两者在设计思路上的跟不同点在哪?RDMA实际上是将传输层协议栈下沉到硬件,然后采用DMA Push的方式,而DPDK则是将协议栈上移,在用户态处理,而PMD(Poll Mode Driver)这个词也说明了采用Poll的方式。
一推一拉,各有异同。DPDK虽然消耗了额外的CPU资源,但是很多内容是按需读取的,CPU自己好控制。而RDMA的问题呢?数据是直接DMA push到内存的,而问题就出在DMA上, 看似好像DMA不用CPU核心的资源,但是DMA实现的时候,毕竟会对主内存带来干扰,特别是当网卡速率越来越高时。过去已经有很多论文pcie_bench[1] rdma_bench[2] 谈论到这个话题,结论就是RDMA的性能受到很多因素影响,DMA、PCIe、IOMMU都是需要考虑的东西,特别是PCIe本身的传输贡献了很大一部分延迟。
那么下一步的关键就是如何绕开PCIe DMA对整个系统的影响了?当然过去很多厂家也做了一些Direct Cache Access的尝试,例如Intel DDIO、CAT等技术,但是也会存在一些问题,具体分析可以看Reexaming DCA[3]
其实从本质上来看,就是RDMA网卡产生的DMA请求来自于外部主机具有高度的不可预测性,然后RootComplex又在CPU里没法可编程去控制和调度,外设DMA对于内存读写的争抢和CPU多核一起争抢,还有LastLevelCache的影响....让网卡根据CPU每个核的空闲程度去调度会搞得更复杂...
所以一个非常朴素的想法就产生了,能不能把I/O相关的内存和计算相关的内存隔离开来?或者在DMA的路径上绕开PCIe?