基于dpdk的用户态协议栈f-stack实现分析

本文来源:http://chinaunix.net/uid-28541347-id-5785780.html


f-stack是腾讯基于dpdk开发的一套用户态协议栈,目前已经开源,相关介绍可以看这里:https://cloud.tencent.com/developer/article/1005179。 开源代码在这里:https://github.com/F-Stack/f-stack.git 。

项目背景

F-Stack 这个项目起始于DNSPod的授权DNS项目,当时是12年,DPDK还未开源的时候,腾讯就基于DPDK做了授权DNS,做完的时候正好DPDK也开源了,正式上线后10GE单网卡性能达到1100万qps,后面又实现了一个简易的TCP协议栈用于支持TCP DNS。后来DNSPod合并进入腾讯云,腾讯云有大量业务需要高性能的接入服务,所以就在原来授权DNS的TCP协议栈基础上实现了较为完整的TCP/IP协议栈(参考了mTCP,SeaStar,lwIP等),加上了协程框架,并且上层兼容了腾讯SNG的服务端框架SPP,使得腾讯云原有的业务可以无缝迁入,但是经过近一年的线上使用运行,腾讯发现,线上的网络环境各式各样,这个TCP/IP协议栈并不能满足全部需求(各种tunnel等),而自己去实现各种协议既费力又不讨好,所以经过一段时间的调研,决定移植FreeBSD的协议栈。

整体介绍

这里不再对这个协议栈的特点和介绍展开,网上都有,其实就是dpdk的一些特点,另一点就是对现有posix编程接口比较友好吧,提供了线程和epoll等接口,方便应用的移植。这里主要是对f-stack的实现框架转发路径做一个简单分析。

f-stack没有使用自己开发的协议栈,据说早期使用的是基于mTCP的自研协议栈,但后来因为兼容性,在公有云环境使用会有诸多问题。如果比较笼统的说,f-stack可以等价于dpdk+freebsd协议栈。F-stack自己的关键工作就是将两者结合起来,入方向将流量从dpdk导入freebsd协议栈,出方向由freebsd协议栈导入dpdk。当然freebsd协议栈也是做了少量改动的,比如:

1) 调度:对 FreeBSD Network Stack 的内核线程、中断线程、定时器线程、sched、sleep 等进行了去除。

2) 锁:对 FreeBSD Network Stack 的锁操作进行了去除,包括 mtx、rw、rm、sx、cond 等。

3) 内存相关:phymem、uma_page_slab_hash、uma、kmem_malloc、malloc 等实现。

4) 全局变量:pcpu、curthread、proc0、thread0 等初始化。

5) 环境变量:setenv、getenv 实现

6) SYS_INIT:mi_startup。

7) 时钟:timecounter、ticks、hz、定时器等实现。

8) 其他:Linux 和 FreeBSD 的 errno 转换、胶水代码、移除了不需要的功能模块等。

但这些改动涉及的代码非常少,据说只有几百行,所以非常方便将最新的freebsd代码更新过来,便于维护。这样的设计的优势就是一方面可以高效的利用dpdk框架的高性能转发,另一方面不至于陷入协议栈的复杂开发当中。

下面简单的看一下f-stack的代码结构:

## Structure of F-Stack code

    ├── app  -- Nginx(1.11.10)/Redis(3.2.8)/Microthread framework  (适配f-stack的Nginx和Redis)

    ├── config.ini  (f-stack的配置文件)

    ├── doc      (f-stack的一些说明文档)

    ├── dpdk -- Intel DPDK(16.07) directory   (放置dpdk代码)

    ├── example – DEMO                 (使用f-stack的例子)

    ├── freebsd -- FreeBSD(11.0) Network Stack directory  (freebsd协议栈代码)

    ├── lib -- F-Stack lib directory        (f-stack自身的代码)

    ├── mk
   └── start.sh

初始化分析

我们直接先看一下f-stack提供的demo的main函数,有一个宏观认识。

代码非常简单,和正常的socket编程一样调用socket,bind,listen等接口,可以看到f-stack其提供的ff_socket,ff_bind,ff_listen和posix接口是完全兼容的。其他关键的区别就是最开始的ff_init(argc, argv)调用,这个主意是为了f-stack框架的启动初始化,下面会分析,另一个就是ff_run(loop, NULL),熟悉dpdk的人应该能猜到,这就是启动主循环开始网卡的收发逻辑。

下面一张图看一下ff_init的主要初始化逻辑。

其中最关键的就是ff_dpdk_if_up,这个函数为每个dpdk接管的port创建一个struct ifnet结构,并将这个结构注册到freebsd中,其中调用的ether_ifattach就是freebsd的接口,这个结构可以理解为网卡对应的虚拟设备,这个设备也是dpdk和freebsd关联的核心。Ifnet有很多handle函数,会被做如下初始化:

    ifp->if_start = ff_veth_start;
    ifp->if_transmit = ff_veth_transmit;
   ifp->if_qflush = ff_veth_qflush;
   ifp->if_output = ether_output;
   ifp->if_input = ether_input;
……

