Queues
本页介绍 MikroTik RouterOS 的队列和带宽管理,涵盖 HTB、PCQ、突发行为以及用于流量整形的队列类型,并说明如何配置简单队列和高级队列。
队列
本节介绍 RouterOS 的队列和带宽管理。您可以用它配置 HTB、PCQ、突发行为、队列大小以及用于流量整形的队列类型。
概述
队列是一组等待网络设备按预定义结构方法发送的数据包集合。队列的工作方式与银行或超市几乎相同:客户按照到达顺序接受服务。
队列用于:
- 限制特定 IP 地址、子网、协议、端口等的数据速率。
- 限制点对点流量。
- 数据包优先级排序。
- 配置流量突发以加速流量。
- 应用基于时间的不同限制。
- 在用户之间平均共享可用流量,或根据信道负载共享。
MikroTik RouterOS 中的队列实现基于分层令牌桶(HTB)。HTB 允许创建分层队列结构并确定队列之间的关系。这些分层结构可以附加在两个不同位置。数据包流图展示了 input 和 postrouting 链。
在 RouterOS 中配置队列有两种不同方式:
/queue/simple菜单 - 旨在简化日常简单队列任务(例如单个客户端上传/下载限制、p2p 流量限制等)的配置。/queue/tree菜单 - 用于实现高级队列任务(例如全局优先级策略和/user/group限制)。需要由/ip/firewall/mangle功能标记数据包流。
RouterOS 支持在 8 个级别配置队列 - 第一级是 /queue/interface 菜单中的接口队列,其余 7 级是可在 Queue Simple 和/或 Queue Tree 中创建的较低级队列。
速率限制原则
速率限制用于控制网络接口上发送或接收的流量速率。速率小于或等于指定速率的流量会被发送,而超过该速率的流量会被丢弃或延迟。
速率限制可以通过两种方式执行:
- 丢弃所有超过速率限制的数据包 - 速率限制(丢弃器或整形器) (当 queue-size=0 时为 100% 速率限制)。
- 将超过特定速率限制的数据包延迟到队列中,并在可行时发送 - 速率均衡(调度器)(当 queue-size=unlimited 时为 100% 速率均衡)。
下图说明速率限制与速率均衡之间的区别:

