• 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)
    
    • 1
    • 2

    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>      	设置延时
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    安装

    # 在 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

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

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

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

    简绍

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

    LD_TRACE_LOADED_OBJECTS
    LD_WARN
    LD_BIND_NOW
    LD_LIBRARY_VERSION
    LD_VERBOSE
    LD_DEBUG
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    当LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,它都会只显示模块的dependency,而程序并不真正执行。
    例如:
    1)export LD_TRACE_LOADED_OBJECTS=1
    2)再执行任何的程序,如ls等,看看程序的运行结果

    [root@zhz ~]# ls
    	linux-vdso.so.1 =>  (0x00007ffc48b42000)
    	libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f9504e0b000)
    	libcap.so.2 => /lib64/libcap.so.2 (0x00007f9504c06000)
    	libacl.so.1 => /lib64/libacl.so.1 (0x00007f95049fd000)
    	libc.so.6 => /lib64/libc.so.6 (0x00007f950462f000)
    	libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f95043cd000)
    	libdl.so.2 => /lib64/libdl.so.2 (0x00007f95041c9000)
    	/lib64/ld-linux-x86-64.so.2 (0x00007f9505032000)
    	libattr.so.1 => /lib64/libattr.so.1 (0x00007f9503fc4000)
    	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f9503da8000)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    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
    
    • 1
    • 2
    • 3
    • 4

    LD_TRACE_LOADED_OBJECTS为必要环境变量,其他视具体情况。

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

    unset LD_TRACE_LOADED_OBJECTS
    
    • 1

    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   (详细信息模式,打印所有信息,例如包括符号的版本信息)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    Behind every outstanding person, there is a period of silence

  • 相关阅读:
    ChatGPT⼊门到精通(6):ChatGPT 提问设计
    GB/T28181-2016传输要求和Android平台设备接入技术实现
    paddlepaddle安装的问题
    (附源码)计算机毕业设计JavaJava毕设项目美容院管理系统
    RNA-seq 详细教程:搞定count归一化(5)
    Mybiosource基因编辑技术HIV及研究工具
    基因组大小查询(二)|基因组组装结果查询
    Android 11.0 12.0当安装多个播放器时,设置默认播放器播放歌曲
    前后端分离技术架构模式演变
    Redis介绍、安装、性能优化
  • 原文地址:https://blog.csdn.net/qq_50573146/article/details/126545485