关于f-stack转发框架的几点分析思考

news2024/12/27 12:13:52

使用DPDK收包,想要用到TCP协议栈,可选的方案有linux原生的tun/tap口以及DPDK自带的KNI驱动,这两种都是通过将DPDK收到的报文注入到linux内核来使用TCP协议栈的功能,然后,用户态协议栈可以考虑开源的f-stack,商用的可以使用6wind的协议栈(不过价格不菲)。

前面讲过f-stack的源码编译安装,最近研究了一下f-stack,对它的实现框架有了一些认识。f-stack使用的多进程单线程模型,收包模型如下图:

上图模型中,我们配置了4个cpu core,启动了4个nginx进程,其中nginx_0是DPDK Primary进程,其它三个都是Secondary进程,nginx_N绑定coreN,负责处理网卡1和网卡2的N号队列的报文,其中N=0,1,2,3。从图中可以看到,基于f-stack的应用程序都是多进程配合,每个进程的单个DPDK收包线程绑定一个核,然后处理所有网卡上相同编号队列的报文。

f-stack的报文收发逻辑,简单一点说,就是先使用f-stack的lib库中的DPDK API接口把报文收上来,然后将报文给到移植的FreeBSD协议栈(也可以根据配置的端口,通过KNI过滤部分报文给Linux内核),上层的应用程序比如nginx或redis需要修改原有的socket的API为f-stack封装的socket API,就可以收到DPDK收上来的报文了。

将f-stack源码目录下的config.ini配置文件复制一份到examples目录,修改配置:lcore_mask=0xf,port_list=0,1,添加[port1]配置,lcore_list=0,1,2,3,指定进程编号启动helloworld_epoll:

./helloworld_epoll --proc-id=0./helloworld_epoll --proc-id=1./helloworld_epoll --proc-id=2./helloworld_epoll --proc-id=3

每个进程分别可以看到打印,从打印看跟上面的分析应该是一致的。

基于以上的分析,有几点思考:

1、多进程单收包线程的模型,可以实现每个进程都有一个独立的用户态协议栈,性能肯定更高,但是也说明了内核协议栈性能较低,影响的因素,收包时候的数据拷贝是一方面,多线程之间的锁也是一方面。

2、多进程单收包线程的模式比较适合nginx或者redis这种场景,但是不太适合做类似防火墙或者网关一类的产品,因为这类产品必然要做大量的进程间共享数据的工作(比如同步会话表),可能会比较麻烦。

3、个人感觉f-stack主要是提供了比较好的应用态socket的功能,如果要想使用类似于linux的netfilter和iptables那一套hook转发的功能,可能还不太好使用,f-stack源码目录tools下有libnetgraph和ipfw目录,没有实测过,不知道怎么样。

4、应用态程序的移植是否方便,比如frr、strongswan等等开源项目移植到f-stack,是否好移植,看到f-stack正在通过LD_PRELOAD动态链接的方式进行劫持,看能不能大大降低移植的难度。

5、性能方便,f-stack在较少cpu core的表现较好,就是相同性能表现的情况下,可以比nginx用到的cpu的资源少。

没用过f-stack之前,担心的是它的稳定性以及是否会持续维护,但是了解到它是多进程单收包线程之后,觉得它并不是一种通用的应用态协议栈解决方案,对做防火墙网关之类的网络产品还不太友好,如果能支持单进程多收包线程,牺牲点应用态协议栈的性能如何呢?或者我们自己把f-stack改造成单进程多线程收包模式,然后从业务上去保证只有单个线程上的报文进协议栈处理如何呢?欢迎有相同疑问的朋友一起分享交流。

好了,关于f-stack收包框架的分析就讲到这里了。喜欢文章内容的朋友,记得加个关注哦~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/579484.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在页面使用富文本编译器

富文本编译器的选择 Editor.mdTinyMCESimpleMDECKEditor 还有一些,这里讲的是我用的TinyMCE 1、下载 下载地址:下载tiny | TinyMCE中文文档中文手册 下载开发版本,我下载的最新版 tinymce_6.4.2_dev.zip 将压缩包解压后可以看到下面目录&…

(哈希表 ) 202. 快乐数——【Leetcode每日一题】

❓202. 快乐数 难度:简单 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到…

Groovy系列一 Groovy基础语法

目录 为什么要学习Groovy Groovy 介绍 Groovy 特点 Groovy 实战 动态类型 简单明了的list,map类型 在groovy世界任何东西都是对象 属性操作变得更容易 GString 闭包 委派:delegate Switch变得更简洁 元编程 强制类型检查 Elvis Operator 安全访问 为…

【五】设计模式~~~创建型模式~~~单例模式(Java)

【学习难度:★☆☆☆☆,使用频率:★★★★☆】 5.1. 模式动机 对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一…

一波三折,终于找到 src 漏洞挖掘的方法了【建议收藏】

0x01 信息收集 1、Google Hack 实用语法 迅速查找信息泄露、管理后台暴露等漏洞语法,例如: filetype:txt 登录 filetype:xls 登录 filetype:doc 登录 intitle:后台管理 intitle:login intitle:后台管理 inurl:admin intitle:index of /查找指定网站&…

C++:征服C指针:指针(二)

