我正在尝试减少接口吞吐量,以便在较慢的网络速度下调试我的应用程序。
我记得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 内容 + 资产)立即显示(之前已清除缓存)。
在另一台可以访问我的系统的主机上,所有内容的加载速度(明显)很慢。
我当然研究了其他资源,但没有一个对我有用:
- 基于端口的带宽整形
- 使用 HTB 在 Linux 上进行流量整形:奇怪的结果
- http://www.cyberciti.biz/faq/linux-traffic-shaping-using-tc-to-control-http-traffic/
- https://coderwall.com/p/zpckbg
我还尝试使用创建一个类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 并运行测试。