当网络带宽有限时,一个程序抢占式占用带宽会导致其他程序无法使用带宽传输数据。本篇介绍如何使用 trickle 限制某个程序的上传和下载速度。

介绍

trickle 是一个便携式轻量级用户空间带宽限制器,可以在协作模式(与 trickled 一起)或独立模式(-s)下运行。它通过预加载自己的套接字库包装器来工作,通过延迟数据来限制流量。 trickle 完全在用户空间中运行。

并不是所有程序都能利用 trickle 进行限速。因为 trickle 是使用动态链接和加载,所以它只对使用 “Glibc库” 的程序有用。判断一个程序是否能使用 trickle:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ldd $(which scp) | grep libc.so
# libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2fad4be000)

ldd /usr/bin/wget | grep libc.so
# libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f37a4802000)

ldd $(which python) | grep libc.so
# libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007faec4f60000)

ldd $(which bash) | grep libc.so
# libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6487786000)

ldd $(which rsync) | grep libc.so
# libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6af2ac5000)

如果出现上面的 libc.so 等,那么就说明该程序可以使用 trickle 进行限速。

安装

1
sudo apt update && sudo apt install trickle

使用

1
trickle -h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Usage: trickle [-hvVs] [-d <rate>] [-u <rate>] [-w <length>] [-t <seconds>]
[-l <length>] [-n <path>] command ...
-h Help (this)
-v Increase verbosity level
-V Print trickle version
-s Run trickle in standalone mode independent of trickled;独立模式下运行
-d <rate> Set maximum cumulative download rate to <rate> KB/s;设置最大累计下载速度
-u <rate> Set maximum cumulative upload rate to <rate> KB/s;设置最大累计上传速度
-w <length> Set window length to <length> KB;设置窗口长度,默认512KB
-t <seconds> Set default smoothing time to <seconds> s;设置默认的平滑时间。平滑时间决定多少时间间隔trickle将尝试让应用程序传输数据。较小的值(0.1 - 1秒)会导致更连续(平滑)会话,非常适合于交互式应用。而较大的值(1 - 10秒)可能会产生一阵阵的发送和接收数据,对需要大量带宽的应用程序更好。
-l <length> Set default smoothing length to <length> KB;设置默认的平滑长度。 默认 10 KB。
-n <path> Use trickled socket name <path>;指定 trickled socket名称。 默认 /tmp/.trickled.sock
-L <ms> Set latency to <ms> milliseconds;设置延时。
-P <path> Preload the specified .so instead of the default one

trickle 可以在独立模式或协作模式下使用。下面分别介绍。

独立模型

独立模式下,trickle 需要手动对单个程序进行限速,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 一般情况下,都是在程序最前面增加 trickle 进行限速
# 注意,单位是 KB/s
trickle -s -d 100 scp www.trickle.com:./archive/downloads/FileZilla_3.60.1_win64_sponsored-setup.exe .

trickle -s -d 100 wget https://github.com/coder/code-server/releases/download/v4.91.0/code-server-4.91.0-linux-arm64.tar.gz

# 添加到 system
ExecStart=/usr/bin/trickle /usr/bin/daemon

# 不要将 trickle 放在 rsync 命令前面(这不会起作用,因为 rsync 可能会分叉 ssh 进程),您可以像这样调用 rsync
rsync -avzP --append --rsh="trickle -d 100 -u 100 ssh -l jinzhongxu" www.trickle.com:./FileZilla_3.60.1_win64_sponsored-setup.exe .
# or
rsync -avzP --append -e "trickle -d 100 -u 100 ssh -l jinzhongxu" www.trickle.com:./FileZilla_3.60.1_win64_sponsored-setup.exe .

协作模式

协作模式下,trickle 可以使用 daemon 的形式后台指定限速,只需要在命令前增加 trickle 即可。

修改配置文件 /etc/trickled.conf,例如:

1
2
3
4
5
6
7
8
9
[ssh]
Priority = 1
Time-Smoothing = 0.1
Length-Smoothing = 2

[ftp]
Priority = 8
Time-Smoothing = 5
Length-Smoothing = 20

然后,启用后台

1
trickled -u 100 -d 100

最后,对应用程序限速

1
2
3
trickle scp www.trickle.com:./archive/downloads/FileZilla_3.60.1_win64_sponsored-setup.exe .

trickle wget https://github.com/coder/code-server/releases/download/v4.91.0/code-server-4.91.0-linux-arm64.tar.gz

参考文献

  1. archlinux-trickle
  2. 指南:使用 Trickle 限制应用程序带宽占用
  3. centos7使用trcikle进行网络限速
  4. Linux 下使用Trickle限制下载/上传带宽