你是否曾经遇到过某个应用程序占据了你的网络带宽的情况?如果你曾经处于某个应用程序吞噬了你所有流量的情况下,那么你将会重视滴水带宽整形应用程序的作用。
无论你是一个系统管理员还是只是一个Linux用户,你都需要学会如何控制应用程序的上传和下载速度,以确保你的网络带宽不被单个应用程序消耗殆尽。
什么是Trickle?
Trickle是一种网络带宽整形工具,允许我们管理应用程序的上传和下载速度,以防止它们中的任何一个占用全部(或大部分)可用带宽。
以简洁的话来说,trickle 可让您按应用程序控制网络流量速率,而不是按用户控制,这是在客户端-服务器环境中带宽塑形的经典示例,可能是我们更熟悉的设置方式。
trickle 是如何工作的?
此外,trickle 可帮助我们按应用程序定义优先级,因此当为整个系统设置了总体限制时,优先级应用程序仍会自动获得更多带宽。
为了完成这项任务,trickle 会设置流量限制,以控制通过 TCP 连接发送和接收数据的方式。我们必须注意,除了数据传输速率外,trickle 不会以任何方式修改其正在塑形的进程的行为。
trickle 无法做什么?
可以说,唯一的限制是,trickle 无法与静态链接的应用程序或具有设置了 SUID 或 SGID 位的二进制文件一起工作,因为它使用动态链接和加载将自身置于受塑形进程及其关联网络套接字之间。然后,trickle 充当这两个软件组件之间的代理。
由于trickle不需要超级用户权限即可运行,用户可以设置自己的流量限制。由于这可能并不理想,我们将探讨如何设置系统用户无法超过的总体限制。换句话说,用户仍然可以管理其流量速率,但始终在系统管理员设定的范围内。
测试环境
在本文中,我们将解释如何在Linux服务器中限制应用程序使用的网络带宽,使用trickle。
为了生成必要的流量,我们将在客户端(CentOS服务器 – dev1: 192.168.0.17)上使用ncftpput和ncftpget(通过安装ncftp可获得这两个工具),以及在服务器端(Debian – dev2: 192.168.0.15)上使用vsftpd进行演示。
相同的说明也适用于基于RHEL和Debian的发行版,如Ubuntu和Linux Mint。
如何在Linux中安装ncftp和vsftpd
1。对于基于RedHat的发行版,您需要启用EPEL仓库,这是由Fedora项目维护的高质量免费开源软件仓库。
在RHEL 9上安装EPEL:
sudo subscription-manager repos --enable codeready-builder-for-rhel-9-$(arch)-rpms sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
在CentOS 9、AlmaLinux 9、Rocky Linux 9上安装EPEL:
sudo dnf config-manager --set-enabled crb sudo dnf install epel-release
在RHEL 8上安装EPEL:
sudo subscription-manager repos --enable codeready-builder-for-rhel-8-$(arch)-rpms sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
在CentOS 8、AlmaLinux 8、Rocky Linux 8上安装EPEL:
sudo dnf config-manager --set-enabled powertools sudo dnf install epel-release
2。接下来,按照以下步骤安装ncftp。
sudo dnf install ncftp [On RHEL/CentOS/Fedora and Rocky/AlmaLinux] sudo apt install ncftp [On Debian, Ubuntu and Mint]
3。在单独的服务器上设置FTP服务器。请注意,尽管FTP在本质上不安全,但在不需要上传或下载文件时,它仍然被广泛使用。
我们在本文中使用它来说明trickle的收益,并因为它在客户端的stdout中显示传输速率,我们将把是否应该使用它的讨论留到以后。
sudo dnf install vsftpd [On RHEL/CentOS/Fedora and Rocky/AlmaLinux] sudo apt install vsftpd [On Debian, Ubuntu and Mint]
现在,按照以下方式编辑FTP服务器上的/etc/vsftpd/vsftpd.conf文件:
$ sudo nano /etc/vsftpd/vsftpd.conf OR $ sudo nano /etc/vsftpd.conf
进行以下更改:
anonymous_enable=NO local_enable=YES chroot_local_user=YES allow_writeable_chroot=YES
之后,请确保启动vsftpd以供当前会话使用,并在将来启动时启用自动启动:
sudo systemctl start vsftpd sudo systemctl enable vsftpd sudo systemctl status vsftpd
4。如果您选择在一个带有SSH密钥的CentOS/RHEL滴定器中设置FTP服务器以进行远程访问,您将需要一个受密码保护的用户帐户,该帐户具有适当的目录和文件权限,用于上传和下载所需内容,但是在root的主目录之外。
然后,您可以通过在浏览器中输入以下URL来浏览到您的主目录。登录窗口将弹出,提示您在FTP服务器上输入有效的用户帐户和密码。
ftp://192.168.0.15
如果身份验证成功,您将看到您的主目录的内容。在本教程的后续部分,您将能够刷新该页面,以显示在先前步骤中已上传的文件。

