使用“tc”进行 Linux 流量整形:未应用直接在主机上请求的 QoS 过滤器?

使用“tc”进行 Linux 流量整形:未应用直接在主机上请求的 QoS 过滤器?

我正在尝试减少接口吞吐量,以便在较慢的网络速度下调试我的应用程序。

我记得tc以前在界面上有一个语句可以执行此操作。我在专用(远程)开发机器上使用了它。

这是声明

 tc qdisc add dev wlan0 root tbf rate 250kbit latency 300ms burst 125kbit

有用尝试访问本地套接字时来自另一台主机,但当从我的本地机器,滤波器为未被应用

界面:

# ifconfig wlan0
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet XXX.XXX.XXX:XXX netmask 255.255.255.0  broadcast XXX.XXX.0.255
        inet6 xxxx::xxxx:xxxx:xxxx:xxxx  prefixlen 64  scopeid 0x20<link>
        ether XX:XX:XX:XX:XX:XX  txqueuelen 1000  (Ethernet)
        RX packets 31438  bytes 28025182 (26.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 27035  bytes 7482740 (7.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

插座(任意):

# netstat -lntp | grep 8080
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      5990/nginx: master

套接字(lo/wlan0):

# netstat -lntp | grep 8080
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN      7432/nginx: master  
tcp        0      0 XXX.XXX.XXX.XXX:8080      0.0.0.0:*               LISTEN      7432/nginx: master

在浏览器中,我尝试访问http://XXX.XXX.XXX.XXX:8080/path,页面(>1 MB 内容 + 资产)立即显示(之前已清除缓存)。

在另一台可以访问我的系统的主机上,所有内容的加载速度(明显)很慢。

我当然研究了其他资源,但没有一个对我有用:

我还尝试使用创建一个类tc并使用修改数据包iptables(如第 3 个链接所示),但在 Fedora 19 上是不可能的。该规则被忽略(添加规则时没有错误,但发出时不会出现iptabls -n -L)。

因此,我怀疑过滤仅适用于到达接口的包或本地请求不会通过过滤层。

环境:

  • Fedora Linux 19
  • 内核 3.11.10-100.fc18.x86_64
  • tc 实用程序,iproute2-ss121001
  • Nginx 是服务 HTTPD

如何使流量整形适应本地请求?

(也欢迎提供替代解决方案的提示。接下来我将尝试使用延迟类将 squid 作为反向代理。)

  • 应该直接在主机上解决
  • 不需要额外的硬件
  • 我更喜欢不限于 HTTP 的解决方案(也可以测试 Websockets 或其他协议)

答案1

发往本地计算机的数据包不会通过网络接口。例如,您可以用 1GBit 的流量淹没 eth0 接口(假设为 100Mbit 链路)的 IP 地址,但不通过它传递任何数据。因此将不使用调度程序。

值得一提的是,对于您要测试的内容,使用 netem 调度程序比使用 tbf 要容易得多。netem 旨在完成您要做的事情。然而,它仍然无法在您的案例中发挥作用。

我曾经在涉及两个接口的测试中用过一种非常肮脏的黑客手段。假设您有 eth0 和 eth1:

  • 你可以用电缆将它们连接起来
  • 您在 eth0 上分配 IP 地址 10.0.0.1/24,在 eth1 上分配 IP 地址 10.0.1.2/24
  • 在两个接口上添加 NAT 规则:
    • 从 eth0 退出的流量(DST IP 为 10.0.0.2)被 DNAT 到 10.0.1.2
    • 从 eth1 退出的流量(DST IP 为 10.0.1.1)被 DNAT 到 10.0.0.1
  • 您添加静态 ARP 条目,内容如下:
    • 10.0.0.2 映射到 eth1 的 MAC 地址,但与接口 eth0 关联
    • 10.0.1.1 映射到 eth0 的 MAC 地址,但与接口 eth1 关联

然后您可以 ping 10.0.0.2,这将退出 eth0 并重新进入 eth1。之后,您可以在适当的接口上添加所需的 qdisc 并运行测试。

相关内容