如您所见,在第一种情况下,所有超过特定速率的流量都会被丢弃。在另一种情况下,超过特定速率的流量会被延迟到队列中,并在可行时稍后发送,但请注意,只有在队列未满时才能延迟数据包。如果队列缓冲区没有更多空间,数据包会被丢弃。
对于每个队列,我们可以定义两个速率限制:
- CIR(承诺信息速率)- RouterOS 中的 limit-at。在最坏情况下,该流将获得此流量速率,不受其他流量流影响。在任何给定时间,带宽都不应低于此承诺速率。
- MIR(最大信息速率)- RouterOS 中的 max-limit。在最佳情况下,如果存在空闲带宽,该流可获得的最大数据速率。
简单队列
子菜单: /queue/simple
简单队列是为特定目标限制流量的直接方式。您还可以使用简单队列构建高级 QoS 应用。它们具有实用的集成功能:
- 点对点流量队列。
- 在选定的时间间隔应用队列规则。
- 优先级排序。
- 使用来自
/ip/firewall/mangle的多个数据包标记。 - 双向流量的流量整形(调度)(上传 + 下载总量使用一个限制)。
警告
简单队列有严格顺序 - 每个数据包必须依次经过每个队列,直到到达条件与数据包参数匹配的队列,或到达队列列表末尾。例如,有 1000 个队列时,发往最后一个队列的数据包需要先经过 999 个队列才能到达目的地。
警告
简单队列目标根据源地址和目标地址匹配数据包。如果源地址匹配目标,则为上传;如果目标地址匹配目标,则为下载。但是,如果某个连接的源地址和目标地址都匹配目标,则此类数据包始终会被计为下载,因为它们在两个方向上(每个单独数据包)都匹配目标地址,而在 RouterOS 中与目标比较时目标地址优先。简单队列的配置应确保流量只匹配源地址或目标地址,不会同时匹配两者。
流标识符
- target(多选:IP 地址/掩码或接口):Target 需要从目标的角度来看。如果要限制用户的上传能力,请设置 "target upload"。
这两个属性都可以用来确定哪个方向是目标上传、哪个是下载。请务必为同一个队列同时配置这两个选项 - 如果它们指向相反方向,队列将无法工作。如果既未指定 target 也未指定 interface,队列将无法区分上传和下载,并会把所有流量限制两次。
其他属性
- name(文本):唯一的队列标识符,可用作其他队列的 parent 选项值。
- direction(both | upload | download):指定要限制的方向:
- both - 同时限制下载和上传流量。
- upload - 仅限制到目标的流量。
- download - 仅限制来自目标的流量。
- time(TIME-TIME,sun,mon,tue,wed,thu,fri,sat - TIME 为本地时间,所有星期名称可选;默认:未设置):允许指定特定队列处于活动状态的时间。路由器必须具有正确的时间设置。
- dst-address(IP 地址/掩码):允许仅选择特定流(从目标地址到此目标地址)进行限制。
- packet-marks(以逗号分隔的数据包标记名称列表):允许使用
/ip/firewall/mangle中标记的数据包。请参阅 RouterOS 数据包流图。必须在简单队列之前(在 global-in HTB 队列之前)标记数据包,否则目标下载限制不会生效。global-in 之前唯一的 mangle 链是 prerouting。
HTB 属性
- parent(父简单队列名称,或 none):将此队列指定为所选目标的子队列。目标队列可以是 HTB 队列或任何先前创建的简单队列。为了让流量到达子队列,父队列必须捕获所有必要流量。
- priority(1..8):将一个子队列的优先级设置为高于另一个子队列。对父队列无效(如果该队列至少有一个子队列)。1 为最高优先级,8 为最低优先级。优先级较高的子队列有机会先于优先级较低的子队列达到其 max-limit。优先级与突发无关。
- queue(SOMETHING/SOMETHING):选择上传/下载队列类型。队列类型可在
/queue/type中创建。 - limit-at(NUMBER/NUMBER):保证提供给目标的正常上传/下载数据速率。
- max-limit(NUMBER/NUMBER):允许目标达到的最大上传/下载数据速率。
- burst-limit(NUMBER/NUMBER):突发活动期间可达到的最大上传/下载数据速率。
- burst-time(TIME/TIME):计算平均上传/下载数据速率的时间段(秒)。(这不是实际突发的时间)。
- burst-threshold(NUMBER/NUMBER):当平均数据速率低于此值时允许突发;一旦平均数据速率达到此值,就禁止突发(基本上是突发的开/关开关)。为获得最佳突发行为,此值应高于 limit-at 且低于 max-limit。
以及 global-total HTB 队列的对应选项:
- total-queue(SOMETHING/SOMETHING):对应 queue。
- total-limit-at(NUMBER/NUMBER):对应 limit-at。
- total-max-limit(NUMBER/NUMBER):对应 max-limit。
- total-burst-limit(NUMBER/NUMBER):对应 burst-limit。
- total-burst-time(TIME/TIME):对应 burst-time。
- total-burst-threshold(NUMBER/NUMBER):对应 burst-threshold。
良好实践建议:
所有子队列的 limit-at 值之和必须小于或等于父队列的 max-limit。每个子队列的 max-limit 必须小于父队列的 max-limit。这样可以为其他子队列保留一些流量,使它们无需与其他子队列争抢即可获得流量。
统计信息
- rate(只读/只读):队列通过的平均数据速率,单位为字节/秒。
- packet-rate(只读/只读):队列通过的平均数据速率,单位为数据包/秒。
- bytes(只读/只读):此队列处理的字节数。
- packets(只读/只读):此队列处理的数据包数。
- queued-bytes(只读/只读):队列中等待的字节数。
- queued-packets(只读/只读):队列中等待的数据包数。
- dropped(只读/只读):丢弃的数据包数。
- borrows(只读/只读):超过队列 "limit-at" 值通过的包(这些值未被使用,来自其他队列)。
- lends(只读/只读):低于队列 "limit-at" 值通过的包;如果队列是父队列,则为所有子队列借用包的总和。
- pcq-queues(只读/只读):如果队列类型为 PCQ,则为 PCQ 子流的数量。
以及 global-total HTB 队列的对应选项:
- total-rate(只读):对应 rate。
- total-packet-rate(只读):对应 packet-rate。
- total-bytes(只读):对应 bytes。
- total-packets(只读):对应 packets。
- total-queued-bytes(只读):对应 queued-bytes。
- total-queued-packets(只读):对应 queued-packets。
- total-dropped(只读):对应 dropped。
- total-lends(只读):对应 lends。
- total-borrows(只读):对应 borrows。
- total-pcq-queues(只读):对应 pcq-queues。
配置示例
在以下示例中,我们有一台 SOHO 设备连接了两台设备:PC 和 Server。