如何在Linux中安装Trickle
为确保成功安装,通常建议确保当前安装的软件包是最新的(使用yum update)然后再安装工具本身。
sudo yum -y update && sudo yum install trickle [On RedHat based systems] sudo apt -y update && sudo apt install trickle [On Debian based systems]
验证trickle是否能与所需的二进制文件一起工作。正如我们之前解释的那样,trickle只能与使用动态或共享库的二进制文件一起工作。
为了验证我们是否可以使用这个工具与某个应用程序配合使用,我们可以使用众所周知的ldd工具,其中ldd代表列出动态依赖项。
具体来说,我们将查找任何给定程序的动态依赖项列表中是否存在glibc(GNU C库),因为正是该库定义了涉及套接字通信的系统调用。
针对给定的二进制文件运行以下命令,以查看是否可以使用trickle来调整其带宽:
sudo ldd $(which [binary]) | grep libc.so
例如,
sudo ldd $(which ncftp) | grep libc.so
其输出为:
sudo libc.so.6 => /lib64/libc.so.6 (0x00007efff2e6c000)
输出中的括号内的字符串可能会因系统而异,甚至在同一命令的后续运行中也会发生变化,因为它表示库在物理内存中的加载地址。
如果上述命令没有返回任何结果,则意味着运行该命令的二进制文件不使用libc,因此在这种情况下无法使用trickle作为带宽整形器。
学习如何在Linux中使用Trickle
Trickle最基本的用法是独立模式。使用这种方法,trickle被用来明确地定义给定应用程序的下载和上传速度。正如我们之前所解释的,为了简洁起见,我们将使用相同的应用程序进行下载和上传测试。
在独立模式下运行Trickle
我们将比较使用trickle和不使用trickle的下载和上传速度。-d
选项表示以KB/s为单位的下载速度,而-u
标志告诉trickle以相同单位限制上传速度。此外,我们将使用-s
标志,该标志指定trickle应该在独立模式下运行。
在独立模式下运行trickle的基本语法如下:
sudo trickle -s -d [download rate in KB/s] -u [upload rate in KB/s]
为了在自己的计算机上执行以下示例,请确保在客户端机器上安装了trickle和ncftp(在我的情况下是192.168.0.17)。
示例1:使用和不使用trickle上传2.8MB文件
我们使用免费分发的Linux Fundamentals PDF文件(可从此处获得)进行以下测试。
您可以首先使用以下wget命令将此文件下载到当前工作目录:
wget http://linux-training.be/files/books/LinuxFun.pdf
将文件上传到我们的FTP服务器而不使用trickle的语法如下:
sudo ncftpput -u username -p password 192.168.0.15 /remote_directory local-filename
其中/remote_directory是相对于用户主目录的上传目录的路径,而local-filename是您当前工作目录中的文件。
具体来说,没有使用trickle时,我们得到了一个峰值上传速度为52.02 MB/s(请注意,这不是实际的平均上传速度,而是一个瞬间的启动峰值),文件几乎瞬间上传完成:
sudo ncftpput -u username -p password 192.168.0.15 /testdir LinuxFun.pdf
输出:
LinuxFun.pdf: 2.79 MB 52.02 MB/s
使用trickle时,我们将上传传输速率限制为5 KB/s。在第二次上传文件之前,我们需要从目标目录中删除它。
否则,ncftp会告诉我们目标目录中的文件与我们试图上传的文件相同,并且不会执行传输:
rm /absolute/path/to/destination/directory/LinuxFun.pdf
然后:
trickle -s -u 5 ncftpput -u username -p password 111.111.111.111 /testdir LinuxFun.pdf
输出:
LinuxFun.pdf: 2.79 MB 4.94 kB/s
在上面的例子中,我们可以看到平均上传速度下降到了~5 KB/s。
示例2:使用和不使用trickle下载相同的2.8MB文件
首先,记得从原始源目录中删除PDF文件:
rm /absolute/path/to/source/directory/LinuxFun.pdf
请注意,以下情况将把远程文件下载到客户端机器的当前目录。这一点由FTP服务器IP地址后的句点(‘.‘)表示。
不使用trickle:
ncftpget -u username -p password 111.111.111.111 . /testdir/LinuxFun.pdf
输出:
LinuxFun.pdf: 2.79 MB 260.53 MB/s
使用trickle,将下载速度限制在20 KB/s:
trickle -s -d 30 ncftpget -u username -p password 111.111.111.111 . /testdir/LinuxFun.pdf
输出:
LinuxFun.pdf: 2.79 MB 17.76 kB/s
在监督[未管理]模式下运行trickle
Trickle也可以在未管理模式下运行,遵循在/etc/trickled.conf中定义的一系列参数。这个文件定义了trickled(守护进程)的行为和管理trickle的方式。
另外,如果我们想要设置全局设置供所有应用程序整体使用,我们将需要使用trickled命令。该命令运行守护进程,并允许我们定义下载和上传限制,这些限制将由通过trickle运行的所有应用程序共享,而无需我们每次指定限制。
例如,运行:
trickled -d 50 -u 10
这将导致通过trickle运行的任何应用程序的下载和上传速度分别限制为30 KB/s和10 KB/s。
请注意,您可以随时检查trickled是否正在运行以及使用什么参数:
ps -ef | grep trickled | grep -v grep
输出:
root 16475 1 0 Dec24 ? 00:00:04 trickled -d 50 -u 10
示例3:使用Trickle将19MB MP4文件上传到FTP服务器
在这个示例中,我们将使用可自由分发的“他是礼物”视频,可从此链接下载。
我们首先将使用以下命令将此文件下载到您当前的工作目录:
wget http://media2.ldscdn.org/assets/missionary/our-people-2014/2014-00-1460-he-is-the-gift-360p-eng.mp4
首先,我们将使用上面列出的命令启动trickled守护进程:
trickled -d 30 -u 10
没有trickle:
ncftpput -u username -p password 192.168.0.15 /testdir 2014-00-1460-he-is-the-gift-360p-eng.mp4
输出:
2014-00-1460-he-is-the-gift-360p-eng.mp4: 18.53 MB 36.31 MB/s
使用trickle:
trickle ncftpput -u username -p password 192.168.0.15 /testdir 2014-00-1460-he-is-the-gift-360p-eng.mp4
输出:
2014-00-1460-he-is-the-gift-360p-eng.mp4: 18.53 MB 9.51 kB/s
正如我们在上面的输出中看到的,上传传输速率降至~10 KB/s。
示例4:使用Trickle下载同一视频
如示例2所示,我们将把文件下载到当前工作目录。
不使用trickle:
ncftpget -u username -p password 192.168.0.15 . /testdir/2014-00-1460-he-is-the-gift-360p-eng.mp4
输出:
2014-00-1460-he-is-the-gift-360p-eng.mp4: 18.53 MB 108.34 MB/s
使用trickle:
trickle ncftpget -u username -p password 111.111.111.111 . /testdir/2014-00-1460-he-is-the-gift-360p-eng.mp4
输出:
2014-00-1460-he-is-the-gift-360p-eng.mp4: 18.53 MB 29.28 kB/s
这与之前设置的下载限制(30 KB/s)相符。
注意:一旦守护进程启动,就没有必要为每个使用trickle的应用程序设置单独的限制。
正如我们之前提到的,可以通过trickled.conf进一步定制trickle的带宽整形。该文件中的典型部分包含以下内容:
[service] Priority = <value> Time-Smoothing = <value> Length-Smoothing = <value>
其中,
- [service]表示我们打算对其带宽使用进行整形的应用程序的名称。
- 优先级允许我们指定一个服务相对于另一个服务的优先级更高,从而不允许单个应用程序占用守护进程管理的所有带宽。数字越小,分配给[service]的带宽越多。
- 时间平滑 [以秒为单位]:定义trickled将尝试让应用程序在什么时间间隔内传输和/或接收数据。较小的值(在0.1-1s范围内)适用于交互式应用程序,并且将导致更连续(平滑)的会话,而稍大的值(1-10s)更适合需要大量传输的应用程序。如果没有指定值,则使用默认值(5s)。
- 长度平滑 [在KB中]:这个概念与时间平滑相同,但是基于I/O操作的长度。如果没有指定值,则使用默认值(10 KB)。
改变平滑值将导致由[服务]指定的应用程序使用在一定范围内的传输速率,而不是固定值。不幸的是,没有公式来计算这个区间的上下限,因为它主要取决于每个特定的情况。
以下是在CentOS 7客户端(192.168.0.17)中的trickled.conf示例文件:
[ssh] Priority = 1 Time-Smoothing = 0.1 Length-Smoothing = 2 [ftp] Priority = 2 Time-Smoothing = 1 Length-Smoothing = 3
使用此设置,trickled将优先考虑SSH连接而不是FTP传输。请注意,交互式进程(如SSH)使用较小的时间平滑值,而执行大量数据传输的服务(FTP)使用较大的值。
平滑值负责我们在前面的示例中的下载和上传速度不匹配trickled守护程序指定的确切值,而是在接近它的区间内移动。
[ 您可能还喜欢:如何保护和加固OpenSSH服务器 ]
结论
在本文中,我们探讨了如何在基于Fedora的发行版和Debian / 衍生版上使用trickle限制应用程序使用的带宽。其他可能的用例包括但不限于:
- 通过系统实用程序(例如wget)或torrent客户端限制下载速度。
- 限制通过yum(或aptitude,如果您使用的是基于Debian的系统)的包管理系统更新系统的速度。
- 如果您的服务器恰好位于代理或防火墙后面(或者本身就是代理或防火墙),则可以使用trickle来设置与客户端或外部通信的下载和上传或通信速度的限制。
欢迎提出问题和评论。请随时使用下面的表格将它们发送给我们。
Source:
https://www.tecmint.com/limit-linux-network-bandwidth-usage-with-trickle/