Linux内核TC工具链路带宽设计--无类队列规定
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Linux内核TC工具链路带宽设计--无类队列规定,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含7465字,纯文字阅读大概需要11分钟。
内容图文
![Linux内核TC工具链路带宽设计--无类队列规定](/upload/InfoBanner/zyjiaocheng/978/efbf5f54323c437dbfd7865c01f25d9f.jpg)
Linux 内核的 TC(traffic control)工具可以用来对网络带宽做一定的设计和管理,这里将对这一工具的使用做一定的介绍,在正式开始介绍TC 之前,先对一些基本的单位做一个说明。为了避免概念混乱,TC 采用如下规定来描述带宽:
mbps = 1024 kpbs = 1024 * 1024 bps => byte/s mbit = 1024 kbit => kilo bit/s mb = 1024 kb = 1024 * 1024 b => byte mbit = 1024 kbit => kilo bit 内定:数字以 bps 和 b 方式存储,但当 tc 输出速率时,使用如下表示: 1Mbit = 1024 Kbit = 1024 * 1024 bps => byte/s
解释队列和队列规定
利用队列,我们决定了数据被发送的方式。必须认识到,我们只能对发送数据进行整形。
根据Internet 的工作方式,我们无法直接控制别人向我们发送什么数据。就像我们家里的信报箱,你不可能控制全世界,联系每一个人,修改别人对你发送邮件的数量。然而,Internet 主要依靠TCP/IP,它的一些特性很有用。因为TCP/IP 没办法知道两个主机之间的网络容量,所以它会试图越来越快地发送数据(所谓的“慢起技术”) ,当因为网络容量不够而开始丢失数据时,再放慢速度。
如果你有一个路由器,并且希望能够防止某些主机下载速度太快,你需要在你路由器的内网卡——也就是向你的网内主机发送数据包的网卡——上进行流量整 形。还要保证正在控制的是瓶颈环节。如果有一个100M 以太网卡,而路由器的链路速度是 256k,则必须保证发送的数据量没有超过路由器的处理能力。否则,就是路由器在控制链路和对带宽进行整形,而不是你。可以说,我们需要拥有的队列必须是一系列链路中最慢的环节。
简单的无类队列规定
如前所述,利用队列,我们决定了数据被发送的方式。无类队列规定就是那样,能够接受数据和重新编排、延迟或丢弃数据包。这可以用作对于整个网卡的流量进行整形,而不细分各种情况。最广泛应用的规定是pfifo_fast 队列规定,因为它是缺省配置。
pfifo_fast
这个队列的特点是先进先出(FIFO),也就是说没有任何数据包被特殊对待。这个队列有3 个“频道”。FIFO 规则应用于每一个频道。并且如果在0 频道有数据包等待发送,1 频道的包就不会被处理,1 频道和2频道之间的关系也是如此。内核遵照数据包的TOS(Type Of Service)标记,把带有“最小延迟”标记的包放进0 频道。
不要把这个无类的简单队列规定与分类的PRIO 相混淆。虽然它们的行为有些类似,但对于无类的pfifo_fast 而言,不能使用tc 命令向其中添加其它的队列规定。
参数与使用
pfifo_fast 队列规定作为硬性的缺省设置,不能对它进行配置。它缺省是这样配置的:
priomap:
内核规定,根据数据包的优先权情况,对应相应的频道。这个对应是根据数据包的TOS 字节进行的。TOS 看上去是这样的:
TOS 字段的4 个bit 是如下定义的:
二进制 十进制 意义
-----------------------------------------
1000 8 最小延迟(md)
0100 4 最大throughput(mt)
0010 2 最大可靠性(mr)
0001 1 最小成本(mmc)
0000 0 正常服务
-----------------------------------------
队列的长度来自网卡的配置,可以用ifconfig 和ip 命令修改。如设置队 列长度为10,执行:ifconfig eth0 txqueuelen 10。不能用tc 命令来设置它。
令牌桶过滤器(TBF)
令牌桶过滤器(TBF)是一个简单的队列规定:只允许以不超过事先设定速率到来的数据包通过,但可能允许短暂突发流量超过设定值。
TBF 的实现在于一个缓冲器(桶),不断地被一些叫做“令牌”的虚拟数据以特定速率填充着。桶最重要的参数就是它的大小,也就是它能够存储令牌的数量。每个到来的令牌从数据队列中收集一个数据包,然后从桶中被删除。这个算法关联到两个流——令牌流和数据流,于是我们得到3 种情景:
(1)数据流以等于令牌流的速率到达TBF。这种情况下,每个到来的数据包都能对应一个令牌,然后无延迟地通过队列。
(2)数据流以小于令牌流的速度到达TBF。通过队列的数据包只消耗了一部分令牌,剩下的令牌会在桶里面积累下来,直到桶被装满。剩下的令牌可以在需要以高于令牌流速率发送数据包的时候被消耗掉,这种情况下会发生突发传输。
(3)数据流以大于令牌流的速率到达TBF。这意味着桶里的令牌很快就会被耗尽。导致TBF 中断一段时间,成为“越限”。如果数据包持续到来,将会发生丢包。
最后一种情况非常重要,因为它可以用来对数据通过过滤器的速率进行整形。令牌的积累可以导致越限的数据包进行短时间的突发传输而不必丢包,但是持续越限的话会导致传输延迟直至丢包。需要注意的是,实际的实现是针对数据的字节数进行的,而不是针对数据包进行。
参数与使用
TBF 提供了一些可调控的参数,第一个参数永远可用:
limit/latency
limit 确定最多有多少数据(字节数)在队列中等待可用令牌,也可以通过设置latency 参数来指定这个参数。latency 参数确定了一个包在TBF 中等待传输的最长等待时间。后者计算决定桶的大小、速率和峰值速率。
burst/buffer/maxburst
桶的大小,以字节计。这个参数指定了最多可以有多少个令牌能够即刻被使用。通常情况下,管理的带宽越大,需要的缓冲器就越大。如果缓冲区太小,就会导致到达的令牌没有地方放(桶满了),这会导致潜在的丢包。
mpu
一个零长度的包并不是不耗费带宽。比如以太网,数据帧不会小于64 字节。mpu(Minimum Packet Unit,最小分组单位)决定了令牌的最低消耗。
rate
速度操纵杆
如果桶存在令牌而且运行没有令牌,这相当于不限制速率。如果不希望这样,可以调整以下参数:
peakrate
峰值速率可以用来指定令牌以多快的速度被删除。用书面语言来说,就是:释放一个数据包,然后等待足够的时间后再释放下一个。通过计算等待时间来控制峰值速率。然而,由于UNIX 定时器的分辨率是10 毫秒,如果平均包长为10kbit,峰值速率则被限制在1Mbps。
mtu/minburst
如果常规速率比较高,1Mbps 的峰值速率就没有什么价值。要实现更高的峰值速率,可以在一个时钟周期内发送多个数据包。最有效的办法就是再创建一个令牌桶。这第二个令牌桶缺省情况下为一个单个的数据包,并非一个真正的桶。要计算峰值速率,用mtu 乘以100 就行了。
1.2.2.2 配置范例
这是一个非常简单而实用的例子:
# tc qdisc add dev eth0 root tbf rate 220kbit latency 50ms burst 1540
为什么它很实用呢?如果你有一个队列较长的网络设备,比如DSL modem 或者cable modem 什么的,并通过一个快速设备(如以太网卡)与之相连,你会发现上载数据绝对会破坏交互性。这是因为上载数据会充满modem 的队列,而这个队列为了改善上载数据的吞吐量而设置的特别大。但这并不是你所需要的,你可能为了提高交互性而需要一个不太大的队列。也就是说你希望在发送数据的时候干点别的事情。
上面的一行命令并非直接影响了modem 中的队列,而是通过控制Linux 中的队列而放慢了发送数据的速度。把220kbit 修改为你实际的上载速度再减去几个百分点。如果你的modem 确实很快,就把“burst”值提高一点。
随机公平队列(SFQ)
SFQ(Stochastic Fairness Queueing,随机公平队列)是公平队列算法家族中的一个简单实现。它的精确性不如其它的方法,但是它在实现高度公平的同时,需要的计算量却很少。
SFQ 的关键词是“会话”(或称作“流”) ,主要针对一个TCP 会话或者UDP 流。流量被分成相当多数量的FIFO 队列中,每个队列对应一个会话。数据按照简单轮转的方式发送, 每个会话都按顺序得到发送机会。这种方式非常公平,保证了每一个会话都不会被其它会话所淹没。SFQ 之所以被称为“随机”,是因为它并不是真的为每一个会话创建一个队列,而是使用一个散列算法,把所有的会话映射到有限的几个队列中去。
因为使用了散列,所以可能多个会话分配在同一个队列里,从而需要共享发包的机会,也就是共享带宽。为了不让这种效应太明显,SFQ 会频繁地改变散列算法,以便把这种效应控制在几秒钟之内。
有很重要的一点需要声明:只有当你的出口网卡确实已经挤满了的时候,SFQ 才会起作用。否则在你的Linux 机器中根本就不会有队列,SFQ 也就不会起作用。特别地,在你使用DSL modem 或者cable modem 的以太网卡上设置SFQ 是没有意义的,无需进一步整形。
参数与使用
SFQ 基本上不需要手工调整:
perturb
多少秒后重新配置一次散列算法。如果取消设置,散列算法将永远不会重新配置(不建议这样做)。10 秒应该是一个合适的值。
quantum
一个流至少要传输多少字节后才切换到下一个队列。缺省设置为一个最大包的长度(MTU 的大小)。不要设置这个数值低于MTU。
配置范例
如果有一块网卡,它的链路速度与实际可用速率一致,如下配置可以提高公平性:
# tc qdisc add dev enp0s5 root sfq perturb 10?
# tc -s -d qdisc ls?dev enp0s5
qdisc sfq 8001: root refcnt 2 limit 127p quantum 1514b depth 127 flows 128/1024 divisor 1024 perturb 10sec
Sent 1863 bytes 22 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
“8001:”这个号码是系统自动分配的一个句柄号,“limit”意思是这个队列中可以有127 个数据包排队等待。一共可以有1024 个散列目标可以用于速率审计, 而其中128 个可以同时激活。每隔10 秒散列算法更换一次。
内容总结
以上是互联网集市为您收集整理的Linux内核TC工具链路带宽设计--无类队列规定全部内容,希望文章能够帮你解决Linux内核TC工具链路带宽设计--无类队列规定所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。