墨迹 发表于 2008-11-28 15:13:07

:victory:

ybb575 发表于 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= do={
      :set tadd
      :if ([:len ] > 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)
}

ybb575 发表于 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= do={
      :set tadd
      :if ([:len ] > 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;}
}

ddr6328507 发表于 2008-12-18 21:38:23

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

z125454760 发表于 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 编辑 ]

yqszhl 发表于 2008-12-19 11:46:43

不是很明白

aidelphi 发表于 2008-12-20 17:16:58

顶一下留个记号。

ybb575 发表于 2008-12-21 16:16:08

回复 111# 的帖子

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

hjfgt 发表于 2009-1-19 08:51:03

有人用过ADSL 4M的有效果吗?谢谢。。。

last1 发表于 2009-2-9 21:35:04

.......   还行

WGHBOY 发表于 2009-2-27 12:54:51

5条adsl效果很好

fang1796 发表于 2009-10-23 16:38:33

正需要动态的限速控制啊!不管行不行都谢谢先!

qbs315 发表于 2009-11-30 07:52:28

强人。利害哇,顶你。

tournet 发表于 2009-11-30 11:33:28

动态限速思路很好。学习中。

WGHBOY 发表于 2009-11-30 11:38:03

以前用过,还不错
页: 1 2 3 4 5 6 7 [8] 9
查看完整版本: ROS用流量监控动态控制限速点(新方法)