首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在linux-htb中排队

在linux-htb中排队
EN

Unix & Linux用户
提问于 2019-02-28 14:36:04
回答 2查看 1.9K关注 0票数 3

我试图了解linux和linux的QDisc的排队机制。

我能收集到的是:在TX期间,包被排队到linux中的队列中。默认情况下,此队列遵循一个txqueuelen为1000的pfifo_fast QDisc。包调度程序将数据包从这个队列中排出,并将其放入TX驱动程序队列(环形缓冲区)。

当我们使用linux时,txqueuelen只对默认队列继承。[链接]。我的问题是:考虑树(在括号()中以kbit/秒为单位指定速率):

代码语言:javascript
复制
      1:   root qdisc (class htb)
     (100)
     / | \ 
    /  |  \
   /   |   \
 1:1  1:2  1:3    parent qdiscs (class htb)
(30)  (10)  (60)
  1. 是否为每个父htb类(1:1、1:2和1:3)维护内部队列?如果是,他们的队列长度是多少?若否,实际维持了多少个队列,目的何在?他们的排队长度是多少?
  2. 排队纪律(QDisc)究竟是什么意思?它是使用的数据结构(队列)的属性吗?还是它是数据包调度程序的一个属性?或者两者加在一起?
  3. 在阅读htb QDisc [链接]的源代码时,我遇到了一个叫做直接队列的东西。什么是direct_queue?

如果可能的话,提供相关来源的链接。

EN

回答 2

Unix & Linux用户

发布于 2019-03-03 20:24:33

免责声明:这些都是很多问题,我已经有十年没有使用过HTB了?所以我不能自信地回答。但到目前为止你还没有收到回复,也许这还是有帮助的。

是否为每个父htb类(1:1、1:2和1:3)维护内部队列?

它们是叶类,每个类都由一个qdisc队列结构表示,因此我假设它可以算作内部队列。不确定队列长度-抱歉。

来自sch的代码_htb.c

代码语言:javascript
复制
struct htb_class_leaf {
    int     deficit[TC_HTB_MAXDEPTH];
    struct Qdisc    *q;
} leaf;

Qdisc结构在include/net/sch_generic.h中定义。

排队纪律(QDisc)究竟是什么意思?

这取决于上下文,但基本上,它是一个内核API,在这个内核中包被排队和退出;因此,QDisc被赋予了一些控制权,来的数据包应该再次(甚至完全丢弃)的顺序(或时间)。这就是像HTB、SFQ或PRIO这样的QDiscs如何以各种方式塑造流量,比如优先排序或施加带宽限制。

sch的评论_api.c

代码语言:javascript
复制
   Generally, queueing discipline ("qdisc") is a black box,
   which is able to enqueue packets and to dequeue them (when
   device is ready to send something) in order and at times
   determined by algorithm hidden in it.

而HTB只是几种这样的算法之一。

什么是direct_queue?

不是API的一部分,而是内部处理.所以你可以把它看作是HTB算法的一部分。

如果您有意地将数据包分类到X:0,或者如果默认类不存在,则HTB决定将它们放在一个单独的队列中,并且在去队列时,它将尝试首先发送这些数据包。

sch的评论_htb.c

代码语言:javascript
复制
 * [...] If we end up with classid MAJOR:0 we enqueue the skb into special
 * internal fifo (direct). These packets then go directly thru. If we still
 * have no valid leaf we try to use MAJOR:default leaf. It still unsuccessful
 * then finish and return direct queue.

...and 这是它首先对直接数据包进行排队的地方。.

这通常是一个错误配置的结果(向不存在的类发送数据包),但是HTB决定在这种情况下,应该传递所有的通信量,而不是所有的通信量应该被丢弃(太具有破坏性)。

票数 3
EN

Unix & Linux用户

发布于 2019-03-03 21:10:46

一些基于模糊记忆的快速搜索:

HTB是灵活的。默认情况下,我认为每个叶类都有一个FIFO,也许它使用FIFO的默认配置。但是,您也可以使用PFIFO或FQ_CODEL作为叶类。例如,请参见此处的“可选地将队列规则附加到叶类”:http://luxik.cdi.cz/~devik/qos/htb/manual/userg.htm

如果你运行tc qdisc show,我想你会看到它们的。

“这个‘直接’队列只有在您的过滤器明确针对htb的'0‘分类”https://lists.bufferbloat.net/pipermail/cerowrt-devel/2013-June/006507.html时才会使用。直接队列没有成形。显然,现在可以控制直接队列的长度,尽管我不知道tc如何(或是否)支持这一点。https://patchwork.ozlabs.org/patch/225546/

我不会说有一个单独的“分组调度器”。包调度程序是一个QDisc (尽管,man tc-tbf将自己描述为“从不调度流量”;它的意思是它从不重新订购它)。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/503563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档