找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: kuwin

[限速] ROS用流量监控动态控制限速点(新方法)

[复制链接]
发表于 2008-11-28 15:13:07 | 显示全部楼层
routeros
回复

使用道具 举报

发表于 2008-11-28 15:50:34 | 显示全部楼层

和楼主交流一下我的限速脚本

#*********脚本功能**********

#脚本在全局变量“Invs”的控制下,每隔“Invs”秒获取一次wan口发送与收到的流量。

#连取10次后取平均值,即wan口在10次采样中的平均发送与收到流量。

#然后根据总上/下行流量阀值调整每个IP的限速值。

#*********使用方法**********

#网关广域网口名:wan   ;局域网口名: lan

#在 \ip firewall address-list> 下建立名称为“userlist”的地址列表

#当有新IP加入这个列表时会自动在 \queue simple>下建立相应的限速项目

#定义变量
#脚本停止开关
:global IsRun true
#循环间隔秒数除以10的数
:global Invs 10;
#当前下行总流量变量
:global RxCurRate 1000000
#当前限定的单IP下行带宽
:global RxCurSet 5000000
#单IP最大下行带宽
:global RxMaxRate 8000000
#单IP最小下行带宽
:global RxMinRate 500000
#总下行流量阀值
:global RxSwRate 18000000
#下行步进值
:local RxStepRate 10

#当前上行总流量变量
:global TxCurRate 1000000
#当前限定的单IP上行带宽
:global TxCurSet 5000000
#单IP最大上行带宽
:global TxMaxRate 8000000
#单IP最小上行带宽
:global TxMinRate 500000
#总上行流量阀值
:global TxSwRate 18000000
#上行步进值
:local TxStepRate 10
#合法用户地址列表名称
:global ListName "userlist"
#临时存放地址列表项的变量
:local ul
#临时存放地址的变量
:local tadd
#临时的循环变量
:local i 0
#临时存放总流量的变量
:local CurRate 10
#临时存放旧下行限定
:local OldRxSet 10
#临时存放旧上行限定
:local OldTxSet 10
:set RxStepRate ($RxCurSet / 10);
:set TxStepRate ($TxCurSet / 10);
:while ($IsRun) do={

:set OldRxSet $RxCurSet
:set OldTxSet $TxCurSet

:if ($RxCurRate<$RxSwRate) do={
    :if ($RxCurSet<$RxMaxRate) do={
      :set RxCurSet ($RxCurSet + $RxStepRate);
      :set RxStepRate ($RxCurSet / 10);}
} else={
    :if ($RxCurSet>$RxMinRate) do={
      :set RxStepRate ($RxCurSet / 10);
      :set RxCurSet ($RxCurSet - $RxStepRate)}}

:if ($TxCurRate<$TxSwRate) do={
    :if ($TxCurSet<$TxMaxRate) do={
      :set TxCurSet ($TxCurSet + $TxStepRate);
      :set TxStepRate ($TxCurSet / 10);}
} else={
    :if ($TxCurSet>$TxMinRate) do={
      :set TxStepRate ($TxCurSet / 10);
      :set TxCurSet ($TxCurSet - $TxStepRate)}}
      
:if (($OldRxSet!=$RxCurSet)||($OldTxSet!=$TxCurSet)) do={
    :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 dst-address=$tadd]] > 0) do={
        /queue simple set $tadd limit-at=[:tostr ($RxCurSet . "/" . $TxCurSet)] \
                   max-limit=[:tostr (($RxCurSet + $RxStepRate) . "/" . ($TxCurSet + $TxStepRate))] \
                   burst-limit=[:tostr (($RxCurSet * 2) . "/" . ($TxCurSet * 2))] \
                   burst-threshold=[:tostr (($RxCurSet - $RxStepRate) . "/" . ($TxCurSet - $TxStepRate))] \
                   burst-time=30/30
      } else={
        /queue simple add name=$tadd dst-address=$tadd \
                   limit-at=[:tostr ($RxCurSet . "/" . $TxCurSet)] \
                   max-limit=[:tostr (($RxCurSet + $RxStepRate) . "/" . ($TxCurSet + $TxStepRate))] \
                   burst-limit=[:tostr (($RxCurSet * 2) . "/" . ($TxCurSet * 2))] \
                   burst-threshold=[:tostr (($RxCurSet - $RxStepRate) . "/" . ($TxCurSet - $TxStepRate))] \
                   burst-time=30/30
      }
    }
}

