前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何对比 F-Stack 与 Seastar 这两个网络编程框架?

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

原创
作者头像
F-Stack
修改2017-08-31 18:06:24
8.7K0
修改2017-08-31 18:06:24
举报
文章被收录于专栏:F-Stack的专栏

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来优化存储服务。

其他问题

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

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

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

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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 项目背景
  • 与Seastar的对比
    • 相同
      • 不同
        • 其他问题
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档