分享

ROS单IP动态限速脚本,根据流量自动限速

 shaguada 2012-04-01
ROS单IP动态限速脚本,根据流量自动限速。
2008年11月26日 星期三 23:27

#注意:这个脚本是在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

#合法用户地址列表名称
: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;}
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多