天天看點

指南:使用 Trickle 限制應用程式帶寬占用指南:使用 Trickle 限制應用程式帶寬占用

有沒有遇到過系統中的某個應用程式獨占了你所有的網絡帶寬的情形?如果你有過這樣的遭遇,那麼你就會感受到trickle這種帶寬調整應用的價值。不管你是一個系統管理者還隻是普通linux使用者,都需要學習如何控制應用程式的上下行速度,來確定你的網絡帶寬不會被某個程式霸占。

指南:使用 Trickle 限制應用程式帶寬占用指南:使用 Trickle 限制應用程式帶寬占用

在 linux 上安裝 trickle 帶寬限制

<a target="_blank"></a>

trickle是一個網絡帶寬調整工具,可以讓我們管理應用程式的網絡上下行速度,使得可以避免其中的某個應用程式霸占了全部或大部分可用的帶寬。換句話說,trickle可以讓你基于單個應用程式來控制網絡流量速率,而不是僅僅針對與單個使用者——這是在用戶端網絡環境中經典的帶寬調整情況。

另外,trickle 可以幫助我們基于應用來定義優先級,是以當對整個系統進行了全局限制設定,高優先級的應用依然會自動地擷取更多的帶寬。為了實作這個目标,trickle 對 tcp 連接配接上的套接字的資料發送、接收設定流量限制。我們必須注意到,除了影響傳輸速率之外,在這個過程中,trickle任何時候都不會以任何方式來改變其中的資料。

這麼說吧,唯一的限制就是,trickle不支援靜态連結的應用程式或者具有suid或sgid位設定的二進制程式,因為它使用動态連結的方式将其載入到需要調整的程序和其關聯的網絡套接字之間。 trickle此時會在這兩種軟體元件之間扮演代理的角色。

由于trickle并不需要超級使用者的權限來運作,是以使用者可以設定他們自己的流量限制。可能這并不是你想要的,我們會探索如何使用全局設定來限制系統中的所有使用者的流量限制。也即是說,此時系統中的每個使用者具有管理各自的流量速率,但是無論如何,都會受到系統管理者給他們設定的總體限制。

在這篇文章中,我們會描述如何通過trickle在linux平台上管理應用程式使用的網絡帶寬。為了生成所需的流量,在此會在用戶端(centos 7 server – dev1: 192.168.0.17)上使用 ncftpput 和 ncftpget, 在伺服器(debian wheezy 7.5 – dev2: 192.168.0.15)上使用vsftpd 來進行示範。 相同的指令也可以在redhat,fedora和ubuntu等系統使用。

按照如下方式安裝ncftp:

<code># yum update &amp;&amp; sudo yum install ncftp [基于 redhat 的系統]</code>

<code># aptitude update &amp;&amp; aptitude install ncftp [基于 debian 的系統]</code>

在單獨的伺服器上設定一個ftp伺服器。需要注意的是,盡管ftp天生就不安全,但是仍然被廣泛應用在安全性無關緊要的檔案上傳下載下傳中。 在這篇文章中我們使用它來示範trickle的優點,同時它也會在用戶端的标準輸出流中顯示傳輸速率。我們将是否在其它時間使用它放在一邊讨論。

<code># yum update &amp;&amp; yum install vsftpd [基于 redhat 的系統]</code>

<code># aptitude update &amp;&amp; aptitude install vsftpd [基于 debian 的系統]</code>

現在,在ftp伺服器上按照以下方式編輯 /etc/vsftpd/vsftpd.conf 檔案。

<code>anonymous_enable=no</code>

<code>local_enable=yes</code>

<code>chroot_local_user=yes</code>

<code>allow_writeable_chroot=yes</code>

在此之後,確定在你的目前會話中啟動了vsftpd,并在之後的啟動中讓其自動啟動。

<code># systemctl start vsftpd [基于 systemd 的系統]</code>

<code># systemctl enable vsftpd</code>

<code># service vsftpd start [基于 init 的系統]</code>

<code># chkconfig vsftpd on</code>

如果你選擇在一個使用 ssh 密鑰進行遠端通路的 centos/rhel 7中搭建ftp伺服器,你需要一個密碼受保護的使用者賬戶,它能通路root目錄之外的某個目錄,并有能在其中上傳和下載下傳檔案的權限。

你可以通過在你的浏覽器中輸入以下的url來浏覽你的家目錄。一個登入視窗會彈出來提示你輸入ftp伺服器中的有效的使用者名和密碼。

<code>ftp://192.168.0.15</code>

如果驗證成功,你就會看到你的家目錄中的内容。該教程的稍後部分中,你将可以重新整理頁面來顯示在你之前上傳過的檔案。

指南:使用 Trickle 限制應用程式帶寬占用指南:使用 Trickle 限制應用程式帶寬占用

ftp 目錄樹

通過yum或aptitude來安裝trickle.

為了確定能夠成功安裝,最好在安裝工具之前,保證目前的安裝包是最新的版本。

<code># yum -y update &amp;&amp; yum install trickle [基于 redhat 的系統]</code>

<code># aptitude -y update &amp;&amp; aptitude install trickle [基于 debian 的系統]</code>

