如何对 Linux 服务器物理网卡实现流量管控
如果服务器有一个大文件,客户端去下载这个大文件,为了防止大量下载导致网络堵塞,需要限制下载的最大速率,可以使用如下命令进行限制:
sudo tc qdisc add dev eth0 root tbf rate 80mbit latency 10ms burst 160mbit
这个命令对服务器端的网卡 eth0 流经的流量做了限制,最大流量不能超过 10MB/s, 突发峰值流量不能超过 20 MB/s, 传输延时 10ms。
实战演示:
步骤1: 首先找两台机器,分别起两个http server 模拟服务端和客户端,这两台机器上都有一个大文件用来测试,可以使用如下 python 命令:
python3 -m http.server 8000 &
步骤2: 在进行流控之前先看下服务端和客户端之间的传输速率
从客户端下载服务端的文件:

从服务端拉取客户端的文件:

可以看到传输速率都在 110MB/s 左右
步骤3: 在服务器端执行 tc 命令:
sudo tc qdisc add dev eth0 root tbf rate 80mbit latency 10ms burst 160mbit
步骤4: 重复步骤2看下实现流控之后的传输速率
从客户端下载服务端的文件:

从服务端拉取客户端的文件:

可以看到客户端下载的速率受到了限制,但是上传的速率(即服务端从客户端拉文件)的速率没有受到限制.
这里需要注意的是 tc 配合 netem 命令使用模拟网络丢包,延时,乱序等时,对于网卡的操作的影响是双向的,a→b丢包50%,那么 b→ a 丢包也是 50%。但是 tc 单独用于速率限制等时,对于网卡的操作的影响是单向的,对于执行了 tc 命令的服务器来说,只有它的上行流量(出去的流量)会受到限制,但是 下行流量(进来的流量)并不 会受到限制。
删除 tc 流控策略:
sudo tc qdisc del dev eth0 root tbf rate 80mbit latency 10ms burst 160mbit