指针二 1. 指向数组的指针2. 多维数组三级目录 上一篇文章我们介绍了:什么是指针,指针常见的问题,本篇我们主要介绍 :指针与数组。 1. 指向数组的指针 int *p[n] : 指针数组, 它包括 n 个成员,每个成员都是…

探索Maven创建项目全过程(超详细~~~)

文章目录 1.Maven介绍2.Servlet介绍2.1 Servlet定义2.2 Servlet的主要任务 3.创建Servlet程序步骤3.1 创建项目3.2 引入依赖3.3 创建目录3.4编写代码3.5 打包程序3.6 部署程序3.7 验证结果 4.更方便的部署方式4.1.下载Tomcat插件4.2 配置Tomcat插件4.3运行项目 1.Maven介绍 Ma…

认识Tomcat

hi,大家好,今天为大家带来Tomcat的相关知识 🍭1.Tomcat是什么 🍭2.Tomcat的下载安装 🍭3.Tomcat的目录结构 🍭4.启动Tomcat 🍭5.部署博客系统到Tomcat 🍉1.Tomcat是什么 我们之前也已经学了http,http…

【JAVAWEB】HTML的常见标签

目录 1.HTML结构 1.1认识HTML标签 1.2HTML文件基本结构 1.3标签层次结构 1.4快速生成代码框架 2.HTML常见标签 注释标签 标题标签:h1-h6 段落标签:p 换行标签:br 格式化标签 图片标签 超链接标签:a 表格标签 列表标签 表单标…

Windows 同时安装 MySQL5 和 MySQL8 版本

👏作者简介:大家好,我是Rockey,不知名企业的不知名开发着 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦 📝联系方式:he18339193956,…

MySQL 00 : MySQL_数据库shell登录时遇到的问题

问题1描述:输入链接数据块的命令提示 sh:mysgl:command not found 解决:第一步配置环境变量来解决 1、vim /etc/profile 2、末尾写入export PATH$PATH:/usr/local/mysql/bin 3、保存 4、执行 source /etc/profile 第二部 问题描述 Mac通过MAMP安装MySQL时&#…

K8s之Replicaset控制器详解

文章目录 一、ReplicaSet 控制器介绍二、ReplicaSet案例1、Pod副本扩缩容案例2、Pod更新版本案例 一、ReplicaSet 控制器介绍 官方中文参考文档: ReplicaSet是k8s中一种资源对象,简写 rs,用于管理Pod副本数量和健康状态,在spec.…

MySQL如何导入大量数据?

有时我们会遇到需要将大量数据导入MySQL的需求,一般数据存储在csv或者txt中,数据由","分隔。这里提供两种方案供大家选择。 一、创建测试表 为了测试,我们先创建数据库和表,并创建一个用户。 create database loadda…

js的BOM对象中的window、location使用

说明:BOM的全称是Browser Object Model,浏览器对象模型,有Window(浏览器窗口)、Navigator(浏览器)、Screen(屏幕)、History(历史记录)和Location&…

js函数、Array和String的定义和使用

函数 js中的函数&#xff0c;类似java中的方法 <script>// 定义函数方式一function addA(x, y) {return x y;}// 定义函数方式二&#xff0c;注意addB是函数的名称&#xff0c;不是返回值let addB function(x, y) {return x * y;}</script><script>docume…

vscode语音插件开发-在nodejs里面转换音频文件格式并压缩导出zip格式

继我的上一篇文章&#xff1a;&#xff01;vscode录音及语音实时转写插件开发并在工作区生成本地mp3文件 踩坑日记 音频格式转换这里我使用的是ffmpeg第三方库&#xff0c;官网文档。 ffmpeg简介 FFmpeg是一个跨平台的自由软件&#xff0c;用于实时音频、视频流以及音频、视频…

Vue电商项目--详情页面--产品售卖属性

滚动行为 开发某一个产品的详情页面&#xff1f; 1.静态组件 但是这个详情页&#xff0c;我们还没有注册为路由 当点击商品图片的时候&#xff0c;跳转到详情页面&#xff0c;在路由跳转的时候需要带上产品的ID给详情页面 干掉a标签换成router-link标签 这里要注意的一点是…

MybatisPlus处理业务数据新思路

文章目录 [toc] 1.问题2.新姿势3.总结 1.问题 由于之前搞了一个停车场的项目&#xff0c;有一个区域的停车场收费被投诉了被举报没有按照政府要求来计费&#xff0c;所以需要将之前的那些停车计费的数据重新计算&#xff0c;将多缴费的钱拿去交罚款&#xff0c;这个就很坑&…

MongoDB—Indexes

一、Indexes 索引支持在MongoDB中高效执行查询。没有 索引&#xff0c;MongoDB必须执行集合扫描&#xff0c;即扫描每个 集合中的文档&#xff0c;以选择与 查询语句。如果查询存在适当的索引&#xff0c; MongoDB可以使用索引来限制它必须的文档数量 检查。 索引是特殊的数据…

近期群晖容器查询注册表失败,无法下载镜像

前言 本以为是群晖的问题&#xff0c;后来发现大家也都遇到了类似的问题&#xff0c;查询注册表出现错误&#xff0c;无法搜索和下载docker镜像&#xff0c;本期就来介绍几个可平替的方案。 方案一&#xff1a;SSH拉取 使用SSH拉取首先要打开群晖的SSH功能&#xff1a;在【…