专栏首页F-Stack的专栏如何对比 F-Stack 与 Seastar 这两个网络编程框架?
原创

如何对比 F-Stack 与 Seastar 这两个网络编程框架?

5月13号知乎网友的提问 《如何评价腾讯开源的基于 DPDK 和 BSD 协议栈的网络框架 f-stack?》,我们将讨论内容和我们的一些想法进行了整理。

项目背景

F-Stack 这个项目起始于DNSPod的授权DNS项目,当时是12年,DPDK还未开源的时候,我们就基于DPDK做了授权DNS,做完的时候正好DPDK也开源了,正式上线后10GE单网卡性能达到1100万qps,后面又实现了一个简易的TCP协议栈用于支持TCP DNS。

后来DNSPod合并进入腾讯云,腾讯云有大量业务需要高性能的接入服务,而DPDK虽然更适用于SDN/NFV/DNS等简单业务场景,但是否能够对这些7层的业务一样有性能提升效果呢。我们在原来授权DNS的TCP协议栈基础上实现了较为完整的TCP/IP协议栈(参考了mTCP,Seastar,lwIP等),进行了业务性能测试,除了大并发短连接(CPS)性能呈数十倍的提升外,其他常规网络指标(如并发连接数、带宽等)的性能也有比较大的提升。

后续在协议栈之上增加了协程框架,并且上层兼容了腾讯SNG的服务端框架SPP,使得腾讯云原有的业务可以无缝迁入来提升性能,兼顾了高性能、易用和通用性。但是经过近一年的线上使用运行,我们发现,线上的网络环境各式各样,这个TCP/IP协议栈并不能满足全部需求(各种tunnel、网络调试等),而自己去实现各种协议既费力又不讨好,不如借助社区的力量,所以开始对开源协议栈进行了调研。

对于用户态协议栈来说,开源实现很多,有自研的、有Linux和FreeBSD的用户态移植的,经过初步的筛选留下了Seastar和FreeBSD。其实一开始我们是倾向于选择Seastar的,因为其除了协议栈之外,尚有比较先进的编程理念和接口,只是上手门槛较高,但上手后使用体验还是很好的。但是在实际的测试使用中,我们也发现了Seastar的Native协议栈的很多不足之处,如无法处理大包、无法在外网正常运行等,我们尝试修复部分问题并提交patch后意识到这是又回到了原来的老路上了,最终决定放弃。

最后我们将FreeBSD协议栈移植到了Linux用户态,好处主要有

  1. 协议栈功能完善,且有大量工具可以对网络进行调试分析,如sysctl、ifconfig、netstat、netgraph、IPfw、pf等
  2. 可以跟进社区的改进,无需自己开发维护
  3. 相比Linux的协议栈实现复杂,FreeBSD的代码更清晰易懂;Linux遵循GPL协议开源,可能会限制部分用户的使用。

与Seastar的对比

相同

F-Stack和Seastar都是基本完整的网络编程框架,包含了DPDK网络I/O模块、用户态协议栈、异步编程接口等整个系统共用户接入使用。

  1. L7应用性能实测差不多,在小包业务上对比L2/L3都会有较大的性能损耗。
  2. 都提供了协程接口,可以实现用户同步编程,异步执行,用户只需关心自己的业务逻辑而不用处理复杂的异步逻辑。

不同

F-Stack相当于用胶水粘合了DPDK,FreeBSD协议栈,POSIX API,异步编程接口,上层应用等组成的系统,而Seastar则是新开发的系统,主要有以下区别。

  1. F-Stack使用纯C开发(部分第三方组件使用了C++,F-Stack进行了封装),容易上手;Seastar使用了C++14,Future-Promise, Shared-nothing,message-passing等比较现代和先进的特性,上手门槛较高,但上手后使用体验不错。
  2. F-Stack提供了POSIX接口,基本兼容系统API(socket/epoll/kqueue等),现有程序可以做到简单改动即可接入,如果使用了Nginx的话就更方便了,直接配置使用即可得到性能提升。使用Seastar,必须要使用Seastar的接口重新开发。
  3. F-Stack的协议栈移植自FreeBSD 11.0,功能完善但也冗余(去除了部分模块未编译进F-Stack),调试分析工具完善,运行稳定;Seastar按照RFC协议自研协议栈,更精简,但外网运行不稳定。
  4. Seastar有自己的内存管理系统(类似tcmalloc),并且如果在启动时开启了hugepages参数并制定使用的hugepage路径后可以使用巨页并实现收发包的零拷贝;F-Stack目前没有自己的内存管理系统,并未完全使用巨页,尚有内存拷贝,后续增加内存管理系统进行优化。
  5. Seastar提供了用户态IO调度器,有异步磁盘I/O相关接口,F-Stack目前尚未对磁盘IO进行相关优化,但后续会集成SPDK来优化存储服务。

