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

相关文章

来自专栏屈定‘s Blog

OpenVZ的VPS加速指南

OpenVZ架构的VPS加速选择比较少,不然KVM方便,除去双边加速比如FinalSpeed等软件后可用选择并不多,其中比较好的方案是Google BBR加速,...

3264
来自专栏技术博文

Linux(Ubuntu) 下 SecureCRT 7 30天循环破解

SecureCRT推出Linux的版本也是让我们兴奋不已, 它也是使用中最好用的远程连接工具, 不过因为商业性质出现破解版本的SecureCRT, 因为程序的特...

4228
来自专栏二进制文集

思维导图学Linux

使用思维导图 Mindjet MindManager 制作的《鸟哥的Linux私房菜基础篇-第三版》学习笔记。

623
来自专栏WeTest质量开放平台团队的专栏

面向亿万级用户的QQ一般做什么?——兴趣部落的 Web 同构直出分享

本文的目的在于解决两个问题:1、 部落是怎样从一个纯前端项目改造成同构直出项目的。2、在访问量这么大的情况下,如何保证直出服务的可用性的问题。

3180
来自专栏葡萄城控件技术团队

.NET 新标准介绍

本文介绍如何使用 .NET 标准,更容易地实现向 .NET Core 迁移。文中会讨论计划包含的 APIs,跨构架兼容性如何工作以及这对 .NET Core 意...

1818
来自专栏冰霜之地

Vue 全家桶 + Electron 开发的一个跨三端的应用

我是一名全职的 iOS 开发者,非前端开发者。由于接触了 Weex 开发,从而接触到了 Vue.js。

1887
来自专栏腾讯开源的专栏

重磅!腾讯与科大讯飞技术共创,Google ProtoBuf进入TARS家族!

引言:TARS框架及自有TARS协议在腾讯内部始于2007年。Google Protocol Buffers于2008年7月对外公布。随着微服务架构的发展及Pr...

3607
来自专栏PHP在线

大话-高并发

简单理解下高并发: 高并发是指在同一个时间点,有很多用户同时的访问URL地址,比如:淘宝的双11,双12,就会产生高并发,如贴吧的爆吧,就是恶意的高并发请求, ...

2924
来自专栏向治洪

react-native-android之初次相识

作为一名Android开发者,我的感觉就是,一步一卡,卡的潇洒。 但是我还是要学react-native,不要问我为什么,因为我相信一门解决了原生app,开...

1746
来自专栏FreeBuf

构建一个小巧的来电显示迷惑工具

但幸运的是,在正式任务开始之前我大约拥有两周的时间,让我去学习了解有关的技术知识。经过两周左右的折腾,我学到了许多关于调制解调器的安全测试技术,以及电话和Ast...

1040

扫码关注云+社区