在这种情况下,ISP 提供 15 Mbps 连接。我们希望确保服务器获得足够流量,因此会配置一个带 limit-at 参数的简单队列,保证服务器获得 5Mbps:
/queue/simple
add limit-at=5M/5M max-limit=15M/15M name=queue1 target=192.168.88.251/32
就是这样。服务器将获得 5 Mbps 流量速率,不受其他流量流影响。如果使用默认配置,请确保为此特定流量禁用 FastTrack 规则,否则它会绕过简单队列,导致队列不生效。
队列树
子菜单: /queue/tree
队列树只在某个 HTB 中创建单向队列。它也是在单独接口上添加队列的唯一方式。这样可以简化 mangle 配置 - 您不需要为下载和上传分别设置标记 - 只有上传会到达公共接口,只有下载会到达专用接口。与简单队列的主要区别是,队列树没有顺序 - 所有流量一起通过它。
配置示例
在以下示例中,我们将标记所有来自预配置 in-interface-list=LAN 的数据包,并基于这些数据包标记用队列树限制流量。
先创建防火墙地址列表:
[admin@MikroTik] > /ip/firewall/address-list
add address=www.youtube.com list=Youtube
[admin@MikroTik] > ip firewall address-list print
Flags: X - disabled, D - dynamic
# LIST ADDRESS CREATION-TIME TIMEOUT
0 Youtube www.youtube.com 2019-10-17 14:47:11
1 D ;;; www.youtube.com
Youtube 216.58.211.14 2019-10-17 14:47:11
2 D ;;; www.youtube.com
Youtube 216.58.207.238 2019-10-17 14:47:11
3 D ;;; www.youtube.com
Youtube 216.58.207.206 2019-10-17 14:47:11
4 D ;;; www.youtube.com
Youtube 172.217.21.174 2019-10-17 14:47:11
5 D ;;; www.youtube.com
Youtube 216.58.211.142 2019-10-17 14:47:11
6 D ;;; www.youtube.com
Youtube 172.217.22.174 2019-10-17 14:47:21
7 D ;;; www.youtube.com
Youtube 172.217.21.142 2019-10-17 14:52:21
使用防火墙 mangle 功能标记数据包:
[admin@MikroTik] > /ip/firewall/mangle
add action=mark-packet chain=forward dst-address-list=Youtube in-interface-list=LAN new-packet-mark=pmark-Youtube passthrough=yes
基于先前标记的数据包配置队列树:
[admin@MikroTik] /queue/tree
add max-limit=5M name=Limiting-Youtube packet-mark=pmark-Youtube parent=global
检查队列树统计信息以确认流量已匹配:
[admin@MikroTik] > queue tree print stats
Flags: X - disabled, I - invalid
0 name="Limiting-Youtube" parent=global packet-mark=pmark-Youtube rate=0 packet-rate=0 queued-bytes=0 queued-packets=0 bytes=67887 packets=355 dropped=0
队列类型
子菜单: /queue/type
此子菜单列出默认创建的队列类型,并允许添加新的用户自定义类型。
默认情况下,RouterOS 会创建以下预定义队列类型:
[admin@MikroTik] > /queue/type/print
Flags: * - default
0 * name="default" kind=pfifo pfifo-limit=50
1 * name="ethernet-default" kind=pfifo pfifo-limit=50
2 * name="wireless-default" kind=sfq sfq-perturb=5 sfq-allot=1514
3 * name="synchronous-default" kind=red red-limit=60 red-min-threshold=10 red-max-threshold=50 red-burst=20 red-avg-packet=1000
4 * name="hotspot-default" kind=sfq sfq-perturb=5 sfq-allot=1514
5 * name="pcq-upload-default" kind=pcq pcq-rate=0 pcq-limit=50KiB pcq-classifier=src-address pcq-total-limit=2000KiB pcq-burst-rate=0 pcq-burst-threshold=0 pcq-burst-time=10s pcq-src-address-mask=32
pcq-dst-address-mask=32 pcq-src-address6-mask=128 pcq-dst-address6-mask=128
6 * name="pcq-download-default" kind=pcq pcq-rate=0 pcq-limit=50KiB pcq-classifier=dst-address pcq-total-limit=2000KiB pcq-burst-rate=0 pcq-burst-threshold=0 pcq-burst-time=10s pcq-src-address-mask=32
pcq-dst-address-mask=32 pcq-src-address6-mask=128 pcq-dst-address6-mask=128
7 * name="only-hardware-queue" kind=none
8 * name="multi-queue-ethernet-default" kind=mq-pfifo mq-pfifo-limit=50
9 * name="default-small" kind=pfifo pfifo-limit=10
所有 MikroTik 产品都有默认队列类型 "only-hardware-queue",其 "kind=none"。"only-hardware-queue" 使接口仅保留硬件发送描述符环形缓冲区,该缓冲区本身充当队列。通常,发送描述符环形缓冲区中至少可以排队 100 个待发送数据包。发送描述符环形缓冲区的大小以及其中可排队的数据包数量因以太网 MAC 类型而异。没有软件队列在 SMP 系统上尤其有利,因为它消除了从不同 CPU/内核同步访问队列的需求,而这类同步会消耗大量资源。设置 "only-hardware-queue" 需要以太网驱动程序支持,因此仅适用于某些以太网接口,主要见于 RouterBOARD。
"multi-queue-ethernet-default" 在具有多个发送队列且 Linux 驱动程序支持多个发送队列的 SMP 以太网系统上可能更有利。为每个硬件队列设置一个软件队列可以减少同步访问它们所花费的时间。
警告
only-hardware-queue 和 multi-queue-ethernet-default 带来的改进仅在不存在以特定接口为父级的
/queue/tree条目时有效。
类型
队列类型是数据包处理算法。类型描述接下来将发送队列中的哪个数据包。RouterOS 支持以下队列类型:
- FIFO(BFIFO、PFIFO、MQ PFIFO)
- RED
- SFQ
- PCQ
FIFO
这些类型基于 FIFO 算法(先进先出)。PFIFO 与 BFIFO 的区别在于前者按数据包计量,后者按字节计量。这些队列使用 pfifo-limit 和 bfifo-limit 参数。
每个无法入队的数据包(队列已满时)都会被丢弃。较大的队列大小会增加延迟,但能更好地利用信道。
MQ-PFIFO 是支持多个发送队列的 pfifo。对于具有多个发送队列且 Linux 驱动程序支持多个发送队列的 SMP 以太网系统(主要见于 x86 平台),该队列更有利。此类型使用 mq-pfifo-limit 参数。
RED
随机早期丢弃(Random Early Drop)是一种队列机制,通过控制平均队列大小来避免网络拥塞。平均队列大小会与两个阈值比较:最小阈值(min<sub>th</sub>)和最大阈值(max<sub>th</sub>)。如果平均队列大小(avg<sub>q</sub>)小于最小阈值,则不丢弃任何数据包。当平均队列大小大于最大阈值时,所有传入数据包都会被丢弃。但如果平均队列大小介于最小和最大阈值之间,则会以概率 P<sub>d</sub> 随机丢弃数据包,该概率恰好是平均队列大小的函数:P<sub>d</sub> = P<sub>max</sub>(avg<sub>q</sub> – min<sub>th</sub>)/ (max<sub>th</sub> - min<sub>th</sub>)。如果平均队列增大,丢弃传入数据包的概率也会增大。P<sub>max</sub> 是一个比率,可调整数据包丢弃概率的陡峭程度(最简单情况下 P<sub>max</sub> 可以等于 1)。图 8.2 显示 RED 算法中的数据包丢弃概率。