其中核心是if_input,if_output和if_transmit三个函数,if_input就是ifnet的收包函数,可以理解为协议栈的入口函数,有些类似于kernel协议栈的netif_receive_skb函数;但是把if_output比喻成协议栈的出口函数就有点不恰当了,因为启动还有bridge的转发逻辑,其中(ether_output)调用的ifp->if_transmit可以理解为真正的协议栈出口函数,类似于kernel的dev_queue_xmit。

转发流程分析

    转发流程以ff_run开始的main_loop开始,我们以tcp收到syn+ack及回复流程为例,分析这个转发过程(syn+ack处理不会上送app,由协议栈完成),直接上图,流程如下:

(END)

Linux阅码场原创精华文章汇总

更多精彩,尽在"Linux阅码场",扫描下方二维码关注

转发和在看是最大的支持~

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 腾讯的开源协议栈f-stack.pdf是在DPDK技术峰会上推出的一项重要技术创新。DPDK技术峰会是一个技术交流平台,旨在推动数据平面开发工具包(DPDK)技术的发展和应用。f-stack.pdf是腾讯开源的一套协议栈,它通过与DPDK集成,提供了高性能的网络数据包处理能力。 f-stack.pdf具有以下几个特点:高性能、轻量级和易使用。它基于零拷贝技术,能够以卓越的性能处理数据包。同时,f-stack.pdf采用了轻量级设计,只依赖于DPDK的核心功能,避免了不必要的复杂性,使得使用起来更加简单和灵活。 f-stack.pdf在应用层提供了一系列网络协议的支持,例如TCP、UDP和IP等。它提供了高度可扩展和定制化的接口,使得开发者可以根据具体需求进行定制和优化。另外,f-stack.pdf还提供了丰富的功能和工具,方便开发者进行网络应用的开发和调试。 该协议栈不仅适用于云服务器、网络设备和高速存储等领域,还可以广泛应用于物联网、5G通信和金融等行业。它的高性能和低延迟使得在大规模并发场景下的数据处理更加高效和稳定。 腾讯的开源协议栈f-stack.pdf在DPDK技术峰会上的推出,标志着中国企业在高性能网络技术领域的一次重要突破。它的出现将有助于促进我国网络技术的创新和发展,并提升我国在全球高性能网络领域的竞争力。 ### 回答2: 腾讯的开源协议栈f-stackDPDK技术峰会上推出的一项重要的技术成果。该技术是基于DPDK(Data Plane Development Kit)开发的一套网络数据包处理框架,旨在提供高性能的网络数据包处理和协议栈功能。 f-stack的特点可以从以下几个方面来描述。首先,它采用了用户的网络协议栈设计,将协议处理功能从内核迁移到用户,避免了内核用户的频繁切换,提高了数据包处理的效率。其次,f-stack提供了一套完整的网络协议栈功能,包括TCP/IP协议栈、套接字接口、事件驱动机制等,可以支持常见的网络应用开发。此外,f-stack还提供了网络收发模块、队列管理、内存池等高性能的数据结构和算法,以进一步提升数据包处理的吞吐量和延迟。 通过使用f-stack,开发者可以轻松地构建高性能的网络应用,无论是在云计算、大数据分析还是边缘计算等场景中,都能够获得更好的性能和响应速度。与传统的网络协议栈相比,f-stack具有更低的延迟、更高的吞吐量和更好的可扩展性,能够更好地满足现代网络应用对于高性能数据处理的需求。 最后,开源协议栈f-stack的推出也体现了腾讯在网络技术领域的创新能力和开放合作的精神。通过开源的方式,腾讯可以与其他行业的开发者和研究机构共同探索和推进网络技术的发展,形成合力并推动整个行业的进步。 总的来说,腾讯的开源协议栈f-stackDPDK技术峰会上的推出,为高性能网络数据包处理和协议栈开发提供了一个有力的工具和平台,对于促进网络技术的创新和发展具有重要意义。 ### 回答3: 腾讯的开源协议栈f-stack.pdf是关于dpdk技术峰会的一个重要文档。DPDK技术峰会是一个旨在促进DPDK技术发展和交流的会议,汇集了众多DPDK技术领域的专家和爱好者。 在f-stack.pdf中,腾讯团队分享了他们开发的开源协议栈f-stack的技术细节和应用场景。f-stack是一个高性能、可扩展的协议栈,基于DPDK技术开发,旨在提供更好的网络性能和更高的数据包处理能力。 f-stack的设计目标主要包括:轻量级、高性能、可扩展和易用性。它采用了一系列的优化技术,如零拷贝、多队列和事件驱动等,以提高数据包的处理效率。f-stack支持多种协议,如TCP、UDP和IP等,可以满足不同应用场景的需求。 此外,f-stack还提供了一些额外的功能,如高效的内存管理、负载均衡和安全性等。这些功能使得f-stack在网络应用程序的开发中更加方便和灵活。 f-stack已经在腾讯内部得到广泛的应用和验证,取得了良好的性能和稳定性。它已经成为了腾讯云和腾讯游戏等业务的核心组件。 总的来说,f-stack的出现充分展示了腾讯在DPDK技术领域的创新能力和技术实力。它为广大开发者提供了一个高效、可扩展的协议栈解决方案,有助于进一步推动DPDK技术的应用和发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值