其他问题

Q:API能否做成完全兼容?
A:有考虑完全兼容的方案,如LD_PRELOAD等,但还需有细节需要考虑和测试,最终肯定会提供完全兼容的API。

Q:Seastar的Native协议栈在外网运行有什么问题?
A:SeaStar作为ScyllaDB的子项目,其实用场景主要是内网数据库,并未对外网环境进行测试。我们的测试业务在外网上进行测试时,在传输较大文件或大并发小文件请求时,必现协议栈挂死完全无法访问的问题,外在表现是滑动窗口降为0。当然在外网运行时可以使用POSIX协议栈,不能享受DPDK的高性能收发包,但可以体验其现代编程模式和接口。

Q:是否可以列出剪裁的FreeBSD协议栈功能列表?
A:我们会进行整理并列出来。

Q:单核性能提升有多少
A:目前版本的F-Stack单核性能比内核协议栈高20-50%左右,多核优势更明显,后续会持续进

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • F-Stack与Seastar对比

    本文是将知乎网友的提问 《如何评价腾讯开源的基于 DPDK 和 BSD 协议栈的网络框架 f-stack?》,将回答讨论内容和我们的一些想法进行了整理。 项目背...

    F-Stack
  • HTTP 服务使用 F-Stack 在不同业务场景下的性能表现

    近年来网卡性能快速发展,给高性能HTTP服务提供了硬件支持,但是linux 内核却越来越成为高性能网络服务器的瓶颈。

    F-Stack
  • F-Stack Q&A 第一期

    Q1:F-Stack有中断模式吗,有计划支持吗?在计算密集型的应用中,轮询模式会占用更多的CPU资源? A1:F-Stack暂时只支持轮询模式,后续会支持中断+...

    F-Stack
  • F-Stack与Seastar对比

    本文是将知乎网友的提问 《如何评价腾讯开源的基于 DPDK 和 BSD 协议栈的网络框架 f-stack?》,将回答讨论内容和我们的一些想法进行了整理。 项目背...

    F-Stack
  • 史上最全的网络端口号大全

    L宝宝聊IT
  • 物联网通信协议介绍

    为了方便,将物联网通信协议分为两大类,一类是接入协议,一类是通讯协议。接入协议一般负责子网内设备间的组网及通信;通讯协议主要是运行在传统互联网TCP/IP协议之...

    刘盼
  • 区块链的新概念“胖协议”

    最近得到一个新概念,胖协议(Fat Protocols)。(胖协议可以理解为基础链) 胖协议的概念来自于Fat Protocols,翻译版见文章末尾。 从这个...

    李海彬
  • 相关推荐之反浩克装甲

    本文介绍了 SNG 数据中心立身 QQ 大数据构建的神盾推荐系统中,基于热传导模型的相关推荐模块。

    腾讯QQ大数据
  • 基于协同过滤(CF)算法的推荐系统

             随着计算机领域技术的高速发展,电子商务时代的普及,个性化的推荐系统深入生活应用的各个方面。个性化推荐算法是推荐系统中最核心的技术,在很大程度上...

    Flaneur
  • 基于物品的协同过滤算法:理论说明,代码实现及应用

    0.一些碎碎念 从4月中旬开始,被导师赶到北京的郊区搬砖去了,根本就没有时间学习看书,这个时候才知道之前的生活是多么的幸福:每天看自己想看的书,然后实践一下,最...

    小莹莹

扫码关注云+社区

领取腾讯云代金券