专栏首页F-Stack的专栏F-Stack 全用户态 (Kernel Bypass) 服务开发套件
原创

F-Stack 全用户态 (Kernel Bypass) 服务开发套件

F-Stack 开发背景

随着网卡性能的飞速发展,10GE 网卡已经大规模普及,25GE/40GE/100GE 网卡也在逐步推广,linux 内核在网络数据包处理上的瓶颈也越发明显,在传统的内核协议栈中,网卡通过硬件中断通知协议栈有新的数据包到达,内核的网卡驱动程序负责处理这个硬件中断,将数据包从网卡队列拷贝到内核开辟的缓冲区中(DMA),然后数据包经过一系列的协议处理流程,最后送到用户程序指定的缓冲区中。在这个过程中中断处理、内存拷贝、系统调用(锁、软中断、上下文切换)等严重影响了网络数据包的处理能力。操作系统的对应用程序和数据包处理的调度可能跨 CPU 调度,局部性失效进一步影响网络性能。

而互联网的快速发展亟需高性能的网络处理能力,kernel bypass 方案也越来被人所接受,市场上也出现了多种类似技术,如 DPDK、NETMAP、PF_RING 等,其核心思想就是内核只用来处理控制流,所有数据流相关操作都在用户态进行处理,从而规避内核的包拷贝、线程调度、系统调用、中断等性能瓶颈,并辅以各种性能调优手段,从而达到更高的性能。其中 DPDK 因为更彻底的脱离内核调度以及活跃的社区支持从而得到了更广泛的使用。

F-Stack 开发框架

F-Stack 是一款兼顾高性能、易用性和通用性的网络开发框架,传统上 DPDK 大多用于 SDN、NFV、DNS 等简单的应用场景下,对于复杂的 TCP 协议栈上的七层应用很少,市面上已出现了部分用户态协议栈,如 mTCP、Mirage、lwIP、NUSE 等,也有用户态的编程框架,如 SeaStar 等,但统一的特点是应用程序接入门槛较高,不易于使用。

F-Stack 使用纯 C 实现,充当胶水粘合了 DPDK、FreeBSD 用户态协议栈、Posix API、微线程框架和上层应用(Nginx、Redis),使绝大部分的网络应用可以通过直接修改配置或替换系统的网络接口即可接入 F-Stack,从而获得更高的网络性能。

发展历程

  • 2012 DNSPod 调研下一代 DNS 方案应对日益严重的 DDoS 攻击
  • 2013 上线 DPDK+UDP 版本权威 DNS 解析程序 DKDNS,单机 10GE 网卡性能达到 1100 万 QPS
  • 2014 实现用户态简易 TCP/IP 协议栈,支持 TCP DNS,性能达到 60 万+TPS
  • 2015 上线 DPDK+TCP/IP+通用网关应用
  • 2016 完善协议栈和应用层接口的开发框架 FlashStack,在腾讯云对象存储,HttpDNS 等业务中上线
  • 2017 移植 FreeBSD 协议栈替换自研协议栈的全新 F-Stack 开源。

F-Stack 架构

F-Stack 总体架构如上图所示,具有以下特点:

  • 使用多进程无共享架构。
  • 各进程绑定独立的网卡队列和 CPU,请求通过设置网卡 RSS 散落到各进程进行处理。
  • 各进程拥有独立的协议栈、PCB 表等资源。
  • 每个 NUMA 节点使用独立的内存池。
  • 进程间通信通过无锁环形队列(rte_ring)进行。
  • 使用 DPDK 作为网络 I/O 模块,将数据包从网卡直接接收到用户态。
  • 移植 FreeBSD Release 11.0.1 协议栈到用户态并与 DPDK 对接。

FreeBSD 协议栈

原本 F-Stack 使用自己开发的 TCP/IP 协议栈,但是随着腾讯云各种复杂业务的接入,原有协议栈已越来越不能满足需求,继续研发并维护一个完整的协议栈将耗费大量的精力,所以决定使用开源的协议栈来代替原有协议栈。在调研了多种协议栈之后,考虑到协议栈的稳定性、完整性、社区活跃性、生态完善程度等因素,最终决定将 FreeBSD 协议栈移植到用户态,提供了完整的协议栈功能并可以快速跟进社区对协议栈的改进。

