找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7291|回复: 10

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

[复制链接]
发表于 2013-3-11 12:58:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

×
本帖最后由 西山狼 于 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=[/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;}
}
routeros
发表于 2013-3-11 14:40:44 | 显示全部楼层
用PCQ就行了,不用考虑流量和时间。
routeros
回复

使用道具 举报

发表于 2013-3-11 15:20:36 | 显示全部楼层
这样的脚本会持续耗费内存,直到内存耗尽自动重启。
routeros
回复

使用道具 举报

 楼主| 发表于 2013-3-11 15:40:37 | 显示全部楼层

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

使用道具 举报

 楼主| 发表于 2013-3-11 15:40:57 | 显示全部楼层
9939781 发表于 2013-3-11 15:20
这样的脚本会持续耗费内存,直到内存耗尽自动重启。

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

使用道具 举报

发表于 2013-3-11 21:38:04 | 显示全部楼层
不同组的用户不同速率用PCQ一样可以,你可以不同组用户使用不同PCQ。PCQ的RATE参数用起来。
routeros
回复

使用道具 举报

 楼主| 发表于 2013-3-12 09:29:00 | 显示全部楼层
rosabc 发表于 2013-3-11 21:38
不同组的用户不同速率用PCQ一样可以,你可以不同组用户使用不同PCQ。PCQ的RATE参数用起来。

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

使用道具 举报

发表于 2013-3-20 01:36:28 | 显示全部楼层
这个脚本是自已写的还是?
routeros
回复

使用道具 举报

发表于 2013-3-20 10:14:58 | 显示全部楼层
这个脚本是mikrotik脚本论坛一国外的大神写的,忘记是俄罗斯的还是乌克兰的了
routeros
回复

使用道具 举报

 楼主| 发表于 2013-3-20 11:15:06 | 显示全部楼层
cicinh 发表于 2013-3-20 01:36
这个脚本是自已写的还是?

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

使用道具 举报

发表于 2014-3-6 23:47:36 | 显示全部楼层
:lol:lol:lol:lol
routeros
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|手机版|小黑屋|软路由 ( 渝ICP备15001194号-1|渝公网安备 50011602500124号 )

GMT+8, 2024-4-28 23:00 , Processed in 0.088497 second(s), 4 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表