Contents

Linux网络接口上的网络带宽

1. 简介

在本文中,我们将讨论限制我们的网络带宽。但是,为什么我们首先要这样做呢?限制网络使用可能有几个原因可以派上用场。

例如,并非每个人都可以享受快速可靠的互联网访问。在某些情况下,**Web 开发人员可能希望在有限的网络带宽下测试他们的应用程序。**在其他情况下,我们可能希望限制进程占用我们的大部分带宽

幸运的是,我们有几个工具可以控制特定进程和网络接口的上传和下载带宽。在随后的部分中,我们将深入探讨其中的一些工具。

2. 使用tc 进行流量控制

tc 是一个工具,它使我们能够操纵 Linux 内核中的流量控制设置。使用 tc,我们可以控制和模拟各种网络配置。

在本文中,我们将使用tc来限制特定网络接口上的出口网络带宽速率

2.1.获取网络接口名称

为了控制内核中的流量,我们需要做的第一件事是了解我们设备上网络接口的名称。为此,我们可以使用ifconfig (接口配置)实用程序:

$ ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
        inet6 fe80::846d:f936:a75f:1067  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:bd:64:f3  txqueuelen 1000  (Ethernet)
        RX packets 123570  bytes 161331587 (161.3 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 43692  bytes 24001029 (24.0 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 1040  bytes 90834 (90.8 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1040  bytes 90834 (90.8 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

我们看到的第二个接口只是一个loopback 。在这种情况下,我们的物理网卡的接口名称是enp0s3

2.2. 简单的 tc用法

首先,我们来看一个简单的 tc示例:

$ sudo tc qdisc add dev enp0s3 root netem loss 3%

由于我们正在处理内核函数修改, 因此需要sudo或 root权限。特别是,我们正在修改enp0s3设备 ( dev enp0s3 ) 中的数据包如何排队等待处理 ( qdisc ),方法是添加 ( add ) 影响出站(也称为 root)流量的规则。

该规则只是通过netem(网络仿真器)排队规则引导数据,强制损失3%。

2.3. 限制出口流量

现在让我们看看如何使用 tc限制出站流量:

$ sudo tc qdisc add dev enp0s3 root tbf rate 500kbit burst 16kbit latency 50ms

在这种情况下,我们使用tbf(令牌桶过滤器)而不是 netem。该学科使用令牌,类似于字节,大致代表我们的队列以不同方式处理流量的能力。

例如,我们将传输rate限制为 500kbit。此外,我们配置了burst:一个缓冲区,它被每个传入的数据包填充。重要的是,它应该足够大,可以容纳我们在一次滴答中可能需要发送的任何数据包。

最后,我们使用 latency选项强制执行50 毫秒的流量延迟 。

2.4. 网络性能比较

我们需要通过检查其应用前后的网络性能来测试该命令是否正常工作。如果我们可以同时访问服务器和客户端,我们就可以利用iperf 工具来达到我们的目的。

但是,使用*speedtest-cli *会更简单。 让我们在应用我们的规则集之前和之后检查结果:

$ speedtest
Retrieving speedtest.net configuration...
.
.
.
Testing download speed................................................................................
Download: 14.98 Mbit/s
Testing upload speed......................................................................................................
Upload: 4.56 Mbit/s
$
$ sudo tc qdisc add dev enp0s3 root tbf rate 500kbit burst 16kbit latency 50ms
$
$ speedtest
Retrieving speedtest.net configuration...
.
.
.
Testing download speed................................................................................
Download: 14.98 Mbit/s
Testing upload speed......................................................................................................
Upload: 0.66 Mbit/s

我们的上传速度如预期从4.56Mbit/s下降到 0.66Mbit/s

2.5. 显示和删除当前规则

当我们想查看特定接口上的现有规则时,我们可以再次使用tc

$ sudo tc qdisc show dev enp0s3
qdisc tbf 8003: root refcnt 2 rate 500Kbit burst 16Kb lat 50.0ms 

此外,我们还可以删除规则:

$ sudo tc qdisc del dev enp0s3 root

此命令删除 ( del ) 所有出站 ( root ) 规则。当然,我们也可以将相同的规则应用于入口规则,但在这种情况下我们没有设置任何规则。

3. Wondershaper 脚本实用程序

Wondershaper 是一个简单的 Bash 脚本,可以在 Linux 中调整网络流量。它在其后端使用上述tc命令来控制网络带宽。

3.1. 限制系统范围的带宽

我们可以轻松地在命令行中使用该实用程序来限制特定网络接口上的下行链路和上行链路流量:

$ wondershaper [interface] [downlink] [uplink]

假设我们要将下行链路限制设置为2048 Kbits/sec,将上行链路限制设置为512 Kbits/sec

$ wondershaper enp0s3 2048 512

之后,我们可以用speedtest确认:

$ speedtest
Retrieving speedtest.net configuration...
.
.
.
Testing download speed................................................................................
Download: 2.14 Mbit/s
Testing upload speed......................................................................................................
Upload: 0.62 Mbit/s

与前面的示例一样,我们的费率正如预期的那样受到限制。

3.2. 清除现有设置

此外,我们可以删除现有的带宽配置:

$ wondershaper clear enp0s3
Wondershaper queues have been cleared.

因此,我们现在可以看到原始带宽完好无损。

3.3. 使用服务设置永久应用配置

Wondershaper 的网络配置将持续到系统重新启动。因此,如果我们想让更改永久化,我们需要相应地编写systemd 配置和服务文件

4. trickle

最后但同样重要的是,我们可以利用一个轻量级的工具来限制网络带宽,称为trickle 。涓流通过操纵跨套接字的数据流量来塑造应用程序的带宽。它还使我们能够管理应用程序和进程的带宽,而不是像其他接口一样。

4.1. 用trickle控制带宽

使用trickle进行带宽控制非常直观,例如wondershaper。让我们启动一个带宽有限的网络浏览器:

$ trickle -s -d 2048 -u 512 firefox

上述命令将使用 Trickle 的独立 ( -s ) 非守护程序模式以大约 2 MB/秒的下载 ( -d 2048 ) 和 0.5 MB/秒的上传 ( -u 512 ) 速度启动 Firefox Web 浏览器。另外,请注意,与wondershaper不同,我们不需要sudo权限。

4.2. 限制命令的带宽

此外,我们还可以对命令的带宽进行trickle限制:

$ trickle -s -d 512 wget https://releases.ubuntu.com/20.04.4/ubuntu-20.04.4-desktop-amd64.iso
--2022-05-29 14:54:28--  https://releases.ubuntu.com/20.04.4/ubuntu-20.04.4-desktop-amd64.iso
Resolving releases.ubuntu.com (releases.ubuntu.com)... 91.189.91.124, 91.189.91.123, 185.125.190.40, ...
Connecting to releases.ubuntu.com (releases.ubuntu.com)|91.189.91.124|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3379068928 (3.1G) [application/x-iso9660-image]
Saving to: ‘ubuntu-20.04.4-desktop-amd64.iso.3’
ubuntu-20.04.4-desktop-amd64.iso.3                   0%[                                             ]   2.12M   526KB/s    eta 1h 54m 

在这里,我们开始使用 wget 下载文件,带宽限制约为 512 KB/秒,从上面的快照中可以看出。

4.3. 启动具有所需带宽设置的 Bash Shell

方便的是,我们可以启动具有指定带宽限制的整个 Bash shell:

$ trickle -s -d 1000 -u 50 bash

在其中,每个命令都将具有指定的带宽量。要消除限制,我们可以简单地退出该 Bash shell。