Jump to content

Linux+htb срочно


Recommended Posts

Вкратце суть проблемы.

Есть сервер Debian на нем СТГ, есть куча юзеров с анлимами которым режу скорость с помощью HTB.

В последнее время, когда онлайн переваливает за 40 юзеров, появляются проблемы со скоростью у некоторых.

Вместо положенных 128-256кбит у юзеров 20-30кбит...или вообще ничего не открывается.

Через некоторое время опять все стает в норму.

Подскажите куда покопать.

Вот все что касается шейпера

Старт родительского класса

tc qdisc add dev eth0 root handle 1: htb default 999
tc class add dev eth0 parent 1: classid 1:1 htb rate 100Mbit ceil 100Mbit burst 1024k

Далее в скрипте OnConnect старгазера даю юзеру полосу, соответствующую его тарифу

hex=$ID
hexa=$ID
let "hex += 800"
let "hexa += 801"
case $tariff in
	u_32)	speedmin=32kbit;speedmax=128kbit;uploadmin=32kbit;uploadmax=64kbit;;
	u_64)   speedmin=64kbit;speedmax=256kbit;uploadmin=32kbit;uploadmax=64kbit;;
esac
	if [[ $tariff = u_32 || $tariff = u_64 ]]
		then
#исходящий
		tc class add dev eth0 parent 1:1 classid 1:$hexa htb rate $uploadmin ceil $uploadmax burst 40k
		tc filter add dev eth0 protocol ip parent 1: handle $hexa prio 1 fw classid 1:$hexa
#входящий
		tc class add dev eth0 parent 1:1 classid 1:$hex htb rate $speedmin ceil $speedmax burst 100k
		tc filter add dev eth0 protocol ip parent 1: handle 800::$hex prio 3 u32 match ip dst $IP flowid 1:$hex
	fi

Помогите решить задачу.

Link to post
Share on other sites
Вот все что касается шейпера

Старт родительского класса

tc qdisc add dev eth0 root handle 1: htb default 999
tc class add dev eth0 parent 1: classid 1:1 htb rate 100Mbit ceil 100Mbit burst 1024k

 

у вас 100Mbit входящий канал? или это только скорость интерфейса?

Link to post
Share on other sites
у вас 100Mbit входящий канал? или это только скорость интерфейса?

это скорость интерфейса.

Link to post
Share on other sites
это скорость интерфейса.

а, как я понимаю, должна быть скорость входящего канала... при этом суммарная скорость в подклассах не должна превышать скорости корневого класса. или совсем убирайте корневой класс, или что-то думайте еще ;)

Link to post
Share on other sites
а, как я понимаю, должна быть скорость входящего канала... при этом суммарная скорость в подклассах не должна превышать скорости корневого класса. или совсем убирайте корневой класс, или что-то думайте еще ;)

Скорости канала хватает.... 10Мбит

При таком количестве онлайнеров и таких скоростях, думаю должно хватать...

Link to post
Share on other sites
Скорости канала хватает.... 10Мбит

При таком количестве онлайнеров и таких скоростях, думаю должно хватать...

значит в корневом классе должно быть прописано 10Mbit

 

Кстати,

tc class add dev eth0 parent 1:1 classid 1:$hexa htb rate $uploadmin ceil $uploadmax burst 40k

tc filter add dev eth0 protocol ip parent 1: handle $hexa prio 1 fw classid 1:$hexa

 

это вы получается всем ограничиваете исходящую полосу, а не одному юзеру?

Link to post
Share on other sites
значит в корневом классе должно быть прописано 10Mbit

 

Кстати,

tc class add dev eth0 parent 1:1 classid 1:$hexa htb rate $uploadmin ceil $uploadmax burst 40k

tc filter add dev eth0 protocol ip parent 1: handle $hexa prio 1 fw classid 1:$hexa

 

это вы получается всем ограничиваете исходящую полосу, а не одному юзеру?

По поводу 10мбит на интерфейсе, не думаю что это критично.

