Limit Linux’s network bandwidth and uploading/downloading rate.
Ivon今天要分享限制Linux網路速度的工具,限制Linux電腦下載與上傳檔案的速度。以Ubuntu為例。
咦?網路不是越快越好嗎?是這樣沒錯啦,但有些場合可能要限制網速。就比如Ivon家裡網路太慢,某個程式一下載東西,其他程式的頻寬就被吃光了!頻寬佔用的情況嚴重到KDE Plasma桌面還會以為我的電腦斷線了呢!
此外,如果Ivon在遠端SSH工作的時候不小心開了一個程式吃光網路頻寬,那麼SSH連線甚至會被被迫切斷,這還挺惱人的!
不是每個程式都有網速限速功能,所以要用其他工具來控制。
Ivon不想要透過路由器端限速,所以選了這兩個工具:WonderShaper與Trickle,都是命令行。我找不到圖形界面的限速工具。
還請注意這篇文章Ivon只討論Linux桌面限速的方式,作用的範圍是在Linux電腦本機而已,沒有討論伺服器如何應對外來連線限速!如果要達成此操作,請移步nginx。
還有,這裡只有討論如何限制網路速度,沒有討論如何針對行動網路資費限制流量。那個應該是ModemManager要做的事情!
1. 網速測試工具#
- 用speedtest-cli測試網速,了解目前電腦網路最高上傳與下載速度為何。參考Github指示安裝。
sudo apt install speedtest-cli --share
執行
speedtest-cli
指令等待結果回傳,單位為Mbps,請自行換算。再用Nethogs小工具,查看那些程式正在佔用網路頻寬,能方便找出吃網速的元兇。
sudo apt install nethogs
- 執行
sudo nethogs
指令能夠看到佔用頻寬最多的程式
2. WonderShaper限制網路介面網速#
WonderShaper封裝了tc指令,簡化操作,它是以網路介面下去限制的,例如針對「乙太網路」限速,則所有使用這個介面的程式都會受到限制。
這樣做的好處是可以單獨限制Docker裡面程式的網速(如果都走docker0的橋接器的話),而不影響宿主機服務。
- 參考Github說明安裝,發行版套件庫收的可能是舊版套件。由於它只是個指令稿,所以直接從Github下載安裝就行了。
git clone https://github.com/magnific0/wondershaper.git
cd wondershaper
chmod +x wondershaper
sudo mv wondershaper /usr/local/bin
- 利用NetworkManager列出Linux目前所有的網路界面,例如我的乙太網路界面叫做
enp2s0
sudo nmcli
- 加上引數
-a
選取enp2s0界面,後面用-u
和-d
限制上傳與下載的速度,這裡單位為Kbps。所以這條指令會將上傳與下載速度的上限設定為1Mbps
sudo wondershaper -a enp2s0 -u 1024 -d 1024
嘗試執行
speedtest-cli
測速,應該會發現網路變慢了。解除網速限制:
sudo wondershaper -c -a enp2s0
- 如果要在開機後執行WonderShaper的規則,把它做成Systemd服務。首先要新增全域設定檔。
sudo vim /etc/systemd/wondershaper.conf
- 設定全域的設定值:
[wondershaper]
# 網路界面
IFACE="enp2s0"
# 上傳速度
USPEED="1024"
# 下載速度
DSPEED="1024"
- 取得WonderShaper開發者提供的Systemd檔案
sudo wget https://raw.githubusercontent.com/magnific0/wondershaper/refs/heads/master/wondershaper.service -P /etc/systemd/system
- 啟動WonderShaper服務。
sudo systemctl daemon-reload
sudo systemctl enable --now wondershaper
3. Trickle限制單一程式網速#
跟WonderShaper不同,Trickle僅針對單一程式限速。
值得注意的是:
- Tirckle只對glibc的程式有效,請用
ldd 二進位檔路徑 | grep libc.so
確認該程式是否有連結到libc。 - 無法限制會fork行程的程式。不過我測試Trickle對Firefox和Chromium是有效的。
- 無法限制使用UDP通訊埠的程式。想知道程式使用哪個通訊埠,請利用指令
sudo lsof -i -P -n
查看。
執行Trickle的時候不需要sudo。
- 參考Github指示安裝Trickle。這個程式的作者似乎沒在維護了,如果找不到請手動下載deb安裝。
sudo apt install trickle
- Trickle只對新啟動的程式有效。用法如下,加上trickle指令與參數,限制該程式的網速,單位為Kbps。例如,限制wget指令的上傳下載網速為1Mbps:
trickle -u 1024 -d 1024 wget "file-to-download"
要停止限速,請執行
killall trickle
。可以改用
trickled
對目前所有的程式限速,它會在背景執行:
trickled -u 1024 -d 1024
你可以編輯Trickled設定檔,限制特定幾個程式的網速,不讓重要的連線被影響。Trickled的全域設定檔位置應該放在
/etc/trickled.conf
。該檔案是針對個別程式限速的設定檔,沒有列在檔案裡面的程式就不會被限速。
Priority
表示優先度,數字越大分到的頻寬越多。Time-Smoothing
為允許程式傳送資料的秒數間隔,Length-Smoothing
則是I/O操作長度作為時間間隔。使用這個設定檔之後執行Trickled指令,便只會對這些程式限速。
[ssh]
Priority = 1
Time-Smoothing = 0.1
Length-Smoothing = 2
[scp]
Priority = 2
Time-Smoothing = 0.1
Length-Smoothing = 2
[wget]
Priority = 3
Time-Smoothing = 0.1
Length-Smoothing = 2
[ftp]
Priority = 4
Time-Smoothing = 5
Length-Smoothing = 20