2006 年 4 月
修订历史 | ||
---|---|---|
修订版 1.0.1 | 2006-10-28 | 修订者:MAB |
更新联系信息 | ||
修订版 1.0 | 2003-04-16 | 修订者:tab |
初始版本,由 LDP 审核 | ||
修订版 0.5 | 2002-04-01 | 修订者:MAB |
提交到 tldp,使用 HOWTO 重命名/重定标题 | ||
修订版 0.4 | 2002-03-31 | 修订者:MAB |
新示例,Bucket 速成课程 | ||
修订版 0.3 | 2002-03-16 | 修订者:MAB |
来自 Jacob Teplitsky、raptor 和 Joshua Heling 的更正和注释 | ||
修订版 0.2 | 2002-03-15 | 修订者:MAB |
链接、清理、发布 | ||
修订版 0.1 | 2002-03-14 | 修订者:MAB |
初始修订 |
� 2006, Martin A. Brown
根据 GNU 自由文档许可证 1.1 版或自由软件基金会发布的任何更高版本的条款,允许复制、分发和/或修改本文档;没有任何不变部分,没有封面文本,没有封底文本。许可证副本位于 www.gnu.org/copyleft/fdl.html。
这是一个简短的教程,介绍如何将 tcng (流量控制下一代) 与 HTB (分层令牌桶) 结合使用,以便在 Linux 机器上执行流量整形。
本教程适用于具有以下条件的系统管理员:
至少,对流量控制有基本的了解
能够从源代码编译 iproute2 和 tcng
或能够从提供的 SRPM 构建 RPMS
要么是支持 htb 和 dsmark 的模块化内核
要么能够编译一个支持 htb 和 dsmark 的内核
![]() | 本文既不全面也不权威。作者征求积极和消极的反馈<martin@linux-ip.net>。 始终欢迎更正、补充和进一步的示例。 |
流量控制是指网络或网络设备中的整个数据包排队子系统。流量控制由几个不同的操作组成。分类是一种识别数据包并将它们放入单个流或类别的机制。策略是一种限制与特定分类匹配的流中的数据包或字节数量的机制。调度是决策过程,通过该过程对数据包进行排序和重新排序以进行传输。整形是通过延迟和传输数据包来产生均匀且可预测的流速的过程。
流量控制系统的这些许多特性可以以复杂的方式组合在一起,以为特定流(或应用程序)保留带宽,或限制特定流或应用程序可用的带宽量。
流量控制的关键概念之一是令牌的概念。策略或整形实现需要计算以什么速率传递了多少字节或数据包。每个数据包或字节(取决于实现)对应于一个令牌,并且策略或整形实现仅在其具有可用令牌时才传输或传递数据包。实现保持其令牌的常见隐喻容器是 Bucket。简而言之,Bucket 表示可以立即使用的令牌数量(Bucket 的大小)以及令牌补充的速率(Bucket 重新填充的速度)。
有关 linux 流量控制系统中的 Bucket 示例,请参见第 1.2 节。
在 linux 下,流量控制在历史上一直是一项复杂的工作。 tc 命令行工具提供了一个接口,用于连接内核结构,这些内核结构执行整形、调度、策略和分类。但是,此命令的语法很神秘。 tcng 项目通过在强大的 tc 命令行工具之上分层一种语言,从而为人类提供了一种更加友好的界面。通过以 tcng 编写流量控制配置,它们变得易于维护,不那么神秘,并且重要的是也更具可移植性。
分层令牌桶是由 Martin Devera 编写的一个有类别的 qdisc,它具有比 CBQ 更简单的一组配置参数。在作者的网站上以及在 Stef Coene 的网站上,都有大量关于 HTB 及其用途的文档。以下是 HTB 系统的简要概述。
从概念上讲,HTB 是以层次结构排列的任意数量的令牌桶(是的,你可能无需我说也能弄清楚)。让我们考虑最简单的情况。任何设备上的主要出口排队规则都称为rootqdisc。
该rootqdisc 将包含一个类别(复杂情况可能会将多个类别附加到rootqdisc)。 此单个 HTB 类将使用两个参数设置,即rate和ceil。 对于顶级类,这些值应相同,并且将表示链路上的总可用带宽。
在 HTB 中,rate表示给定类别可用的保证带宽,并且ceil是 ceiling 的缩写,表示允许该类别消耗的最大带宽。 在rate和ceil之间使用的任何带宽都是从父类借用的,因此建议rate和ceil在顶级类中相同。
可以在此类下创建许多子类,每个子类都可以从父类分配一些可用带宽。 在这些子类中,rate和ceil参数值不必与建议的父类相同。 这使你可以为特定类别保留指定数量的带宽。 它还允许 HTB 计算可用带宽的分配比率与类别本身的比率。 这在下面的示例中应该更加明显。
分层令牌桶为 linux 流量控制系统实现了一个有类别的排队机制,并提供了rate和ceil允许用户控制特定流量类别的绝对带宽,并指示当额外带宽可用时带宽的分配比率(最多ceil).
在为顶级类选择带宽时,请记住,只有当你成为 LAN 和 Internet 之间的瓶颈时,流量整形才会有所帮助。 通常,这种情况发生在家庭和办公网络环境中,在这些环境中,整个 LAN 都由 DSL 或 T1 连接提供服务。
实际上,这意味着你应该将顶级类的带宽设置为可用带宽减去该带宽的一小部分。
流量控制下一代 (tcng) 是 Werner Almesberger 的一个项目,旨在提供一种强大、抽象且统一的语言来描述流量控制结构。 tcng 发行版中的 tcc 解析器将 tcng 语言转换为多种输出格式。 默认情况下, tcc 将读取文件(指定为参数或 STDIN)并将创建内核中所需的流量控制结构所需的一系列 tc 命令(请参阅下面的 iproute2)打印到 STDOUT。
查阅 tcng 的参数参考以查看支持的排队规则。 Jacob Teplitsky, LARTC 邮件列表的活跃用户以及 tcng 项目的贡献者,为 tcng 编写了 htb 支持。
tcc 工具可以生成多种不同类型的输出,但是本文档仅考虑常规输出和默认输出。 有关使用 tcng 的更多详细信息,请查阅 TCNG 手册。
tcsim 工具是一个流量控制模拟器,它接受 tcng 配置文件并读取一种控制语言,以模拟内核在发送和接收具有指定控制结构的数据包时的行为。 虽然 tcsim 是 tcng 项目的重要组成部分,但本文将不涉及 tcsim 。
内核支持 HTB 和 DSMARK、 tc 支持 HTB 和 DSMARK 以及 tcng 本身,需要满足一些要求。
具体来说,绝对需要内核和 tc 中的 HTB 支持才能使本教程具有远程可用性(如果对此有任何疑问,请参考标题)。 严格来说,DSMARK 支持是可选的,尽管某些 示例(特别是类选择路径,但也许是其他示例)可能在没有 dsmark 支持的情况下无法运行。
内核要求很容易满足。 内核 2.4.20 和更高版本包含对 HTB 和 dsmark 的支持,因此只需确保在内核配置的 QoS/公平排队部分中启用了这些选项。 有关在内核配置中选择的选项的简要概述,请访问 DiffServ 项目内核配置说明。
对于低于 2.4.20 的内核,应将以下 包含补丁的 tarball 应用于你的 2.4.17 或更高版本的内核树。
tc 命令是 iproute2 实用程序套件的一部分。 有关 iproute2 的常规文档,请参见 http://linux-ip.net/ 和 iproute2 手册。 该软件本身可直接从 Alexey Kuznetsov 的 FTP 存档获得,但通常也可以通过 linux 发行版提供的软件包获得。 如果你的发行版可以使用 RPMS,则可以下载此 SRPM 并在你自己的系统上编译它。
如果需要自己编译 iproute2 ,请使用 来自此 tarball 的 tc 补丁,网址为 Martin Devera 的 HTB 站点,以便在 tc 中提供对 HTB 的支持。
你的 tc 还需要支持 dsmark,即 diffserv 标记机制。 幸运的是,这是来自 iproute2 源代码包的Config文件的一个简单更改。 只需更改TC_CONFIG_DIFFSERV=n为TC_CONFIG_DIFFSERV=y然后重新编译。
SRPM 创建了一个支持 dsmark 和 HTB 的 tc 二进制文件,这两个文件都是此示例所必需的。
支持 tcng 是过程中最简单的部分。只需解压 tcng 源代码并运行./configure --no-tcsim然后再进行编译。
如果您使用的是基于 RPM 的系统,则可以使用以下文件中的 SPEC 文件tcng/build/tcng.spec为您的发行版构建,或者您可以下载并编译此 SRPM。该 SRPM 会生成两个软件包,tcc 和 tcc-devel。您只需要 tcc 即可创建配置。
为了运行 tcc 解析器,您还需要安装 cpp 包。tcc 使用 cpp。
此处显示的示例将是 此目录中可下载配置的修改版本。
这些示例可以用作独立的配置文件,馈入 tcc 解析器,或者可以与示例 SysV 启动脚本结合使用。该启动脚本是 raptor 在 LARTC 邮件列表中发布的脚本的修改版。
如果您要使用上面的启动脚本,请查看此示例/etc/sysconfig/tcng:
示例 1。/etc/sysconfig/tcng
# - tcng meta-configuration file # (I never meta-configuration file I didn't like) # # -- 2003-03-15 created; -MAB # -- 2003-03-31 modified to allow ENVAR override; -MAB # # -- this directory will hold all of the tcng configurations # used on this host # TCCONFBASEDIR=${TCCONFBASEDIR:-/etc/sysconfig/tcng-configs} # -- this is the active, desired tcng configuration # note, that, because tcng provides the #include construct, # the modularity of configuration can be built into the # configuration files in $TCCONFBASEDIR # TCCONF=${TCCONF:-$TCCONFBASEDIR/global.tcc} tcstats=${tcstats:-no} # -- will suppress statistical output tcstats=${tcstats:-yes} # -- will throw the "-s" option to tc tcdebug=${tcdebug:-0} # -- for typical startup script usage tcdebug=${tcdebug:-1} # -- for a bit of information about what's happening tcdebug=${tcdebug:-2} # -- for debugging information # # # -- an additional measure to take, you can override the default tc and tcc # command line utilities by specifying their pathnames here, for example: # # tc=/usr/local/bin/tc # tcc=/usr/local/tcng/bin/tcc # # |
许多通用概念将在此示例中介绍。可以使用以下命令将此示例编译为 tc 输出tccclass-selection-path.tcc.
示例 2。/etc/sysconfig/tcng/class-selection-path.tcc
/* * Simply commented example of a tcng traffic control file. * * Martin A. Brown <martin@linux-ip.net> * * Example: Using class selection path. * * (If you are reading the processed output in HTML, the callouts are * clickable links to the description text.) * */ #include "fields.tc" |
使用#include可以灵活地定义变量和包含常见的流量控制元素。
另请参阅 tcng 手册 关于包含。
有关更多详细信息,请参阅 tcng 手册 关于类选择路径。
名称和数字同样可以接受且有效。
参数rate和ceil对于任何使用过 HTB 的人都应该很熟悉。这些是 HTB 特定的参数,并由 tcc 实用程序正确翻译。请参阅关于 tcng 速率和速度规范的表格。
如果未为叶类指定排队规则,则它们包含默认的 pfifo_fast qdisc。在叶类中包含随机公平排队 qdisc 会抑制单个连接在给定类中占主导地位的能力。
示例 3。/etc/sysconfig/tcng/two-rate-three-color-meter.tcc
/* * Simply commented example of a tcng traffic control file. * * Martin A. Brown <martin@linux-ip.net> * * Example: Using a meter. * * (If you are reading the processed output in HTML, the callouts are * clickable links to the description text.) * */ #define EXCEPTION 192.168.137.50 #define INTERFACE eth0 $meter = trTCM( cir 128kbps, cbs 10kB, pir 256kbps, pbs 10kB ); |
此计量器是双速率三色计量器,它是 tcng 语言中最复杂的计量器。该计量器根据承诺和峰值存储桶中提供的速率返回颜色绿色、黄色和红色。如果计量速率超过承诺速率,则此计量器将变为黄色,如果计量速率超过峰值速率,则此计量器将变为红色。
变量$meter可以由适用于计量器类型的功能进行操作。在这种情况下,有三个功能可用于测试$meter的状态,trTCM_green, trTCM_yellow,以及trTCM_red。为了提高效率,还可以考虑 加速的对应项。
计量器为绿色。
计量器为黄色。
计量器为红色。
值得庆幸的是,tcng 消除了 tc 的一个小的烦恼。下表将这些工具的语法和约定与英语等效项进行了映射。
表 1. 速度/速率语法:tcng vs. tc
tcng | 英语 | tc |
---|---|---|
bps | 每秒比特数 | bit |
Bps | 每秒字节数 | bps (啊!) |
kbps | 每秒千比特数 | kbit |
kBps | 每秒千字节数 | kbps |
Mbps | 每秒兆比特数 | mbit 或 Mbit |
MBps | 每秒兆字节数 | mbps 或 Mbps |
pps | 每秒数据包数 | ?? |
请注意,这意味着长期使用 tc 的用户需要进行一些调整,但对于英语使用者来说,这是更直观的选择。
例如,我们可以在 tcng 配置中使用传统的速率表达式100Mbps, 128kbps,甚至2Gpps。另请参阅 tcng 手册 关于单位。
为了使流量控制有效,了解瓶颈所在非常重要。在大多数情况下,您需要在瓶颈处或附近执行流量控制。