Привет, я много экспериментировал с очередями и взрывным трафиком с длительным временем взрыва. Но это не работает! Скрипт написан для v3.2 и вроде бы работает. Я новичок в скриптах для MikroTik, поэтому, возможно, есть лучшие способы написания...
Вкратце, скрипт может ограничить количество трафика в определённый период, замедлять скорость, если пользователь достигает заданного лимита, не требует менеджера пользователей и запоминает трафик после перезагрузки (информация о трафике хранится в имени очереди, может, есть лучший способ... скажите мне, когда). Скорость работы очередей можно регулировать от каждой минуты до неограниченной (нужен планировщик). Регулировка только для определённых очередей (имена очередей должны начинаться с определённой строки, которую вы можете выбрать). Множество параметров для настройки под ваши нужды. Много комментариев, надеюсь вы поняли.. пожалуйста.. тестируйте, говорите о багах, давайте улучшать. Расскажите, что думаете..
#Переменные
:local MaxTrafficVolume
:local TimePeriod
:local TrafficBurst
:local MaxSpeedDown
:local MaxSpeedUp
:local MinSpeedDown
:local MinSpeedUp
:local SlowDownVolume
:local RunTime
:local KeyString
:local TrafficKeyString
#Ваши Настройки ------------------------
#Максимальный объем трафика в МБ за TimePeriod (TotalBytes, учитывается и входящий, и исходящий)
:set MaxTrafficVolume 20480
#время в часах, в течение которого можно загрузить/отправить MaxTrafficVolume (720 = 30 дней)
:local TimePeriod 720
#аналогично Burst в МБ, MaxTrafficVolume + TrafficBurst трафика может произойти в TimePeriod без замедления скорости
:set TrafficBurst 5000
#в МБ, это значение вызывает СЛЕДУЮЩЕЕ замедление скорости до минимальной скорости (значение=0 - нет замедления скорости)
#если X МБ трафика больше, чем MaxTrafficVolume + TrafficBurst в TimePeriod
#если SlowDownVolume=5000 и X=2000, (2000/5000 *100)% = 40%, 60% осталось до достижения SlowDownVolume, Скорость = MaxSpeed * 60%
#если SlowDownVolume=5000 и X=4000, (4000/5000 *100)% = 80%, 20% осталось до достижения SlowDownVolume, Скорость = MaxSpeed * 20%
:set SlowDownVolume 5000
#Скорость в кбит
:set MaxSpeedDown 800
:set MaxSpeedUp 128
#если установить слишком высокое значение MaxTrafficVolume-Limit можно легко превысить
:set MinSpeedDown 32
:set MinSpeedUp 32
#Время работы 15 означает, что каждые 15 минут вычисляются новые значения полосы пропускания (вам нужно настроить планировщик с этим временем!)
:set RunTime 15
#только очереди, имена которых начинаются с этой строки, изменяются этим скриптом
:set KeyString "20GB-"
#после этой строки трафик хранится в имени очереди (эта строка может быть только одна часть имени очереди!)
:set TrafficKeyString "__"
#КОНЕЦ Ваших Настроек ----------------------------
:local NewPoints
:local OldPoints
:local Traffic
:local DecreasePerStep
:local NewSpeed
:local NewSpeedDown
:local NewSpeedUp
:local NewName
:local SpeedMultiplier
:set DecreasePerStep ($MaxTrafficVolume * 1024 / $TimePeriod / 60 * $RunTime);
:set MaxSpeedDown ($MaxSpeedDown * 1000);
:set MaxSpeedUp ($MaxSpeedUp * 1000);
:set MinSpeedDown ($MinSpeedDown * 1000);
:set MinSpeedUp ($MinSpeedUp * 1000);
:foreach i in=[/queue simple find] do={
#если очередь активна, не динамическая, и имя очереди начинается с keystring
:if ((![/queue simple get $i disabled]) && (![/queue simple get $i dynamic]) && ([:find [/queue simple get $i name] $KeyString] = 0) ) do={
#если это очередь с информацией о трафике (точки)
:if ([:find [/queue simple get $i name] $TrafficKeyString] >= 0) do={
#чтение информации о трафике из имени очереди в КБ
:set OldPoints ([:pick [/queue simple get $i name] ([:find [/queue simple get $i name] $TrafficKeyString] + 2) [:len [/queue simple get $i name]]]);
#чтение нового трафика
:set Traffic ([/queue simple get $i total-bytes] / 1024)
#сброс трафика
/queue simple reset-counters [/queue simple get $i name]
:set NewPoints ($OldPoints-$DecreasePerStep+$Traffic);
:if ($NewPoints < 0) do={:set NewPoints 0;}
:set NewSpeedDown $MaxSpeedDown;
:set NewSpeedUp $MaxSpeedUp;
#если слишком много трафика, то уменьшить скорость
:if ($NewPoints > $TrafficBurst * 1024) do={
:if ($SlowDownVolume < 1) do={:set SlowDownVolume 1;}
#немного математики, линейное замедление если трафик больше, чем traffic burst
:set SpeedMultiplier (10000 - ((($NewPoints - ($TrafficBurst * 1024))*10000) / ($SlowDownVolume * 1024)))
:set NewSpeedDown (($SpeedMultiplier * $MaxSpeedDown) / 10000)
:set NewSpeedUp (($SpeedMultiplier * $MaxSpeedUp) / 10000)
#скорость ниже минимальной скорости, то установить минимальную скорость
:if ($NewSpeedDown < $MinSpeedDown) do={:set NewSpeedDown $MinSpeedDown;}
:if ($NewSpeedUp < $MinSpeedUp) do={:set NewSpeedUp $MinSpeedUp;}
}
:set NewSpeed ($NewSpeedUp . "/" . $NewSpeedDown)
:put $NewSpeed;
/queue simple set [/queue simple get $i name] max-limit=$NewSpeed;
#новое имя очереди с информацией о трафике
:set NewName ([:pick [/queue simple get $i name] 0 ([:find [/queue simple get $i name] $TrafficKeyString] + 2)] . (tostr($NewPoints)));
/queue simple set [/queue simple get $i name] name=$NewName
}
}
} Этот пример скрипта работает с очередями с таким именем и там вы можете видеть вычисленные скорости входящей и исходящей связи.
20GB-queuename__0 (поэтому нужно смотреть новые очереди с текущими настройками скрипта, когда вы хотите протестировать)
Вкратце, скрипт может ограничить количество трафика в определённый период, замедлять скорость, если пользователь достигает заданного лимита, не требует менеджера пользователей и запоминает трафик после перезагрузки (информация о трафике хранится в имени очереди, может, есть лучший способ... скажите мне, когда). Скорость работы очередей можно регулировать от каждой минуты до неограниченной (нужен планировщик). Регулировка только для определённых очередей (имена очередей должны начинаться с определённой строки, которую вы можете выбрать). Множество параметров для настройки под ваши нужды. Много комментариев, надеюсь вы поняли.. пожалуйста.. тестируйте, говорите о багах, давайте улучшать. Расскажите, что думаете..
#Переменные
:local MaxTrafficVolume
:local TimePeriod
:local TrafficBurst
:local MaxSpeedDown
:local MaxSpeedUp
:local MinSpeedDown
:local MinSpeedUp
:local SlowDownVolume
:local RunTime
:local KeyString
:local TrafficKeyString
#Ваши Настройки ------------------------
#Максимальный объем трафика в МБ за TimePeriod (TotalBytes, учитывается и входящий, и исходящий)
:set MaxTrafficVolume 20480
#время в часах, в течение которого можно загрузить/отправить MaxTrafficVolume (720 = 30 дней)
:local TimePeriod 720
#аналогично Burst в МБ, MaxTrafficVolume + TrafficBurst трафика может произойти в TimePeriod без замедления скорости
:set TrafficBurst 5000
#в МБ, это значение вызывает СЛЕДУЮЩЕЕ замедление скорости до минимальной скорости (значение=0 - нет замедления скорости)
#если X МБ трафика больше, чем MaxTrafficVolume + TrafficBurst в TimePeriod
#если SlowDownVolume=5000 и X=2000, (2000/5000 *100)% = 40%, 60% осталось до достижения SlowDownVolume, Скорость = MaxSpeed * 60%
#если SlowDownVolume=5000 и X=4000, (4000/5000 *100)% = 80%, 20% осталось до достижения SlowDownVolume, Скорость = MaxSpeed * 20%
:set SlowDownVolume 5000
#Скорость в кбит
:set MaxSpeedDown 800
:set MaxSpeedUp 128
#если установить слишком высокое значение MaxTrafficVolume-Limit можно легко превысить
:set MinSpeedDown 32
:set MinSpeedUp 32
#Время работы 15 означает, что каждые 15 минут вычисляются новые значения полосы пропускания (вам нужно настроить планировщик с этим временем!)
:set RunTime 15
#только очереди, имена которых начинаются с этой строки, изменяются этим скриптом
:set KeyString "20GB-"
#после этой строки трафик хранится в имени очереди (эта строка может быть только одна часть имени очереди!)
:set TrafficKeyString "__"
#КОНЕЦ Ваших Настроек ----------------------------
:local NewPoints
:local OldPoints
:local Traffic
:local DecreasePerStep
:local NewSpeed
:local NewSpeedDown
:local NewSpeedUp
:local NewName
:local SpeedMultiplier
:set DecreasePerStep ($MaxTrafficVolume * 1024 / $TimePeriod / 60 * $RunTime);
:set MaxSpeedDown ($MaxSpeedDown * 1000);
:set MaxSpeedUp ($MaxSpeedUp * 1000);
:set MinSpeedDown ($MinSpeedDown * 1000);
:set MinSpeedUp ($MinSpeedUp * 1000);
:foreach i in=[/queue simple find] do={
#если очередь активна, не динамическая, и имя очереди начинается с keystring
:if ((![/queue simple get $i disabled]) && (![/queue simple get $i dynamic]) && ([:find [/queue simple get $i name] $KeyString] = 0) ) do={
#если это очередь с информацией о трафике (точки)
:if ([:find [/queue simple get $i name] $TrafficKeyString] >= 0) do={
#чтение информации о трафике из имени очереди в КБ
:set OldPoints ([:pick [/queue simple get $i name] ([:find [/queue simple get $i name] $TrafficKeyString] + 2) [:len [/queue simple get $i name]]]);
#чтение нового трафика
:set Traffic ([/queue simple get $i total-bytes] / 1024)
#сброс трафика
/queue simple reset-counters [/queue simple get $i name]
:set NewPoints ($OldPoints-$DecreasePerStep+$Traffic);
:if ($NewPoints < 0) do={:set NewPoints 0;}
:set NewSpeedDown $MaxSpeedDown;
:set NewSpeedUp $MaxSpeedUp;
#если слишком много трафика, то уменьшить скорость
:if ($NewPoints > $TrafficBurst * 1024) do={
:if ($SlowDownVolume < 1) do={:set SlowDownVolume 1;}
#немного математики, линейное замедление если трафик больше, чем traffic burst
:set SpeedMultiplier (10000 - ((($NewPoints - ($TrafficBurst * 1024))*10000) / ($SlowDownVolume * 1024)))
:set NewSpeedDown (($SpeedMultiplier * $MaxSpeedDown) / 10000)
:set NewSpeedUp (($SpeedMultiplier * $MaxSpeedUp) / 10000)
#скорость ниже минимальной скорости, то установить минимальную скорость
:if ($NewSpeedDown < $MinSpeedDown) do={:set NewSpeedDown $MinSpeedDown;}
:if ($NewSpeedUp < $MinSpeedUp) do={:set NewSpeedUp $MinSpeedUp;}
}
:set NewSpeed ($NewSpeedUp . "/" . $NewSpeedDown)
:put $NewSpeed;
/queue simple set [/queue simple get $i name] max-limit=$NewSpeed;
#новое имя очереди с информацией о трафике
:set NewName ([:pick [/queue simple get $i name] 0 ([:find [/queue simple get $i name] $TrafficKeyString] + 2)] . (tostr($NewPoints)));
/queue simple set [/queue simple get $i name] name=$NewName
}
}
} Этот пример скрипта работает с очередями с таким именем и там вы можете видеть вычисленные скорости входящей и исходящей связи.
20GB-queuename__0 (поэтому нужно смотреть новые очереди с текущими настройками скрипта, когда вы хотите протестировать)