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

相关文章

来自专栏跟着阿笨一起玩NET

五层拆解 网站架构

本人转载:http://www.cnblogs.com/scottckt/archive/2010/09/15/1826925.html

441
来自专栏xingoo, 一个梦想做发明家的程序员

如何构建高扩展性网站?

本篇通过阅读《高扩展性网站的50条原则》,总结出以下内容。 一方面博主没有实际的架构经验,另一方面知识面也不够宽阔,所以只能系统的总结书中的要点,并根据自己...

1935
来自专栏魏琼东

基于DotNet构件技术的企业级敏捷软件开发平台 AgileEAS.NET - 系统架构

      本文是继AgileEAS.NET应用开发平台介绍及AgileEAS.NET之敏捷并行开发方法所做的架构补充,用于阐释AgileEAS.NET平台的架...

1735
来自专栏杨建荣的学习笔记

Greenplum数据仓库迁移小记

迁移无小事,所以从开始计划将公司的Greenplum集群迁移,到最后落地,整个过程虽然说不上是波折,但是也算是有不少的故事,各种准备和协调。

1033
来自专栏IT笔记

单体转向微服务架构-基础篇

4363
来自专栏F-Stack的专栏

F-Stack与Seastar对比

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

3179
来自专栏Java架构师进阶

成为一名Java高级架构师到底需要学习哪些技术?

工作1-5年,当我们向老板提出加薪的时候,或者跳槽去“捡”offer的时候,我们底气够吗?

462
来自专栏ThoughtWorks

持续交付2.0:云原生持续交付

《持续交付》提出了一系列贯穿整个软件交付生命周期的最佳实践。但它成书的年代(2010年)云计算尚未得到广泛应用,尤其在软件开发过程中的应用非常有限。如果站在今天...

3155
来自专栏JAVA技术zhai

三流程序员与一流程序员之间的区别,看看你是属于哪一类?

源码系列 手写spring mvc框架 基于Spring JDBC手写ORM框架 实现自己的MyBatis Spring AOP实战之源码分析 Spring I...

27311
来自专栏北京马哥教育

如何构建高扩展性网站?

本篇通过阅读《高扩展性网站的50条原则》,总结出以下内容。   一方面博主没有实际的架构经验,另一方面知识面也不够宽阔,所以只能系统的总结书中的要点,并根据自...

2534

扫码关注云+社区