专栏首页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架构分析

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    F-Stack
  • Windows提权的几种常用姿势

    当获取主机权限时,我们总是希望可以将普通用户提升为管理员用户,以便获得高权限完全控制目标主机。Windows常用的提权方式有:内核提权、数据库提权、系统配置错误...

    Bypass
  • Linux 5.1内核AIO 的新归宿:io_uring

    SmartX是中国领先的超融合产品与企业云解决方案提供商,拥有国内最顶尖的分布式存储和超融合架构研发团队,在分布式存储、虚拟化计算、微服务、容器、前端开...

    Linux阅码场
  • 史上最强内网渗透知识点总结

    文章内容没谈 snmp 利用,可以去乌云等社区获取,没有后续内网持久化,日志处理等内容。

    信安之路
  • Netgear R6400 upnp栈溢出漏洞分析

    Netgear R6400 多个固件版本中的upnpd存在栈溢出漏洞(CVE-2020-9373),通过向其udp 1900端口发送构造的ssdp数据包,可能导...

    FB客服
  • Laravel源码解析之中间件

    中间件(Middleware)在Laravel中起着过滤进入应用的HTTP请求对象(Request)和完善离开应用的HTTP响应对象(Reponse)的作用, ...

    KevinYan
  • F-Stack Q&A 第三期

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

    F-Stack
  • 渗透测试常规操作记录(下)

    天钧
  • Windows 权限提升

    本篇内容是内网安全攻防:渗透测试实战指南时的阅读笔记,笔记大部分内容均来自此书,另外一部分来源于一些公开文档和非公开文档,参考链接中均有注明。

    重生信息安全
  • Laravel源码笔记(一)程序结构与生命周期

    说起PHP框架,就不得不提大名鼎鼎的Lavarel。作为一个“专为Web艺术家而创造”的框架,其优雅、简洁的开发体验吸引了一大批Web开发者,并成为PHP社区中...

    asterDY
  • 干货:ANR日志分析全面解析

    这句话说的很笼统,要想深入分析定位ANR,需要知道更多知识点,一般来说,ANR按产生机制,分为4类:

    2020labs小助手
  • F-Stack参加 DPDK中国技术峰会2017

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

    F-Stack

扫码关注云+社区

领取腾讯云代金券