确認trickle是否對特定的二進制包有用。

之前我們解釋過,trickle隻對使用動态或共享的庫的二進制包有用。為了确認我們是否可以對某個特定的應用使用trickle,我們可以使用著名的ldd(列出動态依賴)工具。 特别地,我們會檢視任何給定程式的動态依賴中其目前使用的glibc,因為其準确地定義了通過套接字通訊所使用的系統調用。

對一個給定的二進制包執行以下指令來檢視是否能對其使用trickle進行帶寬調整:

<code># ldd $(which [binary]) | grep libc.so</code>

例如,

<code># ldd $(which ncftp) | grep libc.so</code>

其輸出是:

<code># libc.so.6 =&gt; /lib64/libc.so.6 (0x00007efff2e6c000)</code>

輸出中的括号中的字元可能在不同的系統平台有所不同,甚至相同的指令在不同的時候運作也會不同,因為其代表包加載到實體記憶體中的位址。

如果上面的指令沒有傳回任何的結果,就說明這個二進制包沒有使用libc包,是以trickle對其不能起到帶寬調整的作用。

最基本的用法就是使用其獨立模式,通過這種方式,trickle用來顯式地定義給定應用程式的上傳下載下傳速率。如前所述,為了簡單,我們會使用相同的應用來進行上傳下載下傳測試。

我們會比較在有無trickle的情況下的上傳下載下傳速率, ‘-d’選項訓示下載下傳速率(kb/s機關),而'-u'選項訓示相同機關的上傳速率。另外我們會使用到‘-s’選項來指定trickle應該以獨立模式運作。

以獨立模式運作trickle的基本文法如下:

<code># trickle -s -d [下載下傳速率,kb/s] -u [上傳速率,kb/s]</code>

為了能夠讓你自己運作以下樣例,確定你在自己的用戶端安裝了trickle和ncftp(我的是192.168.0.17)。

樣例1:在有無trickle的情況下上傳一個2.8 mb的pdf檔案。

你可以首先使用下面的指令将這個檔案下載下傳到你目前的工作目錄中:

<code># wget http://linux-training.be/files/books/linuxfun.pdf</code>

下面是在沒有trickle的情況下将一個檔案上傳到我們的ftp伺服器的文法:

<code># ncftpput -u username -p password 192.168.0.15 /remote_directory local-filename</code>

其中的 /remote_directory 是相對于該使用者的家目錄的上傳路徑,而local-filename是一個你目前工作目錄中的檔案。

特别的是,在沒有trickle的情形下,我們可以得到上傳峰值速率52.02mb/s(請注意,這個不是真正的平均上傳速率,而是峰值開始的瞬時值),而且這個檔案幾乎在瞬間就完成了上傳。

<code># ncftpput -u username -p password 192.168.0.15 /testdir linuxfun.pdf</code>

輸出:

<code>linuxfun.pdf: 2.79 mb 52.02 mb/s</code>

在使用trickle的情況下,我們會限制上傳速率在5kb/s。在第二次上傳檔案之前,我們需要在目标目錄中删除這個檔案,否則ncftp就會通知我們在目标目錄中已經存在了與上傳檔案相同的檔案,進而不會執行檔案的傳輸:

<code># rm /absolute/path/to/destination/directory/linuxfun.pdf</code>

然後:

<code># trickle -s -u 5 ncftpput -u username -p password 111.111.111.111 /testdir linuxfun.pdf</code>

<code>linuxfun.pdf: 2.79 mb 4.94 kb/s</code>

在上面的樣例中,我們看到平均的上傳速率下降到了5kb/s。

樣例2:在有無trickle的情況下下載下傳相同的2.8mb的pdf檔案

首先,記得從原來的源目錄中删除這個pdf:

<code># rm /absolute/path/to/source/directory/linuxfun.pdf</code>

請注意,下面的樣例中将遠端的檔案下載下傳到用戶端機器的目前目錄下,這是由ftp伺服器的ip位址後面的“.”決定的。

沒有trickle的情況下:

<code># ncftpget -u username -p password 111.111.111.111 . /testdir/linuxfun.pdf</code>

<code>linuxfun.pdf: 2.79 mb 260.53 mb/s</code>

在有trickle的情況下,限制下載下傳速率在20kb/s:

<code># trickle -s -d 30 ncftpget -u username -p password 111.111.111.111 . /testdir/linuxfun.pdf</code>

<code>linuxfun.pdf: 2.79 mb 17.76 kb/s</code>

trickle也可以按照/etc/trickled.conf檔案中定義的一系列參數運作在非托管模式下。 這個檔案定義了守護線程 trickled的行為以及如何管理trickle。

另外,如果你想要全局設定被所有的應用程式使用的話,我們就會需要使用trickle指令。 這個指令運作守護程序,并允許我們通過trickle定義所有應用程式共享的上傳下載下傳限制,不需要我們每次來進行指定。

例如,運作:

<code># trickled -d 50 -u 10</code>

會導緻任何通過trickle運作的應用程式的上傳下載下傳速率分别限制在30kb/s和10kb/s。

