Red Hat Training

A Red Hat training course is available for RHEL 8

第 26 章 Linux 流量控制

Linux 提供管理和操作数据包传输的工具。Linux 流量控制(TC)子系统帮助进行策略、分类、控制以及调度网络流量。TC 还可以通过使用过滤器和动作在分类过程中利用数据包内容分栏。TC 子系统使用排队规则(qdisc)来达到此目的,这是 TC 构架的一个基本元素。

调度机制在进入或退出不同的队列前确定或者重新安排数据包。最常见的调度程序是先入先出(FIFO)调度程序。您可以使用 tc 实用程序或永久使用 NetworkManager 进行 qdiscs 操作。

本节介绍了排队规则,并描述了如何更新 RHEL 中的默认 qdiscs

26.1. 排队规则概述

排队规则(qdiscs)可帮助查询以及稍后使用网络接口调度流量传输。qdisc 有两个操作:

  • 启用队列请求,以便可以排队数据包以便稍后进行传输
  • 取消队列请求,以便可以选择队列数据包之一以进行即时传输。

每个 qdisc 都有一个名为 handle 的 16 位十六进制数字,带有一个附加的冒号,如 1:abcd:。这个数字被称为 qdisc 主数字。如果 qdisc 有类,则标识符为一个由两个数字组成的对,主数字在次数字之前,<major>:<minor>,例如 abcd:1。次数字的编号方案根据 qdisc 类型而定。有时,编号是系统性的,第一类有 ID <major>:1、第 2 类 <major>:2等。一些 qdiscs 允许用户在创建类时随机设置类次要数字。

Classful qdiscs

存在不同的 qdiscs 类型,有助于将数据包传送到网络接口或从网络接口传输。您可以使用 root、parent 和 child 类配置 qdiscs。子对象可以被附加的位置被称为 class。qdisc 中的类灵活,可以包括多个子类或一个子类 qdisc。对于包含类 qdisc 本身的类没有问题,这会导致复杂的流量控制场景。类 qdiscs 本身不存储任何数据包。反之,它们根据 qdisc的具体条件把子队列和出队请求降到他们的子对象中。最后,这个递归数据包传递最终结束保存数据包的位置(在出现排队时从中提取)。

无类别 qdiscs

一些 qdiscs 不包含子类,它们名为无类别 qdiscs。与类 qdiscs 相比,无类别 qdiscs 需要较少的定制。通常情况下,将它们附加到接口就足够了。

其它资源

  • 有关无类别和等级 qdiscs 的详细信息,请参考 tc(8) man page。
  • 有关动作的详情请参考 actionstc-actions.8 man page。

26.2. RHEL 中可用的 qdiscs

每个 qdisc 都处理唯一的与网络相关的问题。以下是 RHEL 中可用的 qdiscs 列表。您可以使用以下 qdisc 中的任何一种来根据您的网络要求控制网络流量。

表 26.1. RHEL 中的可用调度程序

qdisc 名称包含在卸载支持

异步传输模式(ATM)

kernel-modules-extra

 

基于类的队列

kernel-modules-extra

 

基于数据的 Shaper

kernel-modules-extra

CHOose 和 Keep 用于有响应的流量,CHOose 和 Kill 用于没有响应的流量(CHOKE)

kernel-modules-extra

 

受控的延迟(CoDel)

kernel-core

 

提供了 Robin(DRR)

kernel-modules-extra

 

Differentiated Services marker (DSMARK)

kernel-modules-extra

 

Enhanced Transmission Selection (ETS)

kernel-modules-extra

Fair Queue (FQ)

kernel-core

 

Fair Queuing Controlled Delay (FQ_CODel)

kernel-core

 

Generalized Random Early Detection (GRED)

kernel-modules-extra

 

Hierarchical Fair Service Curve (HSFC)

kernel-core

 

Heavy-Hitter Filter (HHF)

kernel-core

 

Hierarchy Token Bucket (HTB)

kernel-core

 

INGRESS

kernel-core

Multi Queue Priority (MQPRIO)

kernel-modules-extra

Multiqueue (MULTIQ)

kernel-modules-extra

Network Emulator (NETEM)

kernel-modules-extra

 

Proportional Integral-controller Enhanced (PIE)

kernel-core

 

PLUG

kernel-core

 

Quick Fair Queueing (QFQ)

kernel-modules-extra

 

Random Early Detection (RED)

kernel-modules-extra

Stochastic Fair Blue (SFB)

kernel-modules-extra

 

