7

Linux下的程序限速软件Trickle

 2 years ago
source link: https://zhangrr.github.io/posts/20211028-trickle/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

之前讲过如何对 opnvpn 总体限速,这次来了一个更严格的程序限速需求:

场景如下:

  • 两个机房间有一条专线 100M

  • 两个机房间需要同步数据,同步需要限制到60M,给别的程序留出带宽空间

  • 传输是多个文件,用 rsync 并发传送

分析了一下脚本的核心部分

find . -type f  | grep $(date -d"-1 day" +'%Y%m%d') |xargs -I % -P 30 rsync -auvPR % 192.168.9.17::mysql
shell

发现是利用 xargs 的并发,-P 30 最大并发30个,启动了 rsync 同步

rsync 没有限速,这就麻烦了。

一、单文件单独限速

首先是使用 rsync 的 –bwlimit=600 参数,把速度限制为 600KB/s ,600×8=4800,单进程基本是5M的速度,最多只能跑12个了,就会跑到60M。

这样也不太对,尤其是 rsync 并发进程逐渐减少,少于12个的时候,这样就出现跑不满60M的现象。

二、多文件整体限速

那么 rsync 支持多文件传输 ,使用如下格式整体限速

rsync --bwlimit=7200 -auvPR 文件1 文件2 文件3 192.168.9.17::mysql 
shell

问题又来了,文件1 文件2 文件3 的路径非常长,而文件个数不定,有撑爆命令行单行长度限制的可能,也不可行

使用 tc 可以控制源ip或者目的ip的带宽,但是本机网卡是万兆光卡,生产环境,每时每刻都有数据读写。

一旦错了,就直接完蛋了。也不太可行

四、杀器trickle

寻找了半天,终于找到了个大杀器trickle,可以对程序单独限速,也可以对一堆程序整体限速

$ yum install -y epel-release
$ yum install trickle
shell

参数解释:

  • -u 上载速度 KB/s ,乘以8换算成网络速度
  • -d 下载速度 KB/s ,乘以8换算成网络速度
  • -s standalone独立模式,不参与 trickled 的整体模式

如果要对一个程序单独限速,10KB

trickle -s -u 10 -d 10 wget http://mirrors.163.com/rocky/8/isos/x86_64/Rocky-8.4-x86_64-dvd1.iso
shell

image-20211028151940122

wget 的下载完全被限制在了10KB

如过要对使用trickle的所有程序做整体限速

# 首先启动守护进程 trickled
$ trickled -u 7200 -d 7200

# 然后所有用trickle执行的命令就会整理限速在7200KB/s (网络速度60M)
find . -type f  | grep $(date -d"-1 day" +'%Y%m%d') |xargs -I % -P 30 trickle rsync -auvPR % 192.168.9.17::mysql
shell

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK