Linux流量控制——Linux flow control

2024-06-06 00:58
文章标签 linux flow control 流量 控制

本文主要是介绍Linux流量控制——Linux flow control,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Linux操作系统中的流量控制框架创建了一个通用环境,它集成了所有用于限制和流量整形的可以互联的不同元素。在实际操作中这些元素甚至可以作为一个模块动态地加载和卸载。

    TC(Traffic Control)工具提供了一个命令行用户接口来配置Linux流量控制。该工具让用户可以设定并配置几乎所有的流量控制框架要素,比如排队规则(qdisc)、类(class)及过滤器(filter),他们之间的关系见下图。

    排队规则:每个网络设备配有一个排队规则。通常,要发送的报文被送到一个排队规则中并且按照特定规则在此队列中排序。

    类:排队规则可以有多个接口,这些接口用于向队列管理插入报文。在单个排队规则中,可以把报文分配到不同的类。

    过滤器:通常用来将外发报文分片到排队规则的类中。

    排队规则

    Linux可支持无类排队规则和分类排队规则。无类排队规则包括FIFO(先进先出)、TBF(令牌桶过滤器)、SFQ(随机公平队列)等;分类排队规则包括PRIO(优先级)、CBQ(类基队列)、HTB(分层令牌桶)等。

    FIFO

    FIFO(pfifo_fast)

    先进先出。它的队列包括三个波段(band)。在每个波段里面,使用先进先出规则。而三个波段的优先级也不相同,band 0的优先级最高,band 2的最低。如果band 0里面有数据包,系统就不会处理band 1里面的数据包,band 1和band 2之间也是一样。数据包是按照服务类型(Type of Service,TOS)被分配多三个波段里面的。

    pfifo_fast 队列规定作为硬性的缺省设置,不能对它进行配置。

    TBF & HTB

    令牌桶过滤器(Token Bucket Filter,TBF)是一个简单的队列,它只允许以不超过事先设定的速率到来的数据包通过,但可能允许短暂突发流量超过设定值。

    TBF 的实现在于一个缓冲器(桶),它不断地被一些称为令牌的虚拟数据以特定速率填充。桶最重要的参数就是它的大小,也就是它能够存储令牌的数量。每个到来的令牌从数据队列中收集一个数据包,然后从桶中被删除。如下图。

    这个算法将令牌流和数据流进行了紧密的关联,我们有以下三种情景:

    数据流以等于令牌流的速率到达TBF。这种情况下,每个到来的数据包都能对应一个令牌,然后无延迟地通过队列。

    数据流以小于令牌流的速度到达TBF。通过队列的数据包只消耗了一部分令牌,剩下的令牌会在桶里积累下来,直到桶被装满。剩下的令牌可以在需要以高于令牌流速率发送数据流的时候消耗掉,这种情况下会发生突发传输。

    数据流以大于令牌流的速率到达TBF。这意味着桶里的令牌很快就会被耗尽。导致TBF中断一段时间,称为“越限”。如果数据包持续到来,将发生丢包。

    TBF提供了一些可控参数,如令牌桶大小、令牌流入速率、峰值速率、排队时延等。

    例如:

    # tc qdisc add dev eth0 root tbf rate 512kbit latency 30ms burst 1600

    它的意思是在eth0上设置一个tbf过滤队列,网络带宽为512kbit,延迟为30m,突发数据量(缓冲区)为1600个字节。

    分层令牌桶(Hierarchical Token Bucket,HTB)即分类的令牌桶过滤器,它可以通过TBF实现带宽限制,也能够划分类别的优先级。

    SFQ

    SFQ(Stochastic Fairness Queueing,随机公平队列)是公平队列算法家族中的一个简单实现。它的精确性不如其它的方法,但是它在实现高度公平的同时,需要的计算量却很少。

    SFQ的关键词是“会话”(或称作“流”),主要针对一个TCP会话或者UDP流。流量被分成相当多数量的FIFO 队列中,每个队列对应一个会话。数据按照简单轮转的方式发送, 每个会话都按顺序得到发送机会。

    这种方式非常公平,保证了每一个会话都不会没其它会话所淹没。SFQ 之所以被称为“随机”,是因为它并不是真的为每一个会话创建一个队列,而是使用一个散列算法,把所有的会话映射到有限的几个队列中去。

    因为使用了散列,所以可能多个会话分配在同一个队列里,从而需要共享发包的机会,也就是共享带宽。为了不让这种效应太明显,SFQ 会频繁地改变散列算法,以便把这种效应控制在几秒钟之内。

    需要注意的是:只有当出口网卡确实已经挤满了的时候,SFQ才会起作用,否则在Linux 机器中根本就不会有队列,SFQ 也就不会起作用。

    SFQ基本上不需要手工调整:它的参数有perturb和quantum。

    例如:

    # tc qdisc add dev ppp0 root sfq perturb 10

    # tc -s -d qdisc ls

    qdisc sfq 800c: dev ppp0 quantum 1514b limit 128p flows 128/1024 perturb 10sec

    Sent 4812 bytes 62 pkts (dropped 0, overlimits 0)

    “800c:”这个号码是系统自动分配的一个句柄号,“limit”意思是这个队列中可以有128 个数据包排队等待。一共可以有1024 个散列目标可以用于速率审计,而其中128 个可以同时激活。每隔10 秒种散列算法更换一次。

    PRIO

    PRIO 队列规定并不进行整形,它仅仅根据配置的过滤器把流量进一步细分。可以认为PRIO 队列规定是pfifo_fast 的一种衍生物,区别在每个波段都是一个单独的类,而非简单的FIFO。

    当数据包进入PRIO 队列规定后,将根据你给定的过滤器设置选择一个类。缺省情况下有三个类,这些类仅包含纯FIFO 队列规定而没有更多的内部结构。可以把它们替换成需要的任何队列规定。

    每当有一个数据包需要出队时,首先处理:1类。只有当标号更小的类中没有需要处理的包时,才会标号大的类。

    当希望不仅仅依靠包的TOS,而是想使用tc所提供的更强大的功能来进行数据包的优先权划分时,可以使用这个队列规定。它也可以包含更多的队列规定,而pfifo_fast 却只能包含简单的fifo 队列规定。

    因为它不进行整形,所以使用时与SFQ 有相同的考虑:要么确保这个网卡的带宽确实已经占满,要么把它包含在一个能够整形的分类的队列规定的内部。后者几乎涵盖了所有cable modems 和DSL 设备。

    严格地说,PRIO 队列规定是一种Work-Conserving 调度。

    CBQ

    CBQ(Class Based Queueing,基于类的队列)是一种基于类的算法,根据流量特征处理数据包,并确保一定的传输速率。接收的数据包根据变量如差分服务代码点(DSCP:Differentiated Services Code Point)中的IP协议头、IP 地址、应用程序或协议、URL或其它信息等进行分类。每类流量被分配到指定的FIFO(First In First Out)队列,其中每个队列的使用由部分路由器总带宽决定。如果队列为空闲,带宽便可以供其它队列使用。同时CBQ也是一种QoS方案,用于识别不同类型的流量并根据预置的参数对流量进行排队。

    它是最复杂、最琐碎、最难以理解的队列规定。这是因为CBQ算法本身的不精确,而且与Linux 的内在机制不协调造成的。

 

