当前位置: 首页 > > 天 方 夜 “谈” 第27期 | SocksDirect:加速并兼容数据中心sockets

天 方 夜 “谈” 第27期 | SocksDirect:加速并兼容数据中心sockets

发表于:2020-03-17 16:34 作者: 方滨兴班 阅读数(10834人)

内容来源于论文:SocksDirect: Datacenter Sockets can be Fast and Compatible

发表在ACM SIGCOMM 2019

第一作者是来自微软亚洲研究院和中国科学技术大学的Bojie Li与来自华盛顿大学的Tianyi Cui

背景

        Socket API是应用程序、容器和主机之间的标准通信原语。Linux Socket 实现的延迟和吞吐量数量比硬件的原始功能差一个数量级,现有提高Socket性能的方法有优化内核的网络协议栈、将TCP/IP协议栈移动到用户空间或者将传输卸载到RDMA网卡。但是,这些解决方案在兼容性和性能上都有局限性。他们中的大多数在父子进程、时间轮询、多个应用程序socket共享和主机内部通信等方面与本机socket不完全兼容。其中一些还存在隔离的问题,不允许多个应用程序共享一个网卡。即使在性能方面,也仍有很大的改进空间。现有的解决方案无法实现接近原始RDMA的性能,因为他们无法消除像多线程同步、缓冲区管理和内存拷贝这些重要的开销。考虑到这些限制,本文作者设计了一种用户空间的socket系统:SocksDirect,来同时实现兼容性、隔离性和高性能。

SocksDirect特点

  • 兼容性:用户使用SocksDirect时无需对应用程序进行任何更改。同时还支持主机内和主机间的通信。

  • 隔离性:SocksDirect保留了应用程序和容器之间的隔离,这意味着应用程序不能窃听或干扰其他应用程序的通信连接。并且SocksDirect会强制执行访问控制策略来禁止未经授权的连接。

  • 高性能:SocksDirect可以实现与原始RDMA和共享内存相当的高吞吐量和低延迟。吞吐量可随CPU核心数量扩展。

                         

图片.png

图1:SocksDirect体系结构。主机1和2支持RDMA,而主机3不支持RDMA。

设计与实现

       SocksDirect在用户空间实现而非内核空间。要使用SocksDirect,应用程序只需要通过设置LD_PRELOAD环境变量来加载用户空间的libsd库。libsd拦截c标准库中与文件描述符(FD)相关操作的所有Linux API。

    1.基于令牌的socket共享

每个socket队列具有一个发送令牌和一个接收令牌。每个令牌由活动线程持有,该线程具有发送或接收的权限。Socket队列在线程和进程之间共享,这使得发送者和接收者可以不上锁并发访问。当另一个线程想要发送或接收时,它就会请求接管令牌。

    2.每个socket环形缓冲区       

传统的网络协议栈使用环形缓冲区从网卡发送和接收数据包,如图2(a)所示,这会导致增加缓冲区管理开销和内部碎片化。传统网卡支持的环形缓冲区数量有限,因此多个连接可能共享一个环形缓冲区,并且网络协议栈需要将消息从中继缓冲区分散到多个socket接收缓冲区。SocksDirect消除了传统的环形缓冲区,而使用RDMA和SHM直接发送每个socket的发送缓冲区。此外,传统的发送缓冲区是以链表的方式存储,因此需要分配缓冲区,为了避免这种开销,SocksDirect将socket缓冲区组织为环形缓冲区并以背对背的方式存储消息,如图2(b)所示。

图片.png

 图2:在主机内socket的环形缓冲区的数据结构。阴影部分是数据包元数据,黑色部分是payload。

    3.零拷贝

零拷贝的主要挑战是保持socket api的语义。虚拟内存可以提供了一个间接层,许多工作都利用了这种页面重新映射技术。Linux零拷贝socket仅通过将数据页面设置为copy-on-write来支持发送方。然而,许多应用程序经常覆盖发送缓冲区,因此copy-on-write机制只是将复制从发送时间延迟到第一次覆盖时间。为了支持零拷贝,SocksDirect添加了一个内核模块来公开与页面重映射有关的几个内核功能。为了摊销页面重映射成本,仅使用零拷贝进行发送或接收,且payload大小至少为16KiB。

图片.png

图3:主机内使用SHM时。①获取物理页面并设置 copy-on-write;②通过SHM发送页面地址;③映射收到的页面;④(可选)当发送方执行write/memcpy/recv时重映射

图片.png

图4:主机间使用RDMA时。①获取物理页面并设置copy-on-write;②从池中获取可用页面;③通过RDMA发送数据;④通过RDMA发送页面地址;⑤映射收到的页面;⑥返回未映射的页面。

总结

SocksDirect是Linux下的高性能用户态socket系统,它与Linux协议栈兼容并与之保持隔离,根据实验数据表明SocksDirect可以实现与原始RDMA和SHM队列相当的性能,提高了应用程序端到端的性能,并且,支持父子进程、基于令牌的连接共享、免分配的环形缓冲区以及零拷贝这些技术在socket以外的许多情况下也很实用。

关于 天 方 夜 “谈”

天方夜谈原意讲不切实际的东西,而这里想要 “脚踏实地”真正弄懂并感受一篇文章的思想。

方班人有自己的浪漫,

我们探讨知识,谈论理想,

采摘科研的繁星,

脚下是星辰大海。

天:代表我们的理想犹如天空般浩荡

方:代表方班

夜:代表代码人的冷静与静谧

谈:代表方班愿与您,就领域内的经典思想和前沿成果“秉烛夜谈”