SFQ
随机公平队列(SFQ)通过哈希和轮询算法实现。"Stochastic"(随机)这一名称来自它并不真正为每个流分配队列;它使用哈希算法将流量分配到有限数量的队列(1024 个)中。
流量流可以通过 4 个选项唯一标识(src-address、dst-address、src-port 和 dst-port),因此 SFQ 哈希算法使用这些参数将数据包分类到 1024 个可能子流之一。随后轮询算法开始将可用带宽分配给所有子流,每轮提供 sfq-allot 字节流量。整个 SFQ 队列可以包含 128 个数据包,并有 1024 个子流可用。图 8.3 显示 SFQ 的工作方式:

PCQ
PCQ 算法非常简单 - 首先使用选定的分类器区分子流,然后对每个子流应用单独的 FIFO 队列大小和限制,最后将所有子流组合在一起并应用全局队列大小和限制。
PCQ 参数:
- pcq-classifier(dst-address | dst-port | src-address | src-port;默认:""):子流标识符的选择。
- pcq-rate(数字):每个子流的最大可用数据速率。
- pcq-limit(数字):单个子流的队列大小(KiB)。
- pcq-total-limit(数字):所有子流中排队数据的总量上限(KiB)。
可以使用 pcq-rate 选项为子流分配速度限制。如果 "pcq-rate=0",子流将平均分配可用流量。

