之前讲过如何对 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
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