請注意,你可以在任何時間都能确認守護線程trickled是否正在運作以及其運作參數:

<code># ps -ef | grep trickled | grep -v grep</code>

輸出:

<code>root 16475 1 0 dec24 ? 00:00:04 trickled -d 50 -u 10</code>

樣例3:在使用/不使用trickle的情形下上傳一個 19mb 的mp4檔案到我們的ftp伺服器。

我們将會在開始時通過以下的指令将這個檔案下載下傳到你的目前工作目錄中:

<code># wget http://media2.ldscdn.org/assets/missionary/our-people-2014/2014-00-1460-he-is-the-gift-360p-eng.mp4</code>

首先,我們會使用之前列出的指令來開啟守護程序trickled:

<code># trickled -d 30 -u 10</code>

在不使用trickle時:

<code># ncftpput -u username -p password 192.168.0.15 /testdir 2014-00-1460-he-is-the-gift-360p-eng.mp4</code>

<code>2014-00-1460-he-is-the-gift-360p-eng.mp4: 18.53 mb 36.31 mb/s</code>

在使用trickle時:

<code># trickle ncftpput -u username -p password 192.168.0.15 /testdir 2014-00-1460-he-is-the-gift-360p-eng.mp4</code>

<code>2014-00-1460-he-is-the-gift-360p-eng.mp4: 18.53 mb 9.51 kb/s</code>

我們可以看到上面的輸出,上傳的速率下降到了約 10kb/s。

** 樣例4:在使用/不使用trickle的情形下下載下傳這個相同的視訊 **

與樣例2一樣,我們會将該檔案下載下傳到目前工作目錄中。

在沒有trickle時:

<code># ncftpget -u username -p password 192.168.0.15 . /testdir/2014-00-1460-he-is-the-gift-360p-eng.mp4</code>

<code>2014-00-1460-he-is-the-gift-360p-eng.mp4: 18.53 mb 108.34 mb/s</code>

有trickle的時:

<code># trickle ncftpget -u username -p password 111.111.111.111 . /testdir/2014-00-1460-he-is-the-gift-360p-eng.mp4</code>

<code>2014-00-1460-he-is-the-gift-360p-eng.mp4: 18.53 mb 29.28 kb/s</code>

上面的結果與我們之前設定的下載下傳限速相對應(30kb/s)。

注意: 一旦守護程序開啟之後,就沒有必要使用trickle來為每個應用程式來單獨設定限制。

如前所述,人們可以進一步地通過trickled.conf來客制化trickle的帶寬速率調整,該檔案的一個典型的分段有以下部分組成:

<code>[service]</code>

<code>priority = &lt;value&gt;</code>

<code>time-smoothing = &lt;value&gt;</code>

<code>length-smoothing = &lt;value&gt;</code>

其中,

[service] 用來訓示我們想要對其進行帶寬使用調整的應用程式名稱

priority 用來讓我們為某個服務制定一個相對于其他服務高的優先級,這樣就不允許守護程序管理中的一個單獨的應用程式來占用所有的帶寬。越小的數字代表更高的優先級。

time-smoothing [以秒計]: 定義了trickled讓各個應用程式傳輸或接收資料的時間間隔。小的間隔值(0.1-1秒)對于互動式應用程式是理想的,因為這樣會具有一個更加平滑的會話體驗,而一個相對較大的時間間隔值(1-10秒)對于需要批量傳輸應用程式就會顯得更好。如果沒有指定該值,預設是5秒。

length-smoothing [kb 機關]: 該想法與time-smoothing如出一轍,但是是基于i/o操作而言。如果沒有指定值,會使用預設的10kb。

上述平滑值(time-smoothing、 length-smoothing)的改變會被翻譯為将指定的服務的使用一個間隔值而不是一個固定值。不幸的是,沒有一個特定的公式來計算間隔值的上下限,主要依賴于特定的應用場景。

下面是一個在centos 7 用戶端中的trickled.conf 樣例檔案(192.168.0.17):

<code>[ssh]</code>

<code>priority = 1</code>

<code>time-smoothing = 0.1</code>

<code>length-smoothing = 2</code>

<code></code>

<code>[ftp]</code>

<code>priority = 2</code>

<code>time-smoothing = 1</code>

<code>length-smoothing = 3</code>

使用該設定,trickled會為ssh賦予比ftp較高的傳輸優先級。值得注意的是,一個互動程序,例如ssh,使用了一個較小的時間間隔值,然而一個處理批量資料傳輸的服務如ftp,則使用一個較大的時間間隔來控制之前的樣例中的上傳下載下傳速率,盡管不是百分百的由trickled指定的值,但是也已經非常接近了。

在該文章中,我們探索了使用trickle在基于fedora發行版和debian衍生版平台上來限制應用程式的帶寬使用。也包含了其他的可能用法,但是不對以下情形進行限制:

如果你的伺服器是在一個代理或防火牆後面(或者其本身即是代理或防火牆的話),你可以使用trickle來同時設定下載下傳和上傳速率,或者用戶端或外部通訊的速率。

歡迎提問或留言。

原文釋出時間:2015-05-27

本文來自雲栖合作夥伴“linux中國”

繼續閱讀