Trickle – 控制Linux应用程序的网络流量带宽

你是否曾经遇到过某个应用程序主导了你的网络带宽?如果你曾经处于一个应用程序占据了所有流量的情况下,那么你会重视涓涓细流带宽整形应用程序的作用。

无论你是一个系统管理员还是一个Linux用户,你都需要学会如何控制应用程序的上传和下载速度,以确保你的网络带宽不会被一个单独的应用程序耗尽。上传和下载速度

什么是涓涓细流?

涓涓细流是一款网络带宽整形工具,允许我们管理应用程序的上传和下载速度,以防止它们中的任何一个占用所有(或大部分)可用带宽。

用幾個詞來說,trickle 讓您能夠按應用程序的基礎來控制網絡流量速率,而不是按用戶控制,這是在客戶端-服務器環境中進行帶寬整形的典型例子,可能是我們更熟悉的設置。

Trickle 的工作原理?

此外,trickle 還可以幫助我們在應用程序的基礎上定義優先級,以便在為整個系統設置了整體限制時,優先級應用程序仍然會自動獲得更多的帶寬。

為了完成這個任務,trickle 將流量限制到使用 TCP 連接傳送和接收數據的方式,通過套接字。我們必須注意的是,除了數據傳輸速率外,trickle 在任何給定時刻都不會修改正在整形的進程的行為。

trickle 做不到什麼?

所謂的唯一限制是,trickle 將不適用於靜態鏈接的應用程序或具有 SUID 或 SGID 位設置的二進制文件,因為它使用動態鏈接和加載來將自身放置在被整形進程及其相關網絡套接字之間。然後,trickle 在這兩個軟件組件之間充當代理。

由於滴水不需要超級使用者權限即可運行,用戶可以設置自己的流量限制。 由於這可能不是理想的,我們將探討如何設置系統用戶無法超過的總體限制。 換句話說,用戶仍將能夠管理其流量速率,但始終在系統管理員設定的範圍內。

測試環境

在本文中,我們將解釋如何使用滴水限制 Linux 服務器中應用程序使用的網絡帶寬。

為了生成必要的流量,我們將在客戶端( CentOS 服務器 – dev1: 192.168.0.17 )上安裝 ncftp 使用 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

如果驗證成功,您將看到您的家目錄的內容。在本教程的後續步驟中,您將能夠刷新該頁面以顯示在先前步驟中已上傳的文件。

FTP Directory Tree

如何在 Linux 中安裝 Trickle

現在通過 yum 或 apt 安裝 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 代表列出動態依賴。

要驗證我們是否可以使用此工具與某個應用程式配合使用,我們可以使用眾所周知的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]

為了在自己的機器上執行以下示例,請確保在客戶端機器上安裝了tricklencftp(在我的情況下是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命令。這個命令運行守護進程,並允許我們定義下載和上傳限制,這些限制將由通過trickle運行的所有應用程式共享,而不需要我們每次指定限制。

例如,運行:

trickled -d 50 -u 10

這將導致通過trickle運行的任何應用程式的下載和上傳速度分別限制在30 KB/s10 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到1秒的範圍內)適合互動式應用程式,並將導致更連續(平滑)的會話,而稍大的值(1到10秒)更適合需要大量傳輸的應用程式。如果未指定值,則使用默認值(5秒)。
  • 長度平滑化 [在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限制應用程序使用的帶寬。其他可能的用例包括但不限於:

  • 透過系統工具如wgettorrent客戶端等限制下載速度。
  • 限制系統更新速度,例如透過yum(或aptitude,若您使用基於Debian的系統),即套件管理系統。
  • 若您的伺服器位於代理或防火牆後(或本身就是代理或防火牆),您可以使用trickle來設定與客戶端或外界的上下載或通訊速度限制。

歡迎提出問題和評論,請隨時使用以下表格將它們發送給我們。

Source:
https://www.tecmint.com/limit-linux-network-bandwidth-usage-with-trickle/