如何对比 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 条评论
登录 后参与评论

相关文章

来自专栏IT技术精选文摘

NoSQL和数据可扩展性

介绍 本文提供了一个易于理解和有用的一组有关当前可用NoSQL数据库的信息。 可扩展数据架构 可扩展数据架构已发展用于提高整体系统效率并降低运营成本。 具体的...

4356
来自专栏chafezhou

小说python操作PLC

PLC(Programmable Logic Controller)可编程逻辑控制器,可以理解为一个微型计算机,广泛应用于工业控制中,如楼宇智控、精密机床、汽车...

1.5K2
来自专栏编程

高级运维工程师学习路线

信息安全公益宣传,信息安全知识启蒙。 ? 运维工程师在前期是一个很苦逼的工作,在这期间可能干着修电脑、掐网线、搬机器的活,显得没地位!时间也很碎片化,各种零碎...

4317
来自专栏F-Stack的专栏

F-Stack与Seastar对比

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

5139
来自专栏FreeBuf

如何在网络中追踪入侵者(三):主机追踪

在之前的文章中,我们专注于追踪和分析从网络中得到的数据。但事实上,在网络中追踪不是唯一的选项。在企业的主机和服务器上有大量的数据集来发掘未知的恶意行为,包括运行...

1989
来自专栏美团技术团队

服务容错模式

背景 随着美团点评服务框架和服务治理体系的逐步成熟,服务化已成为公司内部系统设计的趋势。本着大系统小做、职责单一的原则,我们度假技术团队对业务系统进行了不少服务...

4234
来自专栏李跃森的专栏

微信支付商户系统架构背后的故事

本文将以腾讯 PostgreSQL-XZ 为代表介绍腾讯自研 PostgreSQL 所做的优化和改进。

93.4K8
来自专栏SDNLAB

SDN中的Segment Routing

作者简介:晏志文,原就职于中兴通讯,目前供职于安徽皖通邮电股份有限公司。数通测试专家,本领域从业深耕多年,熟悉传统网络技术及行业解决方案,密切关注新兴网络,IC...

2284
来自专栏Java架构师学习

一文归纳总结分布式架构的那些事!

进入十一月,最火热的话题与期待的日子自然是双十一狂欢购物节了,作为程序员的你除了要清空自己的购物车之外,最关心的是不是双十一架构技术是如何承受亿级用户流量的冲击...

1034
来自专栏腾讯Bugly的专栏

关于移动 App H5 页面里的 JavaScript 异常捕获

自 HTML5 标准正式发布之后,其得天独厚的跨平台特性吸引了众多开发者的目光。 伴随着 HTML5 的发展,JavaScript 的重要性也在逐步增加,要说现...

5319

扫码关注云+社区

领取腾讯云代金券