这篇关于Linux流量控制——Linux flow control的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

linux生产者,消费者问题

pthread_cond_wait() :用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它。 pthread_cond_wait() 必须与pthread_mutex 配套使用。pthread_cond_wait()函数一进入wait状态就会自动release mutex。当其他线程通过pthread

Linux 安装、配置Tomcat 的HTTPS

Linux 安装 、配置Tomcat的HTTPS 安装Tomcat 这里选择的是 tomcat 10.X ,需要Java 11及更高版本 Binary Distributions ->Core->选择 tar.gz包 下载、上传到内网服务器 /opt 目录tar -xzf 解压将解压的根目录改名为 tomat-10 并移动到 /opt 下, 形成个人习惯的路径 /opt/tomcat-10

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

【Linux进阶】UNIX体系结构分解——操作系统,内核,shell

1.什么是操作系统? 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。  从广义上说,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并使计算机具有自己的特生。这里所说的其他软件包括系统实用程序(system utility)、应用程序、shell以及公用函数库等

Windows/macOS/Linux 安装 Redis 和 Redis Desktop Manager 可视化工具

本文所有安装都在macOS High Sierra 10.13.4进行,Windows安装相对容易些,Linux安装与macOS类似,文中会做区分讲解 1. Redis安装 1.下载Redis https://redis.io/download 把下载的源码更名为redis-4.0.9-source,我喜欢跟maven、Tomcat放在一起,就放到/Users/zhan/Documents

Linux系统稳定性的奥秘:探究其背后的机制与哲学

在计算机操作系统的世界里,Linux以其卓越的稳定性和可靠性著称,成为服务器、嵌入式系统乃至个人电脑用户的首选。那么,是什么造就了Linux如此之高的稳定性呢?本文将深入解析Linux系统稳定性的几个关键因素,揭示其背后的技术哲学与实践。 1. 开源协作的力量Linux是一个开源项目,意味着任何人都可以查看、修改和贡献其源代码。这种开放性吸引了全球成千上万的开发者参与到内核的维护与优化中,形成了

Linux 下的Vim命令宝贝

vim 命令详解(转自:https://www.cnblogs.com/usergaojie/p/4583796.html) vi: Visual Interface 可视化接口 vim: VI iMproved VI增强版 全屏编辑器,模式化编辑器 vim模式: 编辑模式(命令模式)输入模式末行模式 模式转换: 编辑-->输入: i: 在当前光标所在字符的前面,转为输入模式

Java研学-RBAC权限控制(八)

九 登录登出 1 登录作用   判断员工是否有权限访问,首先得知道现在操作的人是谁,所以必须先实现登录功能 2 登录流程   ① 提供登录页面,可输入用户名与密码信息,并添加执行登录的按钮。(登录页面不能被拦截)   ② 给按钮绑定点击事件(异步操作,POST请求)   ③ 事件中发送登录请求,使用 AJAX 方式提交。(使用 AJAX 原因:用户体验更好,既可保留用户刚输入的用户名和密码

Linux和Mac分卷压缩

使用 zip 命令压缩文件 使用 zip 命令压缩文件,并结合 split 命令来分卷: zip - largefile | split -b 500k 举例: zip - ./tomcat.dmg |split -b 500k 上述命令将文件 largefile 压缩成 zip 包并分卷成不超过 500k 的文件,分解后文件名默认是 x* ,后缀为 2 位a-z 字母,如 aa、ab。

说一说三大运营商的流量类型,看完就知道该怎么选运营商了!

说一说三大运营商的流量类型,看完就知道该怎么选运营商了?目前三大运营商的流量类型大致分为通用流量和定向流量,比如: 中国电信:通用流量+定向流量 电信推出的套餐通常由通用流量+定向流量所组成,通用流量比较多,一般都在100G以上,而且电信套餐长期套餐较多,大多无合约期,自主激活的卡也是最多的,适合没有通话需求的朋友办理。 中国移动:通用流量+定向流量 移动推出的套餐通常由通用流量+定向