По исходящему, вполне может быть...Тут я не уверен ни в чем(((

Сейчас сделал таким образом

Старт:
tc qdisc add dev eth0 root handle 1: htb default 999
tc class add dev eth0 parent 1: classid 1:1 htb rate 100Mbit ceil 100Mbit burst 10k
И правила для каждого:
tc class add dev eth0 parent 1:1 classid 1:$hex htb rate $speedmin ceil $speedmax burst 100k
tc filter add dev eth0 protocol ip parent 1: handle 800::$hex prio 2 u32 match ip dst $IP flowid 1:$hex
tc qdisc add dev eth0 parent 1:$hex handle $hex: sfq perturb 10

Исходящий пока отключил. Онлайн 35, вроде еще никто не жаловался.

Если есть спецы по данному вопросу, помогите пожалуйста разрулить тему шейпа.

У меня крышу сносит, когда пытаюсь раздуплить его. ;)

Link to post
Share on other sites
По поводу 10мбит на интерфейсе, не думаю что это критично.

По исходящему, вполне может быть...Тут я не уверен ни в чем(((

а я более чем уверен, потому как сам наступал на такие грабли.

Рекомендую совсем убрать корневой класс.

 

Сейчас сделал таким образом

Старт:
tc qdisc add dev eth0 root handle 1: htb default 999
tc class add dev eth0 parent 1: classid 1:1 htb rate 100Mbit ceil 100Mbit burst 10k
И правила для каждого:
tc class add dev eth0 parent 1:1 classid 1:$hex htb rate $speedmin ceil $speedmax burst 100k
tc filter add dev eth0 protocol ip parent 1: handle 800::$hex prio 2 u32 match ip dst $IP flowid 1:$hex
tc qdisc add dev eth0 parent 1:$hex handle $hex: sfq perturb 10

последняя строка не обязательна. на тему шейпа исходящего трафа (да и вообще, для удобства) рекомендую рыть в сторону IMQ или IFB.

 

Исходящий пока отключил. Онлайн 35, вроде еще никто не жаловался.

Если есть спецы по данному вопросу, помогите пожалуйста разрулить тему шейпа.

У меня крышу сносит, когда пытаюсь раздуплить его. ;)

 

Тут ничего сложного нет. Инфа в инете есть - opennet.ru вам в руки.

Link to post
Share on other sites
а я более чем уверен, потому как сам наступал на такие грабли.

Рекомендую совсем убрать корневой класс.

Тут подумаю насчет корневого класса.

последняя строка не обязательна. на тему шейпа исходящего трафа (да и вообще, для удобства) рекомендую рыть в сторону IMQ или IFB.

Изначально во время тестов все шейпалось отлично (онлайнеров на тесте было 3-5 всего), и внутрь и наружу.

Проблема именно появилась при большом онлайне.

Буду думать.

Тут ничего сложного нет. Инфа в инете есть - opennet.ru вам в руки.

За пендаль на опеннет спасибо конечно, но все, что я делал, вычитывал и оттуда тоже.

Адрес этот знаю хорошо.

Но сюда я написал пытаясь найти помощь, а не редирект на опеннет.

Link to post
Share on other sites
Тут подумаю насчет корневого класса.

 

Изначально во время тестов все шейпалось отлично (онлайнеров на тесте было 3-5 всего), и внутрь и наружу.

Проблема именно появилась при большом онлайне.

проблема не в большом онлайне.

 

Тут подумаю насчет корневого класса.

За пендаль на опеннет спасибо конечно, но все, что я делал, вычитывал и оттуда тоже.

Адрес этот знаю хорошо.

Но сюда я написал пытаясь найти помощь, а не редирект на опеннет.

 

Я тоже искал помощь на форумах, а нашел на опеннете ;)

 

Реально наружу у вас в такой конфигурации все шейпится криво, точнее вообще ничего не шейпится, ибо шейпить надо на исходящем интерфейсе, а у вас eth0 входящий для трафика от юзеров.

Также входящий трафик будет шейпится криво по причине прописанных 100Mbit в корневом классе.

 

И таки ройте в сторону IMQ или IFB.

вот мой шейпер (IFB):

 

#!/bin/sh

prefix=""
psql=/usr/local/pgsql/bin/psql
tc=`which tc`
ifconfig=`which ifconfig`
khix=/usr/local/ipcad/khix/res

cl=2900
dis="htb"

# СБРОС ПРАВИЛ  -----------------------------
$prefix $tc qdisc del dev eth0 root
$prefix $tc qdisc del dev eth0 ingress

$prefix $tc qdisc del dev ifb0 root
$prefix $tc qdisc del dev ifb0 ingress

$prefix $tc qdisc add dev eth0 ingress
$prefix $tc filter add dev eth0 parent ffff: protocol ip u32 match ip dst 172.22.0.0/24 flowid 2:1 action mirred egress redirect dev ifb0

echo --------------
$prefix $tc qdisc add dev eth0 root handle 2: prio
$prefix $tc filter add dev eth0 parent 2: protocol ip u32 match ip src 172.22.0.0/24 flowid 2:2 action mirred egress redirect dev ifb0
$prefix $ifconfig ifb0 up
echo ----------------

######################################################
# ПРИМЕР ограничения входящего трафика
# маркировка IPTABLES недоступна
######################################################

$prefix $tc qdisc add dev ifb0 root handle 1: htb #rate 2900kbit burst 256k


$prefix $tc class add dev ifb0 parent 1: classid 1:3 htb rate 2950kbit burst 512kb

n=5
m=5
k=5
x=0
n1=0
m1=0
n2=0
m2=0

ipaddr=`$psql -t -q -p 5444 -d flow -U postgres -c "select ip from stat where active=true order by ip"`
for b in $ipaddr; do

let "n=n+1"
let "m=m+1"
sp2=0
sp31=0
sdin2=0
sp4=0
#let "k=k+1"
#id=`$psql -t -q -p 5444 -d flow -U postgres -c "select id from stat where ip='$b'"`
pr=`$psql -t -q -p 5444 -d flow -U postgres -c "select priority from stat where ip='$b'"`
sp=`$psql -t -q -p 5444 -d flow -U postgres -c "select trim(both ' ' from text(speed)) from stat where ip='$b'"`
#sp2=`$psql -t -q -p 5444 -d flow -U postgres -c "select trim(both ' ' from text(speed/2)) from stat where ip='$b'"`
devider=`$psql -t -q -p 5444 -d flow -U postgres -c "select trim(both ' ' from text(devider)) from tariff_definitions,stat where (stat.tariff_id=tariff_definitions.tariff_id) and (stat.ip='$b')"`
sp3=`$psql -t -q -p 5444 -d flow -U postgres -c "select trim(both ' ' from text(speed)) from stat where ip='$b'"`
khix_speed=`$psql -t -q -p 5444 -d flow -U postgres -c "select trim(both ' ' from text(khix_speed)) from stat where ip='$b'"`
sdin=`$psql -t -q -p 5444 -d flow -U postgres -c "select trim(both ' ' from text(speedin)) from stat where ip='$b'"`
#speedin2=`$psql -t -q -p 5444 -d flow -U postgres -c "select trim(both ' ' from text(speedin/2)) from stat where ip='$b'"`
group=`$psql -t -q -p 5444 -d flow -U postgres -c "select trim(both ' ' from text(group_id)) from stat,users_groups where (ip='$b') and (stat.id=users_groups.user_id)"`
let "pr=pr-1"
let "sdin2=sdin"
let "sp2=sp/devider"
#let "sp3=sp3*khix_speed"
#let "sp31=sp3*khix_speed"
#акция - khix шара на месяц, до 17 сентября
let "sp3=5000*khix_speed"
#let "sp4=sp3/devider"
#акция - khix шара на месяц, до 17 сентября
#let "sp4=sp3/2"
let "sp4=sp3"
#echo $sp3
#let "sp3=sp"
burst=32
echo "$sp"

# входящий к юзеру
echo $b $sp3\kbit

let "n=n+1"
let "m=m+1"

$prefix $tc class add dev ifb0 parent 1: classid 1:$n htb rate $sp4\kbit ceil $sp3\kbit
$prefix $tc qdisc add dev ifb0 parent 1:$n handle $m: sfq perturb 10
$prefix $tc filter add dev ifb0 parent 1: protocol ip prio 1 u32 match ip dst $b match ip tos 0x10 0xff flowid 1:$n


let "n=n+1"
let "m=m+1"

$prefix $tc class add dev ifb0 parent 1:3 classid 1:$n htb rate $sp2\kbit burst $burst\kb ceil $sp\kbit
$prefix $tc qdisc add dev ifb0 parent 1:$n handle $m: sfq perturb 10
$prefix $tc filter add dev ifb0 parent 1: protocol ip prio $pr u32 match ip dst $b match ip tos 0x08 0xff flowid 1:$n

# исходящий от юзера
let "n=n+1"
let "m=m+1"
$prefix $tc class add dev ifb0 parent 1: classid 1:$n htb rate $sdin2\kbit ceil $sdin2\kbit
$prefix $tc qdisc add dev ifb0 parent 1:$n handle $m: sfq perturb 10
$prefix $tc filter add dev ifb0 parent 1: protocol ip prio $pr u32 match ip src $b flowid 1:$n

done
exit 0;

 

инфа для шейпера берется из базы postgresql.

Трафик из 2-х входящих дырок, делится по предваррительно проставленным на роутере tos. Соответственно из одной из дырок ограничен до 5Mbit (локальная точка обмена трафиком), из другой ограничения другие ;)

 

Скрипт запускается при старте системы и автоматом (другим скриптом) перезапускается при изменениях параметров юзеров или тарифных планов.

devider - коэффициент прибылности тарифа ;)

Link to post
Share on other sites
  • 2 weeks later...

2gall

А использовать HTB принципиально?

Просто я в нем не шарю, но есть рабочий вариант на CBQ.

Если интересно, могу скинуть скрипты.

В моей сети порядка 800 юзеров, из них примерно треть анлимщики.

Внешняя полоса 7 Мбит/с. Режется 60% на 40% в пользу анлимщиков, причем, в случае простоя полосы лимитчиков, анлимщики могут налезать на их полосу (если надо), а наоборот - нет. Максимальная скорость анлима - 256 Кбит/с. Максимальная скорость лимита - 512 Кбит/с. Для офиса выделено 2 Мбит/с.

Эта схема работает уже более полугода. Нареканий нет.

 

Потери в скорости могут быть только по трем причинам:

1. Суммарно не хватает общей полосы, чтобы всем дать оплаченную скорость. Последнее уже не критично, поскольку текущей полосы хватает (когда меньше была, тогда это было актуально, особенно по вечерам и выходным).

2. Бока у прова.

3. Тормозит ресурс-источник.

Link to post
Share on other sites

CBQ отличная вестч http://cybersity.homelinux.net/index.php?o...6&Itemid=45

Если работает NAT нужно маркировать пакеты

Как правила в HTB добавляете?

В папке, в которую указывает HTB_PATH, создаем следующие файлы:

 

eth0:

Код:

 

R2Q=20

DEFAULT=0

 

R2Q - коэффициент, определяющий соотношение точности/скорости работы шейпера (см. Замечание 1).

DEFAULT - идентификатор класса, в который попадают пакеты, если они не попадают под другие правила. Класс с идентификатором 0 существует всегда и пропускает пакеты без всякого шейпинга, то есть на полной скорости.

Этим файлом мы инициализировали шейпер на интерфейсе eth0.

 

eth0-2.root:

Код:

 

RATE=20Mbit

 

Этим файлом мы создали корневой класс траффика на интерфейсе eth0 и ограничили максимальную скорость отдачи через этот класс 20-ю мегабитами.

 

eth0-2:2001:

Код:

 

RATE=100Kbit

CEIL=1Mbit

LEAF=sfq

RULE=192.168.0.1

 

Этим файлом мы создали класс для первого клиента.

RATE - гарантируемая скорость для клиента. Поскольку в нашем случае не нужно гарантировать никакой скорости, но HTB этого требует, исходим из неравенства: 20000Кбит / 150 > RATE.

CEIL - максимальная скорость для клиента при свободном канале.

LEAF - указывает, что класс является одним из листов дерева, то есть в него попадает трафик, удовлетворяющий определенному правилу (RULE). Параметр sfq означает, что мы хотим, чтобы внутри этого класса скорость распределялась равномерно между сессиями.

RULE - правило, задающее, какой трафик будет попадать в этот класс (см. Замечание 1). В данном случае в класс попадает весь трафик, имеющий IP назначения 192.168.0.1.

 

eth0-2:2002:

Код:

 

RATE=100Kbit

CEIL=1Mbit

LEAF=sfq

RULE=192.168.0.2

 

 

.........

 

eth0-2:2150:

Код:

 

RATE=100Kbit

CEIL=1Mbit

LEAF=sfq

RULE=192.168.0.150

 

 

Замечание 1: О назначении и значениях параметров, которые указываются в файлах, и о именах файлов можно узнать из скрипта htb.init - там вверху есть неплохая справка.

Замечание 2: В именах файлов всё, что идет после точки, является комментарием.

Замечание 3: В файлах можно использовать комментарии, начинающиеся с #.

Link to post
Share on other sites
CBQ отличная вестч http://cybersity.homelinux.net/index.php?o...6&Itemid=45

Если работает NAT нужно маркировать пакеты

Как правила в HTB добавляете?

В папке, в которую указывает HTB_PATH, создаем следующие файлы:

 

eth0:

Код:

 

R2Q=20

DEFAULT=0

 

R2Q - коэффициент, определяющий соотношение точности/скорости работы шейпера (см. Замечание 1).

DEFAULT - идентификатор класса, в который попадают пакеты, если они не попадают под другие правила. Класс с идентификатором 0 существует всегда и пропускает пакеты без всякого шейпинга, то есть на полной скорости.

Этим файлом мы инициализировали шейпер на интерфейсе eth0.

 

eth0-2.root:

Код:

 

RATE=20Mbit

 

Этим файлом мы создали корневой класс траффика на интерфейсе eth0 и ограничили максимальную скорость отдачи через этот класс 20-ю мегабитами.

 

eth0-2:2001:

Код:

 

RATE=100Kbit

CEIL=1Mbit

LEAF=sfq

RULE=192.168.0.1

 

Этим файлом мы создали класс для первого клиента.

RATE - гарантируемая скорость для клиента. Поскольку в нашем случае не нужно гарантировать никакой скорости, но HTB этого требует, исходим из неравенства: 20000Кбит / 150 > RATE.

CEIL - максимальная скорость для клиента при свободном канале.

LEAF - указывает, что класс является одним из листов дерева, то есть в него попадает трафик, удовлетворяющий определенному правилу (RULE). Параметр sfq означает, что мы хотим, чтобы внутри этого класса скорость распределялась равномерно между сессиями.

RULE - правило, задающее, какой трафик будет попадать в этот класс (см. Замечание 1). В данном случае в класс попадает весь трафик, имеющий IP назначения 192.168.0.1.

 

eth0-2:2002:

Код:

 

RATE=100Kbit

CEIL=1Mbit

LEAF=sfq

RULE=192.168.0.2

 

 

.........

 

eth0-2:2150:

Код:

 

RATE=100Kbit

CEIL=1Mbit

LEAF=sfq

RULE=192.168.0.150

 

 

Замечание 1: О назначении и значениях параметров, которые указываются в файлах, и о именах файлов можно узнать из скрипта htb.init - там вверху есть неплохая справка.

Замечание 2: В именах файлов всё, что идет после точки, является комментарием.

Замечание 3: В файлах можно использовать комментарии, начинающиеся с #.

Файловую систему правил я использовал пока юзеров было 20-30. При большом количестве народу даже минимальная смена любого из параметров повлечет неимоверный гемор с редактированием всех файлов.

Поэтому использую динамические правила, которые создаются при коннекте юзера и удалябтся при дисконнекте.

Использование HTB не принципиально, но он дает возможность использовать свободную полосу...В CBQ я такого параметра не вычитал.

В данный момент все вроде нормально работает.

Входящий траф режется жестко (пришлось отключить на время использование свободной полосы), исходящий тоже вроде без нареканий порезало через метки iptables.

Но все таки хотелось бы решить задачу с использованием полосы по максимуму.

Link to post
Share on other sites

Поэтому использую динамические правила, которые создаются при коннекте юзера и удалябтся при дисконнекте.

Для VPN или PPPoE соединений? Поделитесь опытом

Link to post
Share on other sites
  • 2 weeks later...

Недавно столкнулся с тойже проблемой, когда количество он-лайн юзеров привышает 30 шт, скорость сразу падает, при чем, чем ниже скорость дана юзеру, тем больше ощютима разница (тоесть если у юзера скорость 128, то она падает до 70-90, а если 64, то падает до 2-3кб/с), правила шейпера создаю по при помощи файловой системы, конфиг выглядит так:

 

для рут конфиг такой

eth1-2.root:

 

RATE=7Mbit

 

для пользователей такой

 

eth1-2:038.25:

 

RATE=256Kbit

CEIL=256Кbit

LEAF=sfq

PRIO=1

RULE=192.168.1.25

 

Подскажите пожалуйса в чем может быть проблема

Link to post
Share on other sites
Недавно столкнулся с тойже проблемой, когда количество он-лайн юзеров привышает 30 шт, скорость сразу падает, при чем, чем ниже скорость дана юзеру, тем больше ощютима разница (тоесть если у юзера скорость 128, то она падает до 70-90, а если 64, то падает до 2-3кб/с), правила шейпера создаю по при помощи файловой системы, конфиг выглядит так:

 

для рут конфиг такой

eth1-2.root:

 

RATE=7Mbit

 

для пользователей такой

 

eth1-2:038.25:

 

RATE=256Kbit

CEIL=256Кbit

LEAF=sfq

PRIO=1

RULE=192.168.1.25

 

Подскажите пожалуйса в чем может быть проблема

256*30 уже больше 7

или канал бери больше или скорость юзерам ставь меньше

Link to post
Share on other sites
256*30 уже больше 7

или канал бери больше или скорость юзерам ставь меньше

такая скорость не у всех, в основном стоит До....

на 30 человек канала должно хватать ( в общем на канал я не грешу), в чом еще может быть причина такого глюка?

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...