主要修改:

  • 调度:对 FreeBSD Network Stack 的内核线程、中断线程、定时器线程、sched、sleep 等进行了去除。
  • 锁:对 FreeBSD Network Stack 的锁操作进行了去除,包括 mtx、rw、rm、sx、cond 等。
  • 内存相关:phymem、uma_page_slab_hash、uma、kmem_malloc、malloc 等实现。
  • 全局变量:pcpu、curthread、proc0、thread0 等初始化。
  • 环境变量:setenv、getenv 实现。
  • SYS_INIT:mi_startup。
  • 时钟:timecounter、ticks、hz、定时器等实现。
  • 其他:Linux 和 FreeBSD 的 errno 转换、胶水代码、移除了不需要的功能模块等。

典型 HTTP 场景性能测试

以下分别为使用 F-Stack 中的 Nginx 在 40GE 网卡下测试 HTTP 短连接和长连接小包(body 大小为 600 字节)的性能表现,实际带宽性能会随着 body 的增加而增加,并可达到网卡线速。

下图中的 Nginx 和 Nginx-si 都是原生 Nginx,Nginx-si 表示网卡队列中断到不同 CPU,另外的是采用系统默认配置,未将网卡队列中断到不同 CPU。

更多场景下的 HTTP 性能测试数据请关注后续文章。

F-Stack 交流

  • GITHUB, 欢迎业务使用、 或者加入开发、 顺便 star 一下我们的项目,有任何问题可以提 ISSUSES 联系我们。
  • 官方网站,官网资源持续完善中,如果您的项目使用了 F-Stack,也希望通知我们,让我们加入到应用列表中。
  • 微信公众号:搜索公众号FStack关注,会不定期发布 F-Stack 的技术细节、使用技巧和应用场景等文章,同时欢迎投稿。
  • 微信讨论群:我们建立了 F-Stack 讨论群,欢迎联系我们拉您加入。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • F-Stack Q&A 第二期

    Q1:请问再视频领域,媒体服务器,使用F-Stack是否合适? A1:F-Stack在纯推流的模式上是支持且合适的,如果有转码服务等计算密集型服务,需要等我们支...

    F-Stack
  • F-Stack参加 DPDK中国技术峰会2017

    由 DPDK社区和英特尔主办的 DPDK中国技术峰会2017 于6月27日在上海举行,Intel、腾讯云、中兴、美团云、Panabit、太一星辰、Uni...

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

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

    F-Stack
  • F-Stack参加 DPDK中国技术峰会2017

    由 DPDK社区和英特尔主办的 DPDK中国技术峰会2017 于6月27日在上海举行,Intel、腾讯云、中兴、美团云、Panabit、太一星辰、Uni...

    F-Stack
  • MQL5从入门到精通【第三章】操作符

    需要特别留意的是上方加法中,整型和double型相加,结果为double型。乘法的方式也是一样的。这个就是隐式数据转换。

    程序员小助手
  • HTML|网页背景

    我们往往在网页中会加一些背景颜色和背景图像让网页美观,吸引浏览者的眼球。那么我们如何加入背景,有些什么标签?有哪些注意事项呢?

    算法与编程之美
  • 文娱大数据:这只猴子今年特别火!

    <数据猿导读> 已近年尾,2015年的文娱大数据也随之新鲜出炉,回首这一年,我国电影行业可谓喜忧参半,多部影片屡屡刷新票房纪录,只可惜有些影片却是口碑欠佳。要问...

    数据猿
  • 规模较小的云计算提供商如何与行业巨头竞争?

    为了与AWS公司竞争,其他主要的云计算供应商依靠他们自己的专业知识脱颖而出:谷歌公司推出其分析和认知工具,而微软公司则专注于其工作空间。但是,随着超大规模云计算...

    静一
  • 开源软件许可

    因为日常工作中用到了,一些开源的产品,每个产品说明中,会有一些开源许可的介绍,各种名字,不很理解其中的含义。

    bisal
  • Android引入自定义的布局

    在我写第一个安卓程序的时候,因为所有的Activity的布局都是单独写的xml,程序的风格背景基本都是一样的,如果要改背景图片则改动量非常大,所以就在想有没有自...

    Vaccae

扫码关注云+社区

领取腾讯云代金券