ROS单IP动态限速脚本

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#注意:这个脚本是在ROS 3.0以上环境运行的,要在3.0以下运行,在脚本中找到以下两行,将其中的双引号删除即可。

# /interface monitor-traffic wan once do={:set CurRate $"received-bits-per-second"}
# /interface monitor-traffic wan once do={:set CurRate $"sent-bits-per-second"}

#*********脚本功能**********
#脚本在全局变量“Invs”的控制下,每隔“Invs”秒获取一次wan口发送与收到的流量。
#连取"ChkTimes"次后取平均值,即wan口在ChkTimes次采样中的平均发送与收到流量。
#然后根据总上/下行流量阀值调整每个IP QUEUE的限速值。
#优点:1.脚本不会因频烦调整限速值而占用大量CPU时间。
# 2.simple queue限速可以进行burst(突发)设置,在打开网页等应用中比PCQ限速用户体验更好。
# 3.每个IP建立对应的simple queue限速项,可以通过该项查看每个IP的即时流量和历史流量累计。
#*********使用方法**********
#网关广域网口名:wan ;局域网口名: lan
#在 \ip firewall address-list> 下依次添加需限速的每个IP地址到“userlist”的地址列表(即使是连续的地址,也要一个一个添加),如要添加IP:192.168.0.8,执行如下命令:
# /ip firewall address-list add list=userlist address=192.168.0.8
#脚本运行后会一直循环,当有新IP加入这个列表后,下一次改变限速值时会自动在 \queue simple>下建立相应的限速项目
#*********以下是脚本内容**********

#定义变量(具体数值要根据网络带宽和实际效果进行调整,现有数值是100M光纤带600用户的设置)
#脚本停止开关
:global IsRun true
#循环检测WAN口流量间隔秒数
:global Invs 5;
#循环检测WAN口流量次数
:global ChkTimes 60
#初始限定的单IP下行带宽(10M)
:global RxCurSet 10000000
#单IP最大下行带宽(10M)
:global RxMaxRate 10000000
#单IP最小下行带宽(5M)
:global RxMinRate 5000000
#总下行流量上阀值(60M)
:global RxUpSwRate 60000000
#总下行流量下阀值(30M)
:global RxDwSwRate 30000000

#初始限定的单IP上行带宽(1.2M)
:global TxCurSet 1200000
#单IP最大上行带宽(2M)
:global TxMaxRate 2000000
#单IP最小上行带宽(500K)
:global TxMinRate 500000
#总上行流量上阀值(50M)
:global TxUpSwRate 50000000
#总上行流量下阀值(30M)
:global TxDwSwRate 30000000

#限速用户IP地址列表名称
:global ListName "userlist"
#临时存放地址列表项的变量
:global ul
#临时存放地址的变量
:global tadd
#临时的循环变量
:global i 0
#检测的下行总流量合计
:global RxCurRate 0
#检测的上行总流量合计
:global TxCurRate 0
#临时存放总流量的变量
:global CurRate 0
#下行步进值
:global RxStepRate 0
#上行步进值
:global TxStepRate 0
#临时存放旧下行限定
:global OldRxSet 0
#临时存放旧上行限定
:global OldTxSet 0

:while ($IsRun) do={

:if (($OldRxSet!=$RxCurSet)||($OldTxSet!=$TxCurSet)) do={

:set RxStepRate ($RxCurSet / 3);
:set TxStepRate ($TxCurSet / 3);

:foreach ul in=[/ip firewall address-list find list=userlist] do={
:set tadd [/ip firewall address-list get $ul address]
:if ([:len [/queue simple find name=$tadd]] > 0) do={
/queue simple set $tadd target-addresses=[:tostr ($tadd . "/32")] \
limit-at=[:tostr ($TxCurSet . "/" . $RxCurSet)] \
max-limit=[:tostr (($TxCurSet + $TxStepRate) . "/" . ($RxCurSet + $RxStepRate))] \
burst-limit=[:tostr (($TxCurSet * 2) . "/" . ($RxCurSet * 2))] \
burst-threshold=[:tostr (($TxCurSet - $TxStepRate) . "/" . ($RxCurSet - $RxStepRate))] \
total-queue=ethernet-default \
burst-time=30/30
} else={
/queue simple add name=$tadd target-address=[:tostr ($tadd . "/32")] \
limit-at=[:tostr ($TxCurSet . "/" . $RxCurSet)] \
max-limit=[:tostr (($TxCurSet + $TxStepRate) . "/" . ($RxCurSet + $RxStepRate))] \
burst-limit=[:tostr (($TxCurSet * 2) . "/" . ($RxCurSet * 2))] \
burst-threshold=[:tostr (($TxCurSet - $TxStepRate) . "/" . ($RxCurSet - $RxStepRate))] \
total-queue=ethernet-default \
burst-time=30/30
}
}
}

:set RxCurRate 0
:set TxCurRate 0
:for i from=1 to=$ChkTimes do={
/interface monitor-traffic wan once do={:set CurRate $"received-bits-per-second"}
:set RxCurRate ($RxCurRate + $CurRate)
/interface monitor-traffic wan once do={:set CurRate $"sent-bits-per-second"}
:set TxCurRate ($TxCurRate + $CurRate)
:delay $Invs
}
:set RxCurRate ($RxCurRate / $ChkTimes)
:set TxCurRate ($TxCurRate / $ChkTimes)

:set OldRxSet $RxCurSet
:set OldTxSet $TxCurSet

:if ($RxCurRate<$RxDwSwRate) do={:set RxCurSet ($RxCurSet + $RxStepRate);}
:if ($RxCurRate>$RxUpSwRate) do={:set RxCurSet ($RxCurSet - $RxStepRate);}
:if ($TxCurRate<$TxDwSwRate) do={:set TxCurSet ($TxCurSet + $TxStepRate);}
:if ($TxCurRate>$TxUpSwRate) do={:set TxCurSet ($TxCurSet - $TxStepRate);}

:if ($RxCurSet<$RxMinRate) do={:set RxCurSet $RxMinRate;}
:if ($RxCurSet>$RxMaxRate) do={:set RxCurSet $RxMaxRate;}
:if ($TxCurSet<$TxMinRate) do={:set TxCurSet $TxMinRate;}
:if ($TxCurSet>$TxMaxRate) do={:set TxCurSet $TxMaxRate;}
}

相关文档
最新文档