TRICKLE轻量级的用户空间带宽控制管理工具

TRICKLE

trickle是一款轻量级的用户空间带宽控制管理的工具,用来限制如浏览器Firefox等, FTP , SSH,curl,wget,scp等等使用网络带宽。
trickle通过控制socket数据读写量来控制和限制应用的上传和下载速度。它使用另一个版本的BSD套接字API,但区别就是trickle还管理socket调用。要注意的是trickle使用动态链接和加载,所以只对于使用libc.so/glibc库的程序有用,其他的则无效的。由于trickle可以设置数据在socket上的传输延迟,因此就可以用来限制应用程序的网络带宽。

Trickle通过在程序运行时,预先加载一个 速率限制 socket 库 的方法,trickle命令允许你改变任意一个特定程序的流量。trickle 命令有一个很好的特性是它《仅在用户空间中》运行,这意味着,你不必需要 root 权限就可以限制一个程序的带宽使用。要能使用 trickle 程序控制程序的带宽,这个程序就必须使用非静态链接库的套接字接口。当你想对一个不具有内置带宽控制功能的程序进行速率限制时,trickle 就派上用场了。

TRICKLE不能做什么

Trickle不能用于限制使用UDP协议的应用的带宽,它只可用于TCP协议的连接,但是你要知道它也并不是对所有的TCP连接有效。如果你仔细看了Trickle是如果工作的,你可以猜到原因是什么,所以你还得记住trickle只对使用Glibc库应用有效。
还要说明一下, trickle无法工作在使用静态链接的可执行程序上。
确定Trickle是否可运行在某个特定应用上, 案例如下:

[root@master ~]# ldd /usr/bin/wget |grep  --col libc.so
        libc.so.6 => /lib64/libc.so.6 (0x00007fe3e956e000)

ldd工具可以帮我们找出某个特定的程序是否使用了libc.so库, 如果程序使用了这个库,就可以使用trickle来限制它的网络带宽使用。ldd命令用于打印每个程序需要的共享库, 如果你是一个好奇宝宝,那么你可以使用man命令来找出关于ldd工具的更多信息,做编译安装程序和可移植的时候ldd命令很管用。

限制网络带宽命令(限速命令)

trickle(自行安装)用来显式地定义给定应用程序的上传下载速率。Trickle基本使用方法,仅需简单地把 trickle 命令(及速率参数)放在你想运行的命令之前即可。
trickle可以限制例如:ftp,ssh,curl,wget,scp等传输网速,避免占用所有网络带宽。

# 格式:
trickle -s -d[下载速率,KB/s] -u[上传速率,KB/s] [选项例如wget等]
-v 				Increase verbosity level
-V 				Print trickle version
-s 				在独立模式下独立运行
-d <rate>   	设置最大累计下载速率为 <rate> KB/s
-u <rate> 		设置最大累计上传速度为 <rate> KB/s
-w <length> 	设置窗口长度为 <length> KB 。默认512KB
-t <seconds> 	设置默认的平滑时间 <seconds> s 。平滑时间决定多少时间间隔trickle将尝试让应用程序传输数据。较小的值(0.1 - 1)会导致更连续(平滑)会话,非常适合于交互式应用。而较大的值(1 - 10)可能会产生一阵阵的发送和接收数据,对需要大量带宽的应用程序更好
-l <length> 	设置默认的平滑长度 <length> KB 。 默认10 KB
-n <path> 		指定trickled socket名称 <path> 。 默认/tmp/.trickled.sock
-L <ms>      	设置延时

安装

# 在 Ubuntu、Debian 及其衍生发行版中安装 trickle:
sudo apt-get -y install trickle
# 在 Fdora 或 CentOS/RHEL (带有 EPEL 软件仓库):
sudo yum -y install trickle
# 源码编译安装:
wget https://codeload.github.com/mariusae/trickle/zip/master
mv master trickle-master.zip
unzip trickle-master.zip
yum -y install autoconf automake libtool libevent-devel
cd trickle-master
autoreconf -if
./configure
make
make install

ldd不是一个可执行程序,而只是一个shell脚本

[root@node1 ~]# file /usr/bin/ldd
/usr/bin/ldd: Bourne-Again shell script, ASCII text executable

这是’ ldd’命令,它列出了给定的动态链接可执行文件使用的共享库。它的工作方式是将运行时动态链接器作为命令调用,并将环境变量LD_TRACE_LOADED_OBJECTS设置为一个非空值。

简绍

ldd能够显示可执行模块的dependency,其原理是通过设置一系列的环境变量
如:

LD_TRACE_LOADED_OBJECTS
LD_WARN
LD_BIND_NOW
LD_LIBRARY_VERSION
LD_VERBOSE
LD_DEBUG

当LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,它都会只显示模块的dependency,而程序并不真正执行。
例如:
1)export LD_TRACE_LOADED_OBJECTS=1
2)再执行任何的程序,如ls等,看看程序的运行结果
ldd默认开启的环境变量是:LD_TRACE_LOADED_OBJECTS=1
其他的变量(和值)分别对应一些选项:
-d, --data-relocs -> LD_WARN=yes
-r, --function-relocs ->LD_WARN和LD_BIND_NOW=yes
-u, --unused -> LD_DEBUG=“unused”
-v, --verbose -> LD_VERBOSE=yes
LD_TRACE_LOADED_OBJECTS为必要环境变量,其他视具体情况。

撤销该环境变量,ls 即又可以恢复正常使用:
unset LD_TRACE_LOADED_OBJECTS

ldd显示可执行模块的dependency的工作原理,其实质是通过ld-linux.so(elf动态库的装载器)来实现的。我们知道ld-linux.so模块会先于executable模块程序工作,并获得控制权,因此当上述的那些环境变量被设置时,ld-linux.so选择了显示可执行模块的dependency。
ldd命令的本质是执行了:/lib/ld-linux.so.*

实际上可以直接执行ld-linux.so模块,如:/lib/ld-linux.so.2 --list program(这相当于ldd program)
ldd可以获得的共享库文件,其实是通过读取ldconfig命令组建起来的文件(/etc/ld.so.cache)。
默认的共享库文件搜索/lib优先于/usr/lib,而且也只有这个2个目录。如果想要加入其他路径,则需要通过ldconfig命令配置相关文件。
一般ld-linux.so会按照以下顺序搜索共享库:
1、DT_RPATH或DT_RUNPATH段
2、环境变量LD_LIBRARY_PATH
3、/etc/ld.so.cache文件中的路径,但如果可执行程序在连接时候添加了-z nodeflib选项,则跳过。
4、默认路径/lib和/usr/lib,但如果添加了-z nodeflib,则跳过。

Usage: ldd [OPTION]... FILE...
      --help              print this help and exit   (获取指令帮助信息)
      --version           print version information and exit  (打印ldd的版本号)
  -d, --data-relocs       process data relocations   (执行重定位和报告任何丢失的对象)
  -r, --function-relocs   process data and function relocations  (执行数据对象和函数的重定位,并且报告任何丢失的对象和函数)
  -u, --unused            print unused direct dependencies (打印未使用的直接依赖)
  -v, --verbose           print all information   (详细信息模式,打印所有信息,例如包括符号的版本信息)

Behind every outstanding person, there is a period of silence

猜你喜欢

转载自blog.csdn.net/qq_50573146/article/details/126545485