学习
实践
活动
专区
工具
TVP
写文章
专栏首页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 讨论群,欢迎联系我们拉您加入。

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

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

登录 后参与评论
0 条评论

相关文章

  • 全用户态网络开发套件 F-Stack 架构分析

    本文介绍 F-Stack 的详细架构及如何解决了内核协议栈面临的问题。

    F-Stack
  • 全用户态网络开发套件F-Stack架构分析

    F-Stack是一个全用户态(kernel bypass)的高性能的网络接入开发包,基于DPDK、FreeBSD协议栈、微线程接口等,适用于各种需要网络接入的业...

    F-Stack
  • F-Stack 助力 HTTP 网络服务器性能提升

    HTTP 协议因其易用性和普适性得到了大规模的普及,我们说HTTP协议是互联网的基石一点也不为过,当前提供HTTP服务的Server性能要求越来越高,如...

    F-Stack
  • HTTP 服务使用 F-Stack 在不同业务场景下的性能表现

    近年来网卡性能快速发展,给高性能HTTP服务提供了硬件支持,但是linux 内核却越来越成为高性能网络服务器的瓶颈。

    F-Stack
  • 千万并发连接下,如何保障网络性能?

    过去几十年互联网呈爆发式的增长,内容的丰富以及层出不穷的DDoS攻击等,对网络性能提出了极大的挑战,也同样促进了网络基础设施的快速发展。运营商的带宽越来越大,C...

    腾小云
  • 千万并发连接下,如何保障网络性能

    过去几十年互联网呈爆发式的增长,内容的丰富以及层出不穷的DDoS攻击等,对网络性能提出了极大的挑战,也同样促进了网络基础设施的快速发展。运营商的带宽越来越大,C...

    姜凤波
  • 千万并发连接下,如何保障网络性能

    过去几十年互联网呈爆发式的增长,内容的丰富以及层出不穷的DDoS攻击等,对网络性能提出了极大的挑战,也同样促进了网络基础设施的快速发展。运营商的带宽越来越大,C...

    腾讯云荐官
  • 如何在腾讯云主机上快速部署 F-Stack HTTP 服务

    F-Stack是一个全用户态的高性能的网络接入开发包,本文介绍如何在腾讯云主机上使用F-Stack快速部署HTTP服务器。

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

    Q1:如果在一个阻塞型的socket上执行recv,会不会把相应的线程卡死,调用recv时该socket中没有数据包,导致sleep,sleep导致该线程没办法...

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

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

    F-Stack
  • F-Stack KNI 配置注意事项

    KNI(Kernel NIC Interface)内核网卡接口,是DPDK中用于与内核通信的模块。本文介绍对其进行配置时的一些注意事项。

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

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

    F-Stack
  • F-Stack与Seastar对比

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

    F-Stack
  • F-Stack KNI配置注意事项

    F-Stack KNI配置注意事项 KNI介绍 KNI(Kernel NIC Interface)内核网卡接口,是DPDK中用于与内核通信的模块,在主要的业务流...

    F-Stack
  • 腾讯云DNSPod独家优势---乘风破浪做产品

    腾讯云 DNSPod 向全网域名提供智能解析服务,拥有海量数据处理能力、灵活扩展性和安全能力。为客户提供从基础的域名解析、Private DNS、IGTM智能流...

    腾讯云DNSPod团队
  • 如何对比 F-Stack 与 Seastar 这两个网络编程框架?

    F-Stack和Seastar都是基本完整的网络编程框架,包含了DPDK网络I/O模块、用户态协议栈、异步编程接口等整个系统共用户接入使用。

    F-Stack
  • 深入理解高并发服务器性能优化

    我们现在已经搞定了 C10K并发连接问题 ,升级一下,如何支持千万级的并发连接?你可能说,这不可能。你说错了,现在的系统可以支持千万级的并发连接,只不过所使用的...

    kunge
  • 深入理解高并发服务器性能优化

    我们现在已经搞定了 C10K并发连接问题 ,升级一下,如何支持千万级的并发连接?你可能说,这不可能。你说错了,现在的系统可以支持千万级的并发连接,只不过所使用的...

    CPP开发前沿

扫码关注腾讯云开发者

领取腾讯云代金券