Linux下的程序限速软件Trickle

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

场景如下:

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

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

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

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

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

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

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

一、单文件单独限速

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

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

二、多文件整体限速

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

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

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

三、tc

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

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

四、杀器trickle

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

安装:

1$ yum install -y epel-release
2$ yum install trickle

参数解释:

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

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

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

image-20211028151940122

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

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

1# 首先启动守护进程 trickled
2$ trickled -u 7200 -d 7200
3
4# 然后所有用trickle执行的命令就会整理限速在7200KB/s (网络速度60M)
5find . -type f  | grep $(date -d"-1 day" +'%Y%m%d') |xargs -I % -P 30 trickle rsync -auvPR % 192.168.9.17::mysql

Dockerfile的编写与调试技巧
Shell以及find的多线程执行
comments powered by Disqus