流量控制
文章平均质量分 52
redwingz
这个作者很懒,什么都没留下…
展开
-
设备Qdisc绑定
网络设备注册函数register_netdevice中,调用dev_init_scheduler初始化Qdisc。将设备的每个队列的Qdisc都初始化为noop_qdisc。绑定Qdisc在网络设备启用(dev_open)处理中,由函数dev_activate处理Qdisc。如果设备队列qdisc是初始的noop_qdisc,由函数attach_default_qdisc绑定默认qdisc。如果此时链路状态处于断开,不进行后续处理。如果设备只有一个队列,或者设置了IFF_NO_QUEUE标志,为此队原创 2022-06-04 23:03:03 · 739 阅读 · 0 评论 -
TC流量控制HTB示例
如下图测试拓扑,将两个FTP客户端的总下载流量控制在10Mbps,并且,当同时下载时,将50.2的带宽控制在8Mbps,50.3的带宽控制在2Mbps。带宽空闲时,允许借用。 192.168.50.2 |------------| | | | FTP-1 |------| | | | |------------| |------------| |----------原创 2021-09-26 21:33:26 · 1058 阅读 · 0 评论 -
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, throttle原创 2020-10-19 20:23:30 · 578 阅读 · 0 评论 -
FQ队列throttled流管理
FQ队列中对发送时间未到的流结构单独存放在delayed红黑树中,这样的流结构即不在new_flow链表,也不在old_flow链表,其next指针执行一个特定的值:throttled。内核函数通过检查流结构的next指针,来判断流是否处于throttled状态。new_flow链表中的流结构的优先级高于old_flows中的流。/* special value to mark a detached flow (not on old/new list) */static struct fq_flow原创 2020-10-17 23:06:18 · 517 阅读 · 0 评论 -
FQ队列对quantum的处理
quantum 表示每次出队列轮询的信用值(credit),例如,每个流每次可允许出队列的字节数量。此值设置的较大意味值下一个流等待服务的时间更长,默认为2倍的接口MTU值。static int fq_init(struct Qdisc *sch, struct nlattr *opt, struct netlink_ext_ack *extack){ struct fq_sched_data *q = qdisc_priv(sch); int err; sch->lim原创 2020-10-12 20:09:53 · 600 阅读 · 0 评论 -
FQ队列流结构回收
在FQ队列中,如果流结构队列为空,并且超过3秒(FQ_GC_AGE)没有接收到相应的报文,系统将其进行回收,如下判断函数fq_gc_candidate。但是在每次fq_gc回收函数执行时,最大释放8个(FQ_GC_MAX)流结构。/* 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_fl原创 2020-09-17 19:34:32 · 484 阅读 · 0 评论 -
Linux FQ队列操作
在介绍FQ入队列操作之前,先看一下流量的识别部分。1 流量识别对于一些协议报文,比如HSR(High-availability Seamless Redundancy)、IGMP和HDLC等,其将priority字段设置为了TC_PRIO_CONTROL,对于此类报文,FQ使用一个内部特定的流处理(q->internal)。static struct fq_flow *fq_classify(struct sk_buff *skb, struct fq_sched_data *q){原创 2020-09-12 22:51:26 · 1510 阅读 · 0 评论 -
Linux公平队列FQ接口实现
用户层面的tc配置命令如下:$ sudo tc qdisc add dev ens38 root fq$ $ sudo tc -s qdisc show dev ens38 qdisc fq 8001: root refcnt 2 limit 10000p flow_limit 100p buckets 1024 orphan_mask 1023 quantum 3028 initial_quantum 15140 low_rate_threshold 550Kbit refill_delay 40原创 2020-09-08 19:19:01 · 912 阅读 · 0 评论 -
Max-Min公平性
Max-Min公平性由Hayden在文章(Round-Robin Scheduling for Max-Min Fairness in Data Networks)中提出,旨在评估队列调度机制的公平性。This section describes the max-min flow criterion, our definition of throughput fairness. The version presented herewas developed by Hayden [9]. Similar原创 2020-09-07 19:48:42 · 1002 阅读 · 1 评论 -
Linux公平队列FQ配置
FQ (Fair Queue)是一个无类别(classless)的报文调度器,其主意用于本地产生的流量。设计为控制每个流的发送节奏(pacing)。FQ完成流的区分,并且可完成TCP层要求的发送节奏。所有的属于一个套接口的报文认为属于一个流(flow)。对于非本地生成的报文(如对于路由器设备),可使用sk_buff结构中的成员hash作为区分流的备选项。应用程序可使用setsockopt系统调用的选项SO_MAX_PACING_RATE指定最大的pacing速率。FQ调度器可在发送报文之间增加延时以达到T原创 2020-09-04 21:43:32 · 3084 阅读 · 0 评论 -
按位实现的队列轮询算法
由于Nagle所提出的队列轮询算法,实际上是以报文为单位进行公平轮询,进而发送报文,但是没有考虑报文大小不同带来的不公平性,导致使用大报文的连接占用较多的网络带宽。来看一下为解决此问题,理想的按照比特位为单位进行的轮询算法。首先,假设一个理论上的队列服务机制,其可以按照比特位轮询方式(bit-by-bit round robin)进行数据发送,这样,此服务机制可保证在任意时刻每个连接队列都可获得公平的带宽服务。使用R(t)表示在t时刻已进行的轮询次数,R(t)为连续函数,分数结果表示当前存在一次还没有完成原创 2020-08-28 21:59:47 · 585 阅读 · 0 评论 -
Nagle公平队列
为保护正常行为(well-behaved)的源主机流量,免受异常(badly-behaved)主机的影响,或者是在两种流量混合的网络中,确保正常行为的主机获得优于异常主机的流量服务,在RFC970中,Nagle提出了一种公平队列。我们假设一个高带宽的LAN通过网关(交换设备)与WAN相连,LAN网络中的没有流量控制。任何主机如果发送到WAN网络的报文速率超过网关可处理的极限,将会在网关处造成拥塞。如果网关采用先入先出队列(First-In-First-Out),异常行为的主机将严重干扰正常主机的流量。网原创 2020-08-27 19:22:58 · 228 阅读 · 0 评论 -
Linux内核Adaptive-RED实现
ARED在RED的基础上实现了最大报文标记概率max_P的自动调整,以便将平均队列长度控制在目标区间内。1 ARED初始化在RED初始化函数red_init中,设置ARED定时器adapt_timer用于定期执行ARED算法,定时处理函数为red_adaptative_timer。static int red_init(struct Qdisc *sch, struct nlattr *opt, struct netlink_ext_ack *extack){ struct red_sche原创 2020-08-11 21:34:27 · 456 阅读 · 0 评论 -
RED硬件卸载支持
在RED参数处理的最后,调用red_offload设置RED卸载功能。static int red_change(struct Qdisc *sch, struct nlattr *opt, struct netlink_ext_ack *extack){ struct Qdisc *old_child = NULL, *child = NULL; struct red_sched_data *q = qdisc_priv(sch); struct n原创 2020-08-06 19:35:00 · 881 阅读 · 0 评论 -
RED统计信息
使用TC命令查看网络设备ens40的队列统计信息,对于RED队列,显示如下,首先是RED配置参数的显示,其次,为统计信息:$ tc -d -s qdisc show dev ens40 qdisc red 8005: root refcnt 2 limit 400000b min 30000b max 100000b ecn harddrop adaptive ewma 5 probability 0.00956593 Scell_log 8 Sent 0 bytes 0 pkt (dropped原创 2020-08-06 19:11:09 · 350 阅读 · 0 评论 -
Linux内核RED队列实现
关于RED队列的TC配置命令,参见:RED队列tc设置。1 RED入队列首先计算平均队列长度qavg,参见之后函数red_calc_qavg的介绍。如果队列处于空闲状态,退出空闲状态,清空空闲开始时间戳。static int red_enqueue(struct sk_buff *skb, struct Qdisc *sch, struct sk_buff **to_free){ struct red_sched_data *q = qdisc_priv(sch); struct Q原创 2020-08-05 19:41:03 · 742 阅读 · 0 评论 -
RED队列tc设置
如下tc命令配置RED(Random Early Detection)队列。$ sudo tc qdisc add dev ens40 root red limit 400000 min 30000 max 100000 avpkt 1000 probability 0.02 burst 55 ecn adaptive harddrop bandwidth 1000Mbit $ $ tc -d -s qdisc show dev ens40 qdisc red 8005: ro原创 2020-08-04 19:36:40 · 1351 阅读 · 0 评论 -
Adaptive-RED队列
RED通过平均队列长度的增长,增加报文的随机丢弃(或标记)概率,来实现主动队列管理(AQM)。当平均队列长度avg由设置的最小阈值(minth)向最大阈值(maxth)增长时,报文的丢弃概率由零增长到最大概率值maxp。RED的一个主要目的就是使用平均队列长度(容许突发流量)和拥塞预先通知(减低平均队列长度)来达到高吞吐和较低的平均队列时延。但是,RED的一个缺陷是,平均队列长度随着拥塞程度和RED参数的设置而变化。当链路轻度拥塞,或者maxp设置的较大时,平均队列长度接近minth。反之,当链路严重拥塞原创 2020-07-28 22:15:25 · 709 阅读 · 0 评论 -
RED队列算法 - 实现
RED算法的大部分工作都可以与报文的转发处理并行进行,两个主要算法包括平均队列长度avg和报文标记概率pb计算,也可以按照低优先级任务执行,因此,RED完全可使用在高速网络中。如果RED标记报文的方式不是丢弃报文,而是设置报文头部中的拥塞标志位(ECN方式),后者将影响报文的转发。但是,因为RED的随机算法被设计用来标记尽量少的报文,从而对转发的影响并不大。对于每个接收到的报文,RED计算平均队列长度avg,如下实现:avg←(1−wq)avg+wqq=avg+wq(q−avg)avg \lefta原创 2020-07-25 20:37:13 · 2784 阅读 · 0 评论 -
RED队列
RED(Random Early Detection)算法旨在将队列的平均长度保持在较低的值,同时,允许一定量的突发报文。在发生拥塞期间,RED以一定的概率通知(丢包或者ECN机制)某个连接减低窗口值,此概率大致上与该连接占用的带宽份额成比例。RED设计用来与传输层协议如TCP等一起使用。另外,RED还可避免过多的连接同时减低窗口的现象发生。RED使用一个带有EWMA(Exponential Weighted Moving Average)的LPF(Low-Pass Filter)低通滤波器来计算平均队列原创 2020-07-24 09:50:15 · 1895 阅读 · 0 评论 -
SFB队列
SFB(Stochastic Fair Blue)是一个FIFO类型的队列算法,基于类似于BLUE算法的记账机制,来标识非响应性质的流,并且限制其速率(这类流不处理ECN或者丢包事件)。SFB的记账系统由L*N个桶(bin)组成,其中L表示级别,N表示每个级别的桶的数量。Linux内核中使用8个级别,每个级别16个桶用于记账。 37 #define SFB_BUCKET_SHIFT 4 38 #define SFB_NUMBUCKETS (1 << SFB_BUCKET_SHIFT) /*原创 2020-07-13 23:06:54 · 1288 阅读 · 0 评论