西山狼 发表于 2013-3-11 12:58:57

这个根据流量自动限速,单IP动态限速脚本要如何修改才可以运行在ROS5.21下

本帖最后由 西山狼 于 2013-3-11 17:12 编辑

我原来用ROS 3.20最近更换主机因为硬件太新,只好升级成ROS 5.21 然后这个脚本就失去作用了,请问我要如何修改才可以再继续使用呢。

问题解决:
修改如下语句就可以了:
/interface monitor-traffic wan once do={:set CurRate $"rx-bits-per-second"}
/interface monitor-traffic wan once do={:set CurRate $"tx-bits-per-second"}

原来的脚本如下:
#注意:这个脚本是在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= do={
      :set tadd
      :if ([:len ] > 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;}
}

rosabc 发表于 2013-3-11 14:40:44

用PCQ就行了,不用考虑流量和时间。

9939781 发表于 2013-3-11 15:20:36

这样的脚本会持续耗费内存,直到内存耗尽自动重启。

西山狼 发表于 2013-3-11 15:40:37

rosabc 发表于 2013-3-11 14:40 static/image/common/back.gif
用PCQ就行了,不用考虑流量和时间。

I3的cpu 4g内存,不用考虑ROS的承受能力,我设定好每天临晨4点自动重启一次服务器了,我必须用脚本。因为不同的IP用户有不同的网速。人数众多。

西山狼 发表于 2013-3-11 15:40:57

9939781 发表于 2013-3-11 15:20 static/image/common/back.gif
这样的脚本会持续耗费内存,直到内存耗尽自动重启。

I3的cpu 4g内存,不用考虑ROS的承受能力,我设定好每天临晨4点自动重启一次服务器了,我必须用脚本。因为不同的IP用户有不同的网速。人数众多。

rosabc 发表于 2013-3-11 21:38:04

不同组的用户不同速率用PCQ一样可以,你可以不同组用户使用不同PCQ。PCQ的RATE参数用起来。

西山狼 发表于 2013-3-12 09:29:00

rosabc 发表于 2013-3-11 21:38 static/image/common/back.gif
不同组的用户不同速率用PCQ一样可以,你可以不同组用户使用不同PCQ。PCQ的RATE参数用起来。

难,因为网络规划不是我做,IP地址很乱ABC类都有,我只做路由。。。

cicinh 发表于 2013-3-20 01:36:28

这个脚本是自已写的还是?

huigezi' 发表于 2013-3-20 10:14:58

这个脚本是mikrotik脚本论坛一国外的大神写的,忘记是俄罗斯的还是乌克兰的了

西山狼 发表于 2013-3-20 11:15:06

cicinh 发表于 2013-3-20 01:36 static/image/common/back.gif
这个脚本是自已写的还是?

别人写的呀,我可不会,这样复杂的东西。
不过这个脚本真的很好,在一个很乱的网络A类,B类,C类,都出现的情况下这个脚本牛逼了。什么IP上来都可以做到单个路由限速。
说真的,很感谢研究出这个脚本的大神,不然我都不知道怎么办。毕竟这个鸟网络。有普通的员工,有中层,有高层。然后空闲时期高层占多少,别的又占多少,高峰期又如何,呵呵恐怖到极点。
我放出来的是原始的,各位自己还要根据需要再自己修改。

ufo1003 发表于 2014-3-6 23:47:36

:lol:lol:lol:lol:lol:lol:lol
页: [1]
查看完整版本: 这个根据流量自动限速,单IP动态限速脚本要如何修改才可以运行在ROS5.21下