介绍:SMC-R是如何加速TCP应用的?编者按:TCP协议是目前使用最广泛的网络协议,其场景遍及移动通信、数据中心等。针对数据中心场景,高性能网络协议SMC-R是通过弹性RDMA实现的,透明替代应用TCP协议,实现应用网络透明加速。本文编译自龙百合大讲堂第15期。视频花絮已上传至龙蜥官网。欢迎查看!为什么需要一个新的内核网络堆栈?Linux内核网络协议栈没有灵丹妙药。当前的Linux网络协议栈是在性能(吞吐量、CPU使用率)、延迟和通用性的权衡下实现的。在实际场景中,我们可能需要一个高性能但不通用的用户态协议栈,或者一个通用的、更高性能和更低时延的方案,但是基于传统以太网卡的方案很难做到大大改善。更多的是基于硬件的红利,比如100G/400G网络。鉴于此,我们考虑是否可以基于其他高性能网络提供兼容TCP的行为和socket接口,以提供更好的性能。基于共享内存的网络通信在谈跨主机通信之前,我们先关注单机维度。如何在单机维度实现IPC?以下是几种常见的IPC方式:不出所料,共享内存是最快的IPC方式,但它在OS层面缺乏统一的实现和接口,大多在语言库中提供。这里我们在单机维度分解一下共享内存IPC过程:发送方写入一个预分配的内存区域;通知对端,更新新写入内存的偏移量;接收方根据最新更新的偏移数据进行读取;接收器更新偏移量以读取内存。如果有一种技术可以在两台机器之间“传输”内存,那么我们就可以将这种高性能的IPC解决方案从单机扩展到不同主机。显然,RemoteDirectMemoryAccessRDMA可以帮助我们高效地移动内存。与单机共享内存通信过程相比,基于RDMA的过程:发送方写入机器预先分配的内存区域;通过RDMA将内存写入peer维护的内存区域中的相同位置;通过RDMA通知接收方,接收方更新新写入内存的偏移量;接收方根据最新更新的偏移量读取数据;接收方通过RDMA更新读取内存的偏移量。基于RDMA共享内存模型,SMC-R应运而生,SMC-R的缩写是SharedMemoryCommunicationoverRDMA。让我们看看SMC-R如何加速TCP应用程序。SMC-R是一种混合协议,通过TCP实现连接建立过程中的信息交互,通过RDMA网络实现数据通路上的高性能数据传输。同时,一旦RDMA链路建立连接失败,可以回退到TCP,实现TCP的能力。此外,借助多个RNIC,SMC-R可以实现运行时故障迁移,保证运行时可靠性。RDMA本身提供了一个动词接口供应用程序使用。基于共享内存模型,SMC-R提供了一套完全兼容TCP套接字的内核接口。通过LD_PRELOAD等基于eBPF规则替换的方法,可以透明地将TCPsockets替换为SMC。socket,从而实现透明替换和加速。基于SMC-R的透明替换,我们测试了几个应用场景,其中Redis的性能提升高达57%。此时Redis无需任何修改即可享受SMC-R带来的性能加速。使用SMC-R加速应用透明替换,加速TCP应用,可以采用以下三种方案:使用LD_PRELOAD方法,该方法的原理是将动态链接二进制文件中socket创建的SOCK_STREAM协议替换为AF_SMC协议,这样就可以透明的把TCP替换成SMC协议;通过netnamespace级别的sysctl,可以替换networknamespace(容器等)纬度内的所有TCP连接;通过eBPF规则(如五元组、进程ID等),动态匹配需要替换的连接。SMC-R在DragonLizard社区中,我们也在不断增强和优化SMC,包括性能、使用场景、稳定性和透明替换。在参与DragonLizard社区贡献的六个月时间里,一共为Linux上游社区贡献了60+个补丁。本次分享只是一个介绍。后续更多精彩技术分享,请持续关注龙蜥公众号,以免迷路。欢迎大家在龙蜥社区交流分享。相关信息可从以下链接获取。相关链接地址:1.代码仓库:hpn-cloud-kernel2.高性能网络SIG地址:https://openanolis.cn/sig/hig...原文链接本文为阿里云原创内容,及未经许可不得转载。
