Linux

限制 Ubuntu Linux 上的頻寬

  • May 15, 2015

我處於必須模擬 P2P 環境的情況(對於我的電腦科學碩士論文)。為此,我使用 Docker 和 Ubuntu 來創建一堆將連接到 BitTorrent 網路的虛擬機。然後我需要確保可以設置對等方的上傳和下載速率,並且我不能在客戶端中執行此操作(因為客戶端使用睡眠來模擬較低的頻寬,這會導致峰值速度)。

因此我試圖為每個容器做這件事。老實說,只要它有效,我並不關心它是如何完成的,但我嘗試了不同的東西,但沒有運氣。這些是我到目前為止嘗試過的事情:

  1. 涓涓涓涓 涓涓細流似乎在做這個伎倆,但由於某種原因,當我啟動超過 5 個 Docker 容器時,Trickle 會讓它們中的很多退出而不告訴我原因。我嘗試了不同的設置,但是在配置方面你沒有那麼多旋鈕可以轉動,所以我認為在這種情況下 Trickle 不會是一個選項。
  2. Wondershaper 使用 Wondershaper 似乎有效,或者至少它限制了頻寬。這裡唯一的問題是選項中設置的值與實際頻寬之間沒有看似可以理解的相關性。當我設置下載 2048(應該是 kbits)時,實際下載範圍在 550KB 和 900KB 之間,這看起來很奇怪。
  3. tc 就像許多人針對類似問題所建議的那樣,使用 tc 確實會限制頻寬,但無論我設置什麼值,它總是給我相同的頻寬(大約 15-20KB/s)。

我已經嘗試過大量的指南和範例,但每一個都沒有工作或上面描述過。我在這裡有點不知所措,所以如果有人知道上述範例應該起作用或有其他解決方案的任何原因,那就太棒了。

我正在尋找的是一種限制單個 Linux 實例的方法,然後我應該能夠使其適用於多個 Docker 容器。

                • 編輯 - - - - - - - -

我嘗試了幾個不同的 tc 命令,但其中一個是這樣的

DEV=eth0
tc qdisc del dev $DEV root
tc qdisc add dev $DEV root handle 1: cbq avpkt 1000 bandwidth 100mbit
tc class add dev $DEV parent 1: classid 1:1 cbq rate 256kbit allot 1500 prio  5 bounded isolated
tc filter add dev $DEV parent 1: protocol ip prio 16 u32 match ip src 0.0.0.0/0 flowid 1:1
tc qdisc add dev $DEV parent 1:1 sfq perturb 10

無論我設置什麼速率,它總是給我大約 12 KB/s 的下載速度(沒有設置限制的預設下載大約是 4MB/s)

————編輯2(我最終做了什麼)————

事實證明,您無法可靠地為容器內的 Docker 容器設置頻寬,但是每當您創建一個新容器時,都會在名為 vethsomething 的主機上創建一個虛擬介面。如果您在這些虛擬介面上使案例如 Wondershaper,則限制具有正確的行為:)

使用 tc (因為它是最新的,而且我最熟悉它),您應該能夠毫無問題地減慢流量。

我有一台伺服器充當防火牆(稱為“防火牆”——非常有創意),然後是第二台伺服器(稱為“mil102”)。沒有任何 tc 命令,從 mil102 到防火牆的 scp’ing 文件會全速移動:

root@firewall:/data#scp mil102:/root/test.tgz test.tgz
test.tgz       100%  712MB  71.2MB/s   00:10

將以下命令添加到 mil102(更容易塑造發送流量):

#!/bin/sh
DEV=eth0
tc qdisc del dev $DEV root
tc qdisc add dev $DEV handle 1: root htb default 11
tc class add dev $DEV parent 1: classid 1:1 htb rate 4Mbps
tc class add dev $DEV parent 1:1 classid 1:11 htb rate 4Mbit
tc qdisc add dev $DEV parent 1:11 handle 11: sfq perturb 10

現在相同的命令減慢到 4Mb:

root@firewall:/data#scp mil102:/root/test.tgz test.tgz
test.tgz         0% 6064KB 467.0KB/s   25:48 ETA

我停止了轉移——這需要很長時間。scp 中列出的速度以字節為單位,在 tc 中以位為單位指定,因此 467KB * 9 = 4203Kb,接近我的 4096Kb 限制(以為是 *8,但我猜有奇偶校驗位?)。

我嘗試更改為 10Mbit,我的 scp 顯示我正在以每秒 1.1MB (1.1 * 9 = 9.9) 的速度移動數據。

添加了“sfq perturb 10”指令的最後一行,以平衡載入連接上的流量。它根據循環雜湊指示隊列從每個對話中獲取數據包。

您可以在有和沒有的情況下進行測試——通過 ssh 連接到已載入的機器,而不會突然出現,並且會更加流暢(對於 VOIP 非常重要)。‘perturb 10’ 告訴它每 10 秒重新計算一次散列算法以使其隨機化。

引用自:https://serverfault.com/questions/691066