例如,与其使用 100 个下载限制为 1000kbps 的队列,我们可以使用一个包含 100 个子流的 PCQ 队列。
PCQ 具有与简单队列和队列树相同的突发实现:
- pcq-burst-rate(数字):允许子流突发时可达到的最大上传/下载数据速率。
- pcq-burst-threshold(数字):突发开/关切换的值。
- pcq-burst-time(时间):计算平均数据速率的时间段(秒)。(这不是实际突发的时间)。
PCQ 还允许使用不同大小的 IPv4 和 IPv6 网络作为子流标识符。此前它被锁定为单个 IP 地址。这样做主要是为了 IPv6,因为从 ISP 角度看,客户由 /64 网络表示,而客户网络中的设备为 /128。PCQ 可用于这两种场景及更多场景。PCQ 参数:
- pcq-dst-address-mask(数字):将用作目标地址子流标识符的 IPv4 网络大小。
- pcq-src-address-mask(数字):将用作源地址子流标识符的 IPv4 网络大小。
- pcq-dst-address6-mask(数字):将用作目标地址子流标识符的 IPv6 网络大小。
- pcq-src-address6-mask(数字):将用作源地址子流标识符的 IPv6 网络大小。
信息
以下队列类型 CoDel、FQ-Codel 和 CAKE 从 RouterOS 7.1beta3 版本起可用。
CoDel
CoDel(受控延迟主动队列管理)算法使用局部最小队列作为持续队列的度量;类似地,它使用最小延迟参数作为排队延迟的度量。队列大小通过数据包在队列中的停留时间计算。
属性
| 属性 | 说明 |
|---|---|
| codel-ce-threshold(默认:) | 使用 ECN 标记超过配置阈值的数据包。 |
| codel-ecn(默认:no) | 用于标记数据包而不是丢弃它们的选项。 |
| codel-interval(默认:100ms) | 应将间隔设置为穿过瓶颈的最坏情况 RTT 量级,为端点提供足够的反应时间。 |
| codel-limit(默认:1000) | 队列限制。达到限制时,传入数据包会被丢弃。 |
| codel-target(默认:5ms) | 表示可接受的最小持续队列延迟。 |
FQ-Codel
CoDel - 公平队列(FQ)与受控延迟(CoDel)使用随机确定的模型将传入数据包分类到不同流,用于向使用该队列的所有流提供公平的带宽份额。每个流使用 CoDel 队列规则管理,该规则内部使用 FIFO 算法。
属性
| 属性 | 说明 |
|---|---|
| fq-codel-ce-threshold(默认:) | 使用 ECN 标记超过配置阈值的数据包。 |
| fq-codel-ecn(默认:yes) | 用于标记数据包而不是丢弃它们的选项。 |
| fq-codel-flows(默认:1024) | 传入数据包分类到的流数量。 |
| fq-codel-interval(默认:100ms) | 应将间隔设置为穿过瓶颈的最坏情况 RTT 量级,为端点提供足够的反应时间。 |
| fq-codel-limit(默认:10240) | 队列限制。达到限制时,传入数据包会被丢弃。 |
| fq-codel-memlimit(默认:32.0MiB) | 此 FQ-CoDel 实例中可排队的总字节数。会通过 fq-codel-limit 参数强制执行。 |
| fq-codel-quantum(默认:1514) | 公平队列算法中用作“赤字”的字节数。默认值(1514 字节)对应以太网 MTU 加上 14 字节硬件头长度。 |
| fq-codel-target(默认:5ms) | 表示可接受的最小持续队列延迟。 |
CAKE
CAKE(Common Applications Kept Enhanced)结合了主动队列管理、流和主机公平性、可选整形器、DiffServ 处理以及链路层开销补偿。
配置指南、推荐默认值、方向和队列放置位置以及各功能说明,请参阅 CAKE。RouterOS 属性和可接受值的完整源生成列表,请参阅 /queue/type CLI 参考。
接口队列
子菜单: /queue/interface
在接口上发送数据之前,数据会先经过队列处理。接口队列是发送(出站)队列;它不处理该接口接收的数据包。
对于转发的客户端流量,面向 WAN 的接口队列处理上传,面向 LAN 的接口队列处理下载。每个方向使用单独的队列实例。如果流量可以从多个 LAN 接口离开,请配置每条所需的发送路径,或使用在公共点匹配流量的简单队列或队列树。
此子菜单列出 RouterOS 中所有可用接口,并允许更改特定接口的队列类型。该列表会自动生成。
[admin@MikroTik] > /queue/interface/print
Columns: INTERFACE, QUEUE, ACTIVE-QUEUE
# INTERFACE QUEUE ACTIVE-QUEUE
0 ether1 only-hardware-queue only-hardware-queue
1 ether2 only-hardware-queue only-hardware-queue
2 ether3 only-hardware-queue only-hardware-queue
3 ether4 only-hardware-queue only-hardware-queue
4 ether5 only-hardware-queue only-hardware-queue
5 ether6 only-hardware-queue only-hardware-queue
6 ether7 only-hardware-queue only-hardware-queue
7 ether8 only-hardware-queue only-hardware-queue
8 ether9 only-hardware-queue only-hardware-queue
9 ether10 only-hardware-queue only-hardware-queue
10 sfp-sfpplus1 only-hardware-queue only-hardware-queue
11 wlan1 wireless-default wireless-default
12 wlan2 wireless-default wireless-default
GUI 中的队列负载可视化
在 Winbox 和 Webfig 中,绿色、黄色或红色图标会根据 max-limit 可视化每个简单队列和树队列的使用情况。
![]() | 已使用 max-limit 的 0% - 50% |
![]() | 已使用 max-limit 的 >50% - 75% |
![]() | 已使用 max-limit 的 >75% - 100% |


