Linux 高级流量控制
原文链接:https://www.ibm.com/developerworks/cn/linux/1412_xiehy_tc/index.html
Linux 高级流量控制
本篇主要讲用 TC 对 Linux 进行高级流量控制
通过大量实践结合 TC 流控 HOWTO 文档整理而得
如果你对 Linux 流控感兴趣,如果你需要搭建高性能的 Linux 网关 , 本文将会使你受益颇多。
注:至少具备 Linux OS 的中级水平知识,熟悉 TCP/IP, Linux 网卡工作原理,以及配置 Linux 网关的经验,将有助于对本文的理解。
本文参考文档:
Tc 流控 HOWTO 文档 http://www.tldp.org/HOWTO/html_single/Traffic-Control-HOWTO/
Linux TC 流量控制工具 http://wenku.baidu.com/view/f02078db50e2524de5187e45.html
一 . Linux 流控简介
Linux 流控的意义 :
有效的控制 Linux 网卡进出流量 , 了解网卡工作原理 , 搭建高性能的 Linux 网关 , 对 Linux 高级系统流控有进一步的认识。
Linux 流量控制方法 :
控发不控收 , 所以只能对产生瓶颈网卡处的发包速率进行控制 , 而网络瓶颈分析亦为 Linux 网络流控的第一步 .
Linux 流量控制过程分二种:
- 队列控制 即 QOS, 瓶颈处的发送队列的规则控制,常见的有 SFQ PRIO
- 流量控制 即带宽控制 , 队列的排队整形, 一般为 TBF HTB
Linux 流量控制算法分二种:
- 无类算法 用于树叶级无分支的队列,例如:SFQ
- 分类算法 用于多分支的队列,例如:PRIO TBF HTB
Linux 流控实现工具 TC:
Linux 下流量控制工具 , 从 Linux2.2 版开始已并入内核,功能非常强大, 详见参考文档。
二 . 以下文章将以二种算法的不同流控分别介绍:
1. 无类算法 SFQ
a. 队列控制的无类算法 SFQ
SFQ(Stochastic Fairness Queueing 随机公平队列 ) 是公平队列算法家族中的一个简单实现 . 它的精确性不如其它的方法 , 但实现了高度的公平 , 需要的计算量亦很少 .
SFQ 算法主要针对一个 TCP 会话或者 UDP 流 . 流量被分成相当多数量的 FIFO 队列中 , 每个队列对应一个会话 . 数据按照简单轮转的方式发送 , 每个会话都按顺序得到发送机会 . 这种方式非常公平 , 保证了每一个会话都不会没其它会话所淹没 .
SFQ 之所以被称为"随机", 是因为它并不是真的为每一个会话创建一个队列 , 而是使用一个散列算法 , 把所有的会话映射到有限的几个队列中去 . 因为使用了散列 , 所以可能多个会话分配在同一个队列里 , 从而需要共享发包的机会 , 也就是共享带宽 . 为了不让这种效应太明显 ,SFQ 会频繁地改变散列算法 , 以便把这种效应控制在几秒钟之内 ( 时间由参数设定 ).
注 :SFQ 只会发生在数据发生拥堵 , 产生等待队列的网卡上 .. 出口网卡若无等待队列 ,SFQ 亦不起作用 ...
清单 1. 在网卡上建立 SFQ
1 2 3 4 5 |
|
SFQ 队列一般用在树叶级 , 配合其它流量整形算法一并使用……
b. 流量控制的无类算法 TBF
令牌桶过滤器 (TBF) 是一个简单的队列规定 : 只允许以不超过事先设定的速率到来的数据包通过 , 但可能允许短暂突发流量朝过设定值 .
TBF 很精确 , 对于网络和处理器的影响都很小 , 实现是针对数据的字节数进行的 , 而不是针对数据包进行 , 常用于网关限速 .
TBF 的实现在于一个缓冲器 ( 桶 ), 不断地被一些叫做"令牌"的虚拟数据以特定速率填充着 . (token rate). 桶最重要的参数就是它的大小 , 也就是它能够存储令牌的数量 . 每个到来的令牌从数据队列中收集一个数据包 , 然后从桶中被删除 . 这个算法关联到两个流上——令牌流和数据流 , 于是我们得到 3 种情景 :
A. 数据流以等于令牌流的速率到达 TBF. 这种情况下 , 每个到来的数据包都能对应一个令牌 , 然后无延迟地通过队列 .
B. 数据流以小于令牌流的速度到达 TBF. 通过队列的数据包只消耗了一部分令牌 , 剩下的令牌会在桶里积累下来 , 直到桶被装满 . 剩下的令牌可以在需要以高于令牌流速率发送数据流的时候消耗掉 , 这种情况下会发生突发传输 .
C. 数据流以大于令牌流的速率到达 TBF. 这意味着桶里的令牌很快就会被耗尽 . 导致 TBF 中断一段时间 , 称为"越限". 如果数据包持续到来 , 将发生丢包 . 此种情况最重要 , 因为它可以用来对数据通过过滤器的速率进行整形 . 令牌的积累可以导致越限的数据进行短时间的突发传输而不必丢包 , 但是持续越限的话会导致传输延迟直至丢包 .
清单 2. 在网卡建立 TBF
1 2 3 4 |
|
rate 限制的传输速率 用位来计算
latency 确定了一个包在 TBF 中等待传输的最长等待时间 .
burst 桶的大小 , 以字节计 . 指定了最多可以有多少个令牌能够即刻被使用 .
注 : 管理的带宽越大 , 需要的缓冲器就越大 . 在 Intel 体系上 ,10 兆 bit/s 的速率需要至少 10k 字节的缓冲区
才能达到期望的速率 . 缓冲区太小导致潜在的丢包 .
c. 无类算法除这二种队列以外 , 另有 pfifo_fast( 网卡出口默认根队列规定 )
经常使用的也就是 SFQ/TBF ……
这二种用法如下:
单纯地降低出口速率 , 使用令牌桶过滤器 . 调整桶的配置后可用于控制很高的带宽 .
链路已经塞满 , 保证不会有某一个会话独占出口带宽 , 使用随机公平队列 .
当然最要的还是工作中得来的经验 , 就其应用方面只要能满足需求即可 .. 要做到灵活应用还得大量的实践 ..
2. 分类算法 —— PRIO/CBQ/HTB
分类算法主要作用是可以对多种数据流区别对待 . 一旦数据包进入一个分类的队列规定 , 它就得被送到某一个类中分类 , 对数据包进行分类的工具是过滤器 . 过滤器会返回一个决定 , 队列规定就根据这个决定把数据包送入相应的类进行排队 . 每个子类都可以再次使用它们的过滤器进行进一步的分类 . 直到不需要进一步分类时 , 数据包才进入该类包含的队列规定排队 . 除了能够包含其它队列规定之外 , 绝大多数分类的队列规定能够流量整形
注 : 过滤器对数据包进行分类的工具 , 是从队列规定内部调用的 , 而不是从别处 .( 用在分叉的分支上 )
列规定家族 : 根 , 句柄 , 兄弟和父辈
每块网卡都有一个出口"根队列规定", 缺省情况下是前面提到的 pfifo_fast 队列规定 . 每个队列规定都指定一个句柄 , 以便以后的配置语句能够引用这个队列规定 . 除了出口队列规定之外 , 每块网卡还有一个入口 , 以便 policies 进入的数据流 .
队列规定的句柄有两个部分 : 一个主号码和一个次号码 . 习惯上把根队列规定称为"1:", 等价于"1:0". 队列规定的次号码永远是 0. 类的主号码必须与它们父辈的主号码一致 .
数据包如何出队并交给硬件
当内核决定把一个数据包发给网卡的时候 , 根队列规定 1: 会得到一个出队请求 , 然后把它传给 1:1, 然后依次传给 10:,12: 和 13:( 子类自定义 ), 然后试图从它们中进行 dequeue() 操作 . 也就是说 , 内核需要遍历整颗树 , 换句话说 , 类及其兄弟仅仅与其"父队列规定"进行交谈 , 而不会与网卡进行交谈 . 只有根队列规定才能由内核进行出队操作 ! 更进一步 , 任何类的出队操作都不会比它们的父类更快 . 我们可以把 SFQ 作为一个子类 , 放到一个可以进行流量整形的父类中 , 从而能够同时得到 SFQ 的调度功能和其父类的流量整形功能 .
a. 队列控制的分类算法 PRIO
PRIO 分类优先算法 ( 从左至右优先发包 ), 队列规定并不进行整形 , 它仅仅根据你配置的过滤器把流量进一步细分 . 你可以认为 PRIO 队列规定是 pfifo_fast 的一种衍生物 , 区别在每个频道都是一个单独的类 , 而非简单的 FIFO.
当数据包进入 PRIO 队列规定后 , 将根据你给定的过滤器设置选择一个类 . 缺省情况下有三个类 , 这些类仅包含纯 FIFO 队列规定而没有更多的内部结构 . 你可以把它们替换成你需要的任何队列规定 . 每当有一个数据包需要出队时 , 首先处理 :1 类 . 只有当标号更小的类中没有需要处理的包时 , 才会标号大的类 .
PRIO 配置范例示意图:
大批量数据使用 30:, 交互数据使用 20: 或 10:.
清单 3. 在网卡建立 PRIO
1 2 3 4 5 6 |
|
主要参数有 :( 后续有实例 )
bands 创建频道的数目 . 每个频道实际上就是一个类 跟 priomap 参数配合使用
注 : 频道是类 , 缺省情况下命名为主标号 :1 到主标号 :3. 如果你的 PRIO 队列规定是 12:, 把数据包过滤到
12:1 将得到最高优先级 . 0 频道的次标号是 1!1 频道的次标号是 2, 以此类推 .
priomap 给 tc 提供过滤器 , 如不提供 PRIO 队列规定将参考 TC_PRIO 的优先级来决定如何给数据包入队 .
b. 流量整形的分类算法 CBQ
CBQ 的工作机制是确认链路的闲置时间足够长 , 以达到降低链路实际带宽的目的 . 为此 , 它要计算两个数据包的平均发送间隔 . 操作期间 , 有效闲置时间的测量使用 EWMA(exponential weighted moving average, 指数加权移动均值 ) 算法 , 也就是说最近处理的数据包的权值比以前的数据包按指数增加 .UNIX 的平均负载也是这样算出来的 . 计算出来的平均时间值减去 EWMA 测量值 , 得出的结果叫做"avgidle". 最佳的链路负载情况下 , 这个值应当是 0: 数据包严格按照计算出来的时间间隔到来 . 在一个过载的链路上 ,avgidle 值应当是负的 . 如果这个负值太严重 ,CBQ 就会暂时禁止发包 , 称为"overlimit"( 越限 ). 相反地 , 一个闲置的链路应该有很大 avgidle 值 , 这样闲置几个小时后 , 会造成链路允许非常大的带宽通过 . 为了避免这种局面 , 我们用 maxidle 来限 avgidle
的值不能太大 .
理论上讲 , 如果发生越限 ,CBQ 就会禁止发包一段时间 ( 长度就是事先计算出来的传输数据包之间的时间间隔 ), 然后通过一个数据包后再次禁止发包 .
清单 4. WEB 服务器的流量控制为 5Mbps,SMTP 流量控制在 3Mbps 上 . 而且二者一共不得超过 6Mbps, 互相之间允许借用带宽
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
CBQ 流量整形算法相对比较复杂 , 工作中还常用 ... 示例中的各参数请参阅 :HOWTO 中文文档 ..Linux 流量控制 II--- 分类算法 PRIO/CBQ/HTB
c. 流量整形的分类算法 HTB
HTB(Hierarchical Token Bucket) 分层的令牌桶一个分类的令牌桶过滤器 , 工作原理和相关配置同于 TBF.. 拥有 TBF 的各项性能 , 可参阅 TBF 的工作细节 ...
清单 5. 环境与要求同上述 CBQ 的例子
1 2 3 4 5 6 7 8 9 10 11 12 |
|
三 . Linux 流量控制之 U32 过滤规则
过滤器是对数据包进行分类工具 , 过滤器用与把数据包分类并放入相应的子队列 , 这些过滤器在分类的队列规定内部被调用 . 为了决定用哪个类处理数据包 , 必须调用所谓的"分类器链" 进行选择 . 这个链中包含了这个分类队列规定所需的所有过滤器 . 常用到的为 U32 过滤器
分类的一示例图:
当一个数据包入队的时候 , 每一个分支处都会咨询过滤器链如何进行下一步 . 典型的配置是在 1:1 处有一个过滤器把数据包交给 12:, 然后 12: 处的过滤器在把包交给 12:2. 你可以把后一个过滤器同时放在 1:1 处 , 而得到效率的提高 .
另外 , 你不能用过滤器把数据包向"上"送 . 而且 , 使用 HTB 的时候应该把所有的规则放到根上 ..
注 : 数据包只能向"下"进行入队操作 ! 只有处队的时候才会上到网卡所在的位置来 . 他们不会落到树的最
底层后送到网卡 ...
清单 6. 过滤器过滤示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
常用到的过滤命令一览
1 |
|
根据源 / 目的地址
源地址段 'match ip src 1.2.3.0/24'
目的地址段 'match ip dst 4.3.2.0/24'
单个 IP 地址 'match ip 1.2.3.4/32'
根据源 / 目的端口 , 所有 IP 协议
源 'match ip sport 80 0xffff' 0xffff 表所有数据包
目的 'match ip dport 80 0xffff'
根据 IP 协议 (tcp, udp, icmp, gre, ipsec)
icmp 是 1:'match ip protocol 1 0xff' 1 是根据 /etc/protocols 协议号来定
根据 fwmark
1 2 |
|
注 :handle 根据过滤器的不同 , 含义也不同
按 TOS 字段
1 |
|
flowid 1:4 选择交互和最小延迟的数据流 匹配大量传输 , 使用"0x08 0xff".
1 |
|
at 0 flowid 1:10 匹配那些 TOS 字段带有'最小延迟'属性的数据包
四 . Linux 流量控制 --- 实例解析
以下实例由实际工作环境要求编写而得:
1. PRIO 分类优先算法 ( 从左至右优先发包 )
网卡工作示例图:
清单 7. PRIO 分类优先算法示例 ( 从左至右优先发包 )
1 2 3 4 5 6 7 8 9 10 11 12 |
|
2. HTB 分层令牌桶
网卡工作示例图:
清单 8. HTB 分层令牌桶示例
1 2 3 4 5 6 7 8 9 10 11 |
|
3. ADSL 上网流量限控脚本
ADSL 带宽是下行 3200Kbit, 上行只有 320Kbit
网卡工作示例图:
清单 9. 上网流量限控脚本示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
1:11 最高优先级的数据包通道优先通过 , 主要为一些 ACK SYN 确认包 .. 必要时全部占用 .. 全速
1:12 是很重要的数据道 , 给多点 , 最少给一半 , 但需要时可以再多一点 .
rate 规划 1:2 = 1:21 + 1:22 + 1:23 + 1:24 一般总数在 50%-80% 左右
1:21 http,pop 最常用 , 人数较多 , 易导致堵塞 , 不能给得太多 , 但不益太少 .
1:22 smtp 通道 , 优先低于 1:21 以防发大的附件大量占用带宽
1:23 ftp-data 数据通道可能大量上传文件 ,rate 不能给得太多 ,ceil 设置大些 ( 其它通道剩余带宽应用 )
1:24 无所谓通道 , 就是一般不是平时工作上需要的通道了 , 给小点 , 防止这些人在妨碍有正常工作需要的人
其次的工作即在 iptables 端对相应数据包打上标记 ...
4. Linux+NAT+TC
脚本是 Linux NAT 网关实例 , 根据此脚本思路 , 可进一步细致的进行针对于数据包的限制 ..
清单 10. Linux Nat 网关实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
5. Linux 网关 / 服务器限速 ---HTB
清单 11. Linux 网关 / 服务器 HTB 限速
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
Linux 高级流量控制相关推荐
- linux设置sfq队列参数,Linux系统运维之Linux高级流量控制工具TC使用方法
Linux系统运维之Linux高级流量控制工具TC使用方法 本文标签: 运维 流量劫持 Linux系统运维之Linux高级流量控制工具TC使用方法, 在做MHA测试的时候,有一个重要的环节就是测试MH ...
- 《Linux 高级路由与流量控制手册(2012)》第九章
更多奇技淫巧欢迎订阅博客:https://fuckcloudnative.io 译者序 本文内容来自 Linux Advanced Routing & Traffic Control HOWT ...
- Linux高级路由---策略路由/捆绑/网桥
Linux高级路由---策略路由/捆绑/网桥 1.策略路由 基于策略的路由比传统路由在功能上更强大,使用更灵活,它使网络管理员不仅能够根据目的地址而且能够根据报文大小.应用或IP源地址来选择转 ...
- linux的流量控制
ip命令在linux上实现绝大部分专业路由器上实现的一部分功能,另一个命令tc实现了专业路由器上实现的几乎另一部分功能,而iptable一来,剩余的功能它就全包了,如果再加运行一个zebra的话,li ...
- linux web高级编程,寒假学习 第16.17天 (linux 高级编程)
寒假学习 第16.17天 (linux 高级编程) 笔记 总结 一.进程的基本控制(进程的同步) 1.进程的常见控制函数 pause sleep/usleep atexit on_exit i ...
- 《Linux 高级程序设计(第三版)》——导读
** 前言 ** Linux应用开发是目前最为广泛的软件开发内容之一,同时也是从事Linux内核及驱动开发的基础.<Linux高级程序设计>一书经过两次出版,收到了大量的读者来信,对本书提 ...
- linux认证授权系统,linux高级操作系统用户认证与授权-20210323002921.doc-原创力文档...
HYPERLINK "/" 长沙理工大学 <Linux高级操作系统>课程设计报告 基于Linux的用户认证与授权研究 廖正磊 学 院 计算机与通信工程 专业 计算机科学 ...
- Linux高级存储管理
Linux高级存储管理 1实验准备 2 lvm (逻辑卷管理) 2.1 lvm设备建立 2.2 lvm拉伸 2.2.1 当vg中容量充足 2.2.2 当vg中容量不足 2.3 lvm缩减 2.3.1 ...
- linux 解析pdf下载工具,Linux高级系统级性能分析工具-perf.pdf
Linux高级系统级性能分析工具-perf Linux 的系统级性能剖析工具‐perf (二) 承刚 TAOBAO Kernel Team chenggang.qin@ 第三章 Perf top ...
最新文章
- 新生选课系统使用指南
- Jvm常见面试题及答案汇总1000道(春招+秋招+社招)
- Java刷题知识点之方法覆盖(方法重写)和方法重载的区别
- Mac OS使用技巧之十:Finder的详细使用方法
- 笛卡尔乘积算法的体现
- Qt工作笔记-QFileSystemModel创建文件系统信息模型
- iis的web站点配置
- Starter Kit for ASP.NET 2.0 家族又添新丁!
- android canvas 工作流_行情艰难,Android初中级面试题助你逆风翻盘,每题都有详细答案...
- Java实现 LeetCode 514 自由之路
- php物料编码生成器,物料编码生成器下载|
- 杭电ACM2030题
- mac下安装nginx+php+mysql
- 两个方法教你彻底解决win10系统更新补丁安装失败的问题
- 王天官系古盐山县(今孟村县王帽圈)人
- 2362:数字游戏(小k和小p的传奇)
- 10个全网最具创意的聊天机器人:漫威和联合国儿童基金会都在尝试使用聊天机器人
- Java_167_Thread_线程安全synchronized_模拟选座_List「Integer」
- uni-app——如何获取页面容器的高度
- Netty 超时机制及心跳程序实现