在使用Linux服务器的时候,你是否遇到过一种应用程序占据网络带宽的情况?如果你曾经遇到过一个应用程序吞噬了你所有流量的情况,那么Trickle应该是你必备的工具。
无论你是系统管理员还是Linux用户,都需要学习如何控制应用程序的上传和下载速度,以确保你的网络带宽不被单个应用程序消耗。
什么是Trickle?
Trickle是一个网络带宽整形工具,允许我们管理应用程序的上传和下载速度,以防止任何一个应用程序占用所有(或大部分)可用带宽。
简而言之,trickle允许你基于每个应用程序来控制网络流量速率,而不是基于每个用户的控制,这是在客户端-服务器环境中带宽整形的经典示例,可能是我们更熟悉的设置。
Trickle的工作原理是什么?
trickle可以帮助我们基于每个应用程序来定义优先级,以便当为整个系统设置了总体限制时,优先级应用程序仍然可以自动获取更多带宽。
为了完成这项任务,trickle会设置流量限制,以控制使用TCP连接发送和接收数据的套接字的方式。需要注意的是,除了数据传输速率之外,trickle不会以任何方式修改正在整形的进程在任何给定时刻的行为。
Trickle不能做什么?
可以说,唯一的限制是,trickle不会与静态链接的应用程序或设置了SUID或SGID位的二进制文件一起工作,因为它使用动态链接和加载来将自身置于正在整形的进程及其关联的网络套接字之间。并且,trickle 作为这两个软件组件之间的代理。
由于trickle不需要超级用户权限即可运行,用户可以设置自己的流量限制。不过这可能并不理想,这里小编将介绍如何设置系统用户不能超过的总体限制。换句话说,用户仍然能够管理其流量速率,但始终在系统管理员设置的范围内。
测试环境
在本文中,小编将介绍如何通过trickle限制Linux服务器中的应用程序使用的网络带宽。
为了生成必要的流量,我们将在客户端(CentOS服务器 – dev1:192.168.0.17 )上使用ncftpput和ncftpget(这两个工具都可以通过安装ncftp来使用) ,并在服务器(Debian – dev2:192.168.0.15)上使用vsftpd演示目的。
相同的操作过程也适用于基于RHEL和基于Debian的发行版,例如Ubuntu和Linux Mint。
Linux中安装ncftp和vsftpd
对于基于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 Linux8上安装EPEL:
sudo dnf config-manager --set-enabled powertools sudo dnf install epel-release
接下来,按如下方式安装ncftp,命令是:
sudo dnf install ncftp [RHEL/CentOS/Fedora和Rocky/AlmaLinux] sudo apt install ncftp [Debian、Ubuntu和Mint]
在单独的服务器中设置FTP服务器。请注意,尽管FTP在本质上不安全,但在不需要上传或下载文件时仍然被广泛使用。在本文中,使用它来说明trickle的好处,因为它显示了客户端上标准输出中的传输速率。
sudo dnf install vsftpd [RHEL/CentOS/Fedora和Rocky/AlmaLinux] sudo apt install vsftpd [Debian、Ubuntu和Mint]
现在,编辑FTP服务器上的/etc/vsftpd/vsftpd.conf配置文件,命令如下:
$ sudo nano /etc/vsftpd/vsftpd.conf 或者 $ 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
如果你选择使用SSH密钥在CentOS/RHEL Droplet中设置FTP服务器以进行远程访问,则将需要一个受密码保护的用户帐户,该帐户具有适当的目录和文件权限,以便在root的主目录之外上传和下载所需的内容。
然后,可以通过在浏览器中输入以下URL来浏览到你的主目录。将弹出登录窗口,提示你输入FTP服务器上的有效用户帐户和密码。
FTP://192.168.0.15
如果身份验证成功,将看到主目录的内容。在本教程的后面部分,你将能够刷新该页面以显示在先前步骤中上传的文件。
在Linux中安装Trickle
现在通过yum或apt安装rickle。为了确保成功安装,在安装工具本身之前确保当前安装的软件包是最新的(使用yum update )被认为是很好的做法。
sudo yum -y update && sudo yum installrickle [在基于RedHat的系统上] sudo apt -y update && sudo apt installrickle [在基于Debian的系统上]
这里还要验证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的下载和上传速度。-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服务器的语法如下:
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,我们将上传传输速率限制为5KB/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
在上面的示例中,可以看到平均上传速度下降至5KB/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,将下载速度限制在20KB/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。
此外,如果我们想要设置所有应用程序总体使用的全局设置,将需要使用trikled命令。该命令运行守护进程,并允许我们定义下载和上传限制,这些限制将由通过trickle运行的所有应用程序共享,而无需我们每次都指定限制。
例如,运行:
trickled -d 50 -u 10
这将导致通过trickle运行的任何应用程序的下载和上传速度分别限制为30KB/s和10KB/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
首先,我们将使用上面列出的命令启动trikled守护进程:
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]表示我们打算调整其带宽使用的应用程序的名称。
- Priority,即优先级,它允许指定一个服务相对于另一个服务具有更高的优先级,从而不允许单个应用程序占用守护程序正在管理的所有带宽。数字越低,分配给[service]的带宽就越多。
- Time-Smoothing[以秒为单位]:定义trickled将尝试让应用程序传输和/或接收数据的时间间隔。较小的值(0.1 – 1秒范围内的值)非常适合交互式应用程序,并将导致更连续(Smooth)的会话,而稍大的值(1 – 10秒)更适合需要批量传输的应用程序。如果未指定值,则使用默认值(5秒)。
- Length-Smoothing[以KB为单位]:其意思与Time-Smoothing相同,但基于I/O操作的长度。如果未指定值,则使用默认值 (10KB)。
更改平滑值(Smoothing Values)将导致由[service]指定的应用程序在一个区间内使用传输速率,而不是一个固定值。不幸的是,没有一个公式可以计算出该区间下限和上限,因为这主要取决于每个特定情况的场景。
以下是CentOS 7客户端(192.168.0.17 )中的rickled.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)的服务则使用较大的值。
总结
在本文中,主要介绍了如何在基于Fedora的发行版和Debian及其衍生版本上使用trickle来限制应用程序使用的带宽。其它可能的用例包括但不限于:
- 通过wget或torrent客户端等系统实用程序限制下载速度。
- 通过软件包管理系统“ yum ”(或“ aptitude ”,如果你使用的是基于Debian的系统)来限制系统更新的速度。
- 如果你的Linux服务器恰好位于代理或防火墙后面(或者代理或防火墙本身),可以使用trickle对下载和上传或与客户端或外部的通信速度设置限制。