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

相关文章

Redis实现RBAC权限管理

《Redis实现RBAC权限管理》本文主要介绍了Redis实现RBAC权限管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1. 什么是 RBAC?2. 为什么使用 Redis 实现 RBAC?3. 设计 RBAC 数据结构

Spring Boot整合消息队列RabbitMQ的实现示例

《SpringBoot整合消息队列RabbitMQ的实现示例》本文主要介绍了SpringBoot整合消息队列RabbitMQ的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录RabbitMQ 简介与安装1. RabbitMQ 简介2. RabbitMQ 安装Spring

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)

《解读Redis秒杀优化方案(阻塞队列+基于Stream流的消息队列)》该文章介绍了使用Redis的阻塞队列和Stream流的消息队列来优化秒杀系统的方案,通过将秒杀流程拆分为两条流水线,使用Redi... 目录Redis秒杀优化方案(阻塞队列+Stream流的消息队列)什么是消息队列?消费者组的工作方式每

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、