FQ队列detached流管理

2023-12-19 09:38
文章标签 管理 队列 detached fq

本文主要是介绍FQ队列detached流管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对于FQ中的流结构,如果其没有任何要发送的报文,即其为空,将其设置为detached状态,这样的流结构即不在new_flow链表,也不在old_flow链表。在detach设置函数中,不仅将其next指向固定的地址(静态变量detached的地址),而且,记录下其进入detached状态的时间戳。

/* special value to mark a detached flow (not on old/new list) */
static struct fq_flow detached, throttled;static void fq_flow_set_detached(struct fq_flow *f)
{f->next = &detached;f->age = jiffies;
}static bool fq_flow_is_detached(const struct fq_flow *f)
{return f->next == &detached;
}

1. FQ流初始化detached状态

在函数fq_classify中,新创建出来的fq流结构,初始化为detached状态,还没有加入到new_flows或者old_flows链表中。

static struct fq_flow *fq_classify(struct sk_buff *skb, struct fq_sched_data *q)
{struct rb_node **p, *parent;struct sock *sk = skb->sk;struct rb_root *root;struct fq_flow *f;...root = &q->fq_root[hash_ptr(sk, q->fq_trees_log)];...p = &root->rb_node;...f = kmem_cache_zalloc(fq_flow_cachep, GFP_ATOMIC | __GFP_NOWARN);if (unlikely(!f)) {q->stat_allocation_errors++;return &q->internal;}fq_flow_set_detached(f);f->sk = sk;

在函数fq_enqueue中,对于处在detached状态的流结构,由于其接收到了新的报文,将其添加到new_flows链表的尾部。

static int fq_enqueue(struct sk_buff *skb, struct Qdisc *sch, struct sk_buff **to_free)
{   struct fq_sched_data *q = qdisc_priv(sch);struct fq_flow *f;if (unlikely(sch->q.qlen >= sch->limit))return qdisc_drop(skb, sch, to_free);f = fq_classify(skb, q);...f->qlen++;qdisc_qstats_backlog_inc(sch, skb);if (fq_flow_is_detached(f)) {struct sock *sk = skb->sk;fq_flow_add_tail(&q->new_flows, f);...

2. Detached状态设置

在函数fq_dequeue中,如果流结构为空,不包含任何报文,并且old_flows不为空,将其由new_flows链表移动到old_flows链表的尾部。否则,以上条件不成立,即此流结构原本就位于old_flows链表中,或者old_flows链表为空,将此流结构设置为detached状态。

static struct sk_buff *fq_dequeue(struct Qdisc *sch)
{...skb = fq_dequeue_head(sch, f);if (!skb) {head->first = f->next;/* force a pass through old_flows to prevent starvation */if ((head == &q->new_flows) && q->old_flows.first) {fq_flow_add_tail(&q->old_flows, f);} else {fq_flow_set_detached(f);q->inactive_flows++;}goto begin;}

3. 回收Detach流结构

如下函数fq_gc_candidate,如果流结构处于detached状态,并且已经超过3秒钟,可进行回收。

/* limit number of collected flows per round */
#define FQ_GC_MAX 8
#define FQ_GC_AGE (3*HZ)static bool fq_gc_candidate(const struct fq_flow *f)
{return fq_flow_is_detached(f) &&time_after(jiffies, f->age + FQ_GC_AGE);
}

在函数fq_gc中,调用以上fq_gc_candidate函数,判断是否可回收当前流结构,fq_gc每次调用时最多释放8个(FQ_GC_MAX)流结构。

static void fq_gc(struct fq_sched_data *q, struct rb_root *root, struct sock *sk)
{struct fq_flow *f, *tofree[FQ_GC_MAX];struct rb_node **p, *parent;int fcnt = 0;p = &root->rb_node;parent = NULL;while (*p) {parent = *p;f = rb_entry(parent, struct fq_flow, fq_node);if (f->sk == sk)break;if (fq_gc_candidate(f)) {tofree[fcnt++] = f;if (fcnt == FQ_GC_MAX)break;}

内核版本 5.0

这篇关于FQ队列detached流管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/511714

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

RabbitMQ 延时队列插件安装与使用示例详解(基于 Delayed Message Plugin)

《RabbitMQ延时队列插件安装与使用示例详解(基于DelayedMessagePlugin)》本文详解RabbitMQ通过安装rabbitmq_delayed_message_exchan... 目录 一、什么是 RabbitMQ 延时队列? 二、安装前准备✅ RabbitMQ 环境要求 三、安装延时队

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Linux系统管理与进程任务管理方式

《Linux系统管理与进程任务管理方式》本文系统讲解Linux管理核心技能,涵盖引导流程、服务控制(Systemd与GRUB2)、进程管理(前台/后台运行、工具使用)、计划任务(at/cron)及常用... 目录引言一、linux系统引导过程与服务控制1.1 系统引导的五个关键阶段1.2 GRUB2的进化优

Spring Security 前后端分离场景下的会话并发管理

《SpringSecurity前后端分离场景下的会话并发管理》本文介绍了在前后端分离架构下实现SpringSecurity会话并发管理的问题,传统Web开发中只需简单配置sessionManage... 目录背景分析传统 web 开发中的 sessionManagement 入口ConcurrentSess

Linux之UDP和TCP报头管理方式

《Linux之UDP和TCP报头管理方式》文章系统讲解了传输层协议UDP与TCP的核心区别:UDP无连接、不可靠,适合实时传输(如视频),通过端口号标识应用;TCP有连接、可靠,通过确认应答、序号、窗... 目录一、关于端口号1.1 端口号的理解1.2 端口号范围的划分1.3 认识知名端口号1.4 一个进程

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底