:set RxCurRate 0
:set TxCurRate 0
:for i from=0 to=9 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 / 10)
:set TxCurRate ($TxCurRate / 10)
}
routeros
回复

使用道具 举报

发表于 2008-12-17 21:13:03 | 显示全部楼层

我的最新改版

#定义变量
#脚本停止开关
:global IsRun true
#循环检测WAN口流量间隔秒数
:global Invs 5;
#循环检测WAN口流量次数
:global ChkTimes 60
#当前下行总流量变量
:global RxCurRate 10
#当前限定的单IP下行带宽
:global RxCurSet 10000000
#单IP最大下行带宽
:global RxMaxRate 20000000
#单IP最小下行带宽
:global RxMinRate 1000000
#总下行流量上阀值
:global RxUpSwRate 60000000
#总下行流量下阀值
:global RxDwSwRate 30000000
#下行步进值
:local RxStepRate 10

#当前上行总流量变量
:global TxCurRate 10
#当前限定的单IP上行带宽
:global TxCurSet 1000000
#单IP最大上行带宽
:global TxMaxRate 1000000
#单IP最小上行带宽
:global TxMinRate 500000
#总上行流量上阀值
:global TxUpSwRate 50000000
#总上行流量下阀值
:global TxDwSwRate 30000000
#上行步进值
:local TxStepRate 10

#合法用户地址列表名称
:global ListName "userlist"
#临时存放地址列表项的变量
:local ul
#临时存放地址的变量
:local tadd
#临时的循环变量
:local i 0
#临时存放总流量的变量
:local CurRate 10
#临时存放旧下行限定
:local OldRxSet 0
#临时存放旧上行限定
:local OldTxSet 0

