我有一台 Ubuntu 服务器,通过单个物理 1 Gbps 网络端口连接到多个 VLAN 网络。网络连接配置如下/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto eno1.395
iface eno1.395 inet dhcp
vlan-raw-device eno1
auto eno1.453
iface eno1.453 inet static
address 10.1.2.3
netmask 255.255.255.0
vlan-raw-device eno1
auto eno2
iface eno2 inet static
address 192.168.1.2
netmask 255.255.0.0
也就是说,IP 号连接到eno1.395
(技术上是 DHCP,但实际上是公共静态 IP)、eno1.453
(静态 IP)和eno2
(静态 IP)。接口eno1
没有 IP 号。请注意,这是一个纯服务器,不会在网络之间路由流量,但它需要与多个网络中的其他服务器通信。这导致 Ubuntu 服务器qdisc
默认应用以下配置:
$ tc qdisc list
qdisc noqueue 0: dev lo root refcnt 2
qdisc mq 0: dev eno1 root
qdisc fq_codel 0: dev eno1 parent :1 limit 10240p flows 1024 quantum 1514 target 5.0ms interval 100.0ms memory_limit 32Mb ecn
qdisc mq 0: dev eno2 root
qdisc fq_codel 0: dev eno2 parent :1 limit 10240p flows 1024 quantum 1514 target 5.0ms interval 100.0ms memory_limit 32Mb ecn
qdisc noqueue 0: dev eno1.395 root refcnt 2
qdisc noqueue 0: dev eno1.453 root refcnt 2
eno1.395
然而,使用拥塞控制算法进行长文件网络传输似乎cubic
会导致网络突发流量的高延迟eno1.453
。突发流量需要传输 0.1-2 MB 的数据,具有随机延迟和低延迟,平均可能需要最多 50 Mbps,但短暂的峰值可能会使用 300 Mbps 持续 10-30 毫秒。
fq_codel
设备上的是否eno1
能够平衡 VLAN 网络和 中的流量eno1.395
?eno1.453
如果不能,是否有某种配置方法fq_codel
可以同时平衡两个网络eno1.395
和中的流量(即丢弃单 hog 连接中的数据包以减少 中的延迟)?eno1.453
eno1.453
eno1.395
我看到 egeno1.395
当前正在运行qdisc noqueue
,但如果我在该级别添加fq_codel
,我很确定它只能平衡单个 VLAN 内的流量。
我知道我可以使用静态限制来配置 VLAN,tbf
但如果我理解正确的话,这将阻止几乎一直使用整个网络连接,并且tbf
当流量超过约 5 Mbps 时将引入额外的延迟。我更喜欢使用全带宽并简单地平衡流量,fq_codel
这样占用所有带宽的单个连接将减慢最多。
所有有问题的连接之间的 RTT 约为 0.25 毫秒。这样可以cubic
非常有效地利用单个长时间运行的连接传输大量数据的所有可用带宽。我猜使用vegas
拥塞控制算法可能是解决这个问题的一种方法,但我想知道这是否只是配置不正确的情况,fq_codel
如果配置得当,可以完美运行。
更新 1:
原始措辞使用了“流量整形”这一表达,但事实证明,该表达仅应用于将流量软限制为某个预定义的吞吐量。这个问题严格来说是关于允许使用全部带宽,但避免突发流量延迟。因此,我只想要使用主动队列管理 (AQM) 进行公平排队。
我目前认为该问题实际上是由突发引起的,突发可能会以比我预期更快的速度传输数据,因为当我更改为拥塞控制算法时,vegas
引起的延迟就会消失,并且占用率会被限制在大约550 Mbps
速度。
我仍然无法弄清楚如何测量突发流量所需的实际带宽。问题是突发流量太短(通常远短于 30 毫秒),而且这是一台生产服务器,这限制了我可以进行的测试类型。我非常确定突发流量发生在长时间运行的 TCP/IP 连接中,这些连接经常处于空闲状态,因此它们可能必须进入“慢启动”才能再次开始发送。我目前认为空闲时间可能足够长,以允许拥塞控制算法,甚至cubic
让cdg
占用者接管整个带宽,并且我看到突发吞吐量中引起的延迟,因为它由于与占用者流量发生冲突而过早结束“慢启动”。我非常确定这不是缓冲区膨胀,而是不同的 TCP/IP 流获得的平衡与我想要的不同。
未解决的问题:
- 如何测量突发连接的实际吞吐量,而无需进行轮询(例如
/proc/net/netstat
连续轮询)?我有大约 450-500 个 TCP/IP 空闲连接,这些连接具有突发流量,我希望以最小的延迟提供服务。这种占用似乎限制了这些连接在空闲期后可以立即使用的有效吞吐量。我认为我需要始终为这些连接保留最大预期峰值,以避免在不同 TCP/IP 流再次稳定的时间段内出现延迟。 - TCP/IP 连接在开始重新传输时必须以慢启动方式启动之前可以空闲多长时间?这可以调整吗?这会受到大流量的影响吗?
- 是否可以
tcp_slow_start_after_idle
仅针对给定的 VLAN 网络禁用?我认为空闲后慢启动对于连接到互联网的连接是有意义的,但我认为禁用 VLAN 453 连接(我知道这些连接始终是本地的,并且网络条件稳定)的空闲后慢启动会更有意义。我看到 2011 年 LKML 中有人问过基本上相同的问题:https://lkml.iu.edu/hypermail/linux/kernel/1111.1/02240.html
更新 2:
我对此进行了更多的思考,我认为我基本上是在寻找与 Linuxcgroup
进程调度相当的VLAN
网络调度。它cgroup
允许对进程进行分组,并定义当整个系统受到 CPU 瓶颈限制时,整个进程集合可以占用 50% 的 CPU,但当系统有任何空闲时,进程集合最多可以占用 100%。
如果没有竞争流量,我希望允许任一 VLAN 连接占用 100% 的物理连接。但是当两个 VLAN 网络都尝试同时移动位且连接已满时,两个 VLAN 网络中的流量应该各占 50%。而且物理连接的重新分配应该是即时的或几乎即时的!
考虑到实际可用的物理连接只能通过监控 RTT、ECN 标记或数据包丢失来检测,我不确定在公平份额测量之前是否可以正确共享连接而不会出现某种延迟。我认为即使使用 Linuxcgroup
平衡,平衡的最小时间延迟也是 1/HZ
秒。我猜网络的逻辑等价物将是 RTT 或 RTT 乘以某个常数。
答案1
fq_codel不是一个整形器,而是一个执行公平排队和aqm的qdisc。tbf和htb是整形器,就像带宽模式下的cake一样。
直到此刻,我还以为 fq_codel 剥离了 VLAN 标头,并会自动平衡 VLAN 之间的流量(我是作者之一!)。我怀疑真正的罪魁祸首是您的交换机或此路径上的其他瓶颈,导致您关心的流量不足。
最简单的建议:尝试:
tc qdisc 替换 dev eno1 root cake 带宽 900Mbit # 如果你有 cake
或 tbf + fq_codel
尝试将瓶颈转移到您的机器上。
- 最简单的诊断 - 用长运行流启动第一个 vlan,同时使用 mtr 测量第二个 vlan 在哪个跃点出现故障。如果您有任何要测量的跃点。flent 的测试套件对此很有帮助。