Stochastic Fairness Queueing (SFQ)

kernel-core

 

Token Bucket Filter (TBF)

kernel-core

Trivial Link Equalizer (TEQL)

kernel-modules-extra

 
重要

qdisc 卸载需要在 NIC 上支持硬件和驱动程序。

其它资源

  • 如需用于配置 qdiscs 的参数和过滤器的完整信息,请参阅 tc(8)cbqcbschoke, CoDeldrrfq htbmqprionetempiesfbpfifotc-redsfqtbfprio man page。

26.3. 使用 tc 工具检查网络接口的 qdiscs

默认情况下,Red Hat Enterprise Linux 系统使用 fq_codel qdisc。这个步骤描述了如何检查 qdisc 计数器。

流程

  1. 可选:查看您当前的 qdisc

    # tc qdisc show dev enp0s1

  2. 检查当前的 qdisc 计数器:

    # tc -s qdisc show dev enp0s1
    qdisc fq_codel 0: root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5.0ms interval 100.0ms memory_limit 32Mb ecn
    Sent 1008193 bytes 5559 pkt (dropped 233, overlimits 55 requeues 77)
    backlog 0b 0p requeues 0
    ....
  • dropped - 由于所有队列已满而使数据包被丢弃的次数
  • overlimits - 配置的链路容量已满的次数
  • sent - 出队的数量

26.4. 更新默认的 qdisc

如果使用当前的 qdisc 观察网络数据包丢弃的事件,您可以根据您的网络需要更改 qdisc。您可以选择 qdisc来满足您的网络要求。这个步骤描述了如何更改 Red Hat Enterprise Linux 的默认 qdisc

流程

  1. 查看当前的默认 qdisc

    # sysctl -a | grep qdisc
    net.core.default_qdisc = fq_codel
  2. 查看当前以太网连接的 qdisc

    # tc -s qdisc show dev enp0s1
    qdisc fq_codel 0: root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5.0ms interval 100.0ms memory_limit 32Mb ecn
    Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
    backlog 0b 0p requeues 0
    maxpacket 0 drop_overlimit 0 new_flow_count 0 ecn_mark 0
    new_flows_len 0 old_flows_len 0
  3. 更新现有 qdisc:

    # sysctl -w net.core.default_qdisc=pfifo_fast

  4. 要应用这些更改,请重新载入网络驱动程序:

    # rmmod NETWORKDRIVERNAME

    # modprobe NETWORKDRIVERNAME

  5. 启动网络接口:

    # ip link set enp0s1 up

验证步骤

  • 查看以太网连接的 qdisc:

    # tc -s qdisc show dev enp0s1
    qdisc pfifo_fast 0: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
     Sent 373186 bytes 5333 pkt (dropped 0, overlimits 0 requeues 0)
     backlog 0b 0p requeues 0
    ....

其它资源

26.5. 使用 tc 工具临时设置网络接口的当前 qdisk

您可以在不更改默认文件的情况下更新当前的 qdisc。这个步骤描述了如何更改 Red Hat Enterprise Linux 中当前的 qdisc

流程

  1. 可选:查看当前 qdisc:

    # tc -s qdisc show dev enp0s1

  2. 更新当前的 qdisc:

    # tc qdisc replace dev enp0s1 root htb

验证步骤

  • 查看更新的当前 qdisc

    # tc -s qdisc show dev enp0s1
    qdisc htb 8001: root refcnt 2 r2q 10 default 0 direct_packets_stat 0 direct_qlen 1000
    Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
    backlog 0b 0p requeues 0

26.6. 使用 NetworkManager 永久设置网络接口的当前 qdisk

您可以更新网络管理器连接的当前 qdisc 值。

流程

  1. 可选:查看当前 qdisc:

    # tc qdisc show dev enp0s1
      qdisc fq_codel 0: root refcnt 2
  2. 更新当前的 qdisc:

    # nmcli connection modify enp0s1 tc.qdiscs ‘root pfifo_fast’

  3. 可选: 要比现有的 qdisc 添加另一个 qdisc,使用 +tc.qdisc 选项:

    # nmcli connection modify enp0s1 +tc.qdisc ‘ingress handle ffff:’

  4. 激活更改:

    # nmcli connection up enp0s1

验证步骤

  • 查看当前 qdisc 网络接口:

    # tc qdisc show dev enp0s1
    qdisc pfifo_fast 8001: root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
    qdisc ingress ffff: parent ffff:fff1 ----------------

其它资源

  • 如需更多信息,请参阅 nm-settings(5) man page。