:while ($IsRun) do={

  :set RxStepRate ($RxCurSet / 3);
  :set TxStepRate ($TxCurSet / 3);
  
  :if (($OldRxSet!=$RxCurSet)||($OldTxSet!=$TxCurSet)) do={
    :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 dst-address=$tadd]] > 0) do={
        /queue simple set $tadd limit-at=[:tostr ($RxCurSet . "/" . $TxCurSet)] \
                   max-limit=[:tostr (($RxCurSet + $RxStepRate) . "/" . ($TxCurSet + $TxStepRate))] \
                   burst-limit=[:tostr (($RxCurSet * 2) . "/" . ($TxCurSet * 2))] \
                   burst-threshold=[:tostr (($RxCurSet - $RxStepRate) . "/" . ($TxCurSet - $TxStepRate))] \
                   burst-time=30/30
      } else={
        /queue simple add name=$tadd dst-address=$tadd \
                   limit-at=[:tostr ($RxCurSet . "/" . $TxCurSet)] \
                   max-limit=[:tostr (($RxCurSet + $RxStepRate) . "/" . ($TxCurSet + $TxStepRate))] \
                   burst-limit=[:tostr (($RxCurSet * 2) . "/" . ($TxCurSet * 2))] \
                   burst-threshold=[:tostr (($RxCurSet - $RxStepRate) . "/" . ($TxCurSet - $TxStepRate))] \
                   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
回复

使用道具 举报

发表于 2008-12-18 21:38:23 | 显示全部楼层
谢谢LZ
也许这里的资料不一定符合每个人的网络环境,但我相信都是发帖者的心血,我们必须去尊敬他们的劳动。
重要的是大家去体会理解里面的启发意义,自己加以修改利用才是对作者的尊重也是对自己负责的态度。也只有这样才会有进步。
本人复制了LZ的第一版回去仔细研究了,发现并不适合自己用,但却从其中得到了不少的启发。在此谢谢LZ为大家所作的努力。 这样的人,才叫无私。 我觉得该顶的文章
routeros
回复

使用道具 举报

发表于 2008-12-19 10:57:38 | 显示全部楼层
我楼上的兄弟,
#在 \ip firewall address-list> 下建立名称为“userlist”的地址列表
这个要怎么做?
NAME              userlist
ADDRESS      0.0.0.0             是这样吗?
还是:
NAME              userlist
ADDRESS      192.168.1.0/24
哪个?////
////////
楼上在兄弟,我不确定是不是我哪里搞错了,我这里你的算法好像有问题/ 我2M ADSL  
#定义变量
#脚本停止开关
:global IsRun true
#循环检测WAN口流量间隔秒数
:global Invs 5;
#循环检测WAN口流量次数
:global ChkTimes 60
#当前下行总流量变量
:global RxCurRate 10
#当前限定的单IP下行带宽
:global RxCurSet 1000000
#单IP最大下行带宽
:global RxMaxRate 1400000
#单IP最小下行带宽
:global RxMinRate 500000
#总下行流量上阀值
:global RxUpSwRate 1600000
#总下行流量下阀值
:global RxDwSwRate 1100000
#下行步进值
:local RxStepRate 10

#当前上行总流量变量
:global TxCurRate 10
#当前限定的单IP上行带宽
:global TxCurSet 400000
#单IP最大上行带宽
:global TxMaxRate 500000
#单IP最小上行带宽
:global TxMinRate 300000
#总上行流量上阀值
:global TxUpSwRate 510000
#总上行流量下阀值
:global TxDwSwRate 300000

这样的设置 有时最大的下载值会到1866666  有时才666666  
  请问是我哪里设错了吗?

[ 本帖最后由 z125454760 于 2008-12-19 15:27 编辑 ]
routeros
回复

使用道具 举报

发表于 2008-12-19 11:46:43 | 显示全部楼层
不是很明白
routeros
回复

使用道具 举报

发表于 2008-12-20 17:16:58 | 显示全部楼层
顶一下留个记号。
routeros
回复

使用道具 举报

发表于 2008-12-21 16:16:08 | 显示全部楼层

回复 111# 的帖子

都不是,你这是一次加一组地址(256个).
这个脚本应该是一个一个加IP,因为每个IP都要限速的,如你有十台电脑上网IP为:192。168。0。1-----192。168。0。10
应使用命令:ip fir add  add list=userlist address=192.168.0.1
ip fir add  add list=userlist address=192.168.0.2
ip fir add  add list=userlist address=192.168.0.3
........
ip fir add  add list=userlist address=192.168.0.10
依次添加每个地址
routeros
回复

使用道具 举报

发表于 2009-1-19 08:51:03 | 显示全部楼层
有人用过ADSL 4M的有效果吗?谢谢。。。
routeros
回复

使用道具 举报

发表于 2009-2-9 21:35:04 | 显示全部楼层
.......   还行
routeros
回复

使用道具 举报

发表于 2009-2-27 12:54:51 | 显示全部楼层
5条adsl效果很好
routeros
回复

使用道具 举报

发表于 2009-10-23 16:38:33 | 显示全部楼层
正需要动态的限速控制啊!不管行不行都谢谢先!
routeros
回复

使用道具 举报

发表于 2009-11-30 07:52:28 | 显示全部楼层
强人。利害哇,顶你。
routeros
回复

使用道具 举报

发表于 2009-11-30 11:33:28 | 显示全部楼层
动态限速思路很好。学习中。
routeros
回复

使用道具 举报

发表于 2009-11-30 11:38:03 | 显示全部楼层
以前用过,还不错
routeros
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-6 07:35 , Processed in 0.064578 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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