FREEBSD 7.0 dummynet gred - смена скорости

Проблемы установки, настройки и работы Правильной Операционной Системы

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
luckydevil13
рядовой
Сообщения: 21
Зарегистрирован: 2008-02-21 20:45:09

FREEBSD 7.0 dummynet gred - смена скорости

Непрочитанное сообщение luckydevil13 » 2008-05-09 16:42:06

Во первых хочу поделится хорошей схемой, много времени потратил на эксперементы... наилучший вариант ниже

канал 320/320 Kbit/s - 4 человека, 1 качалка (mldonkey) ... Вопросы ниже )

Код: Выделить всё

net.inet.ip.fw.one_pass: 0
net.inet.ip.dummynet.io_fast=1

Код: Выделить всё

rc.firewall

#!/bin/sh -
f='/sbin/ipfw'
${f} -f flush
${f} -f queue flush
${f} -f pipe flush
${f} -f table 1 flush
${f} -f table 2 flush
${f} -f table 3 flush

vpnnet="192.168.200.0/29" 
ipinet="212.98.XXX.XXX"
if_inet="ng0"

# only our net to inet
${f} add allow all from ${ipinet} to any out via ng0
${f} add deny all from not ${vpnnet} to any out via ng0


# Две трубы, одна на аплоад, другая на доунлоад
# Для трубы внутренняя очередь - может быть в слотах или в байтах. Слоты в байты переводим - слот x MTU.
# для нашего случая - время заполнения очереди в трубе - ( 24Kbytes * 8 ) /320Kbit/s = 0.6 sec
 
${f} pipe 1 config bw 320Kbit/s queue 24Kbytes
${f} pipe 11 config bw 320Kbit/s queue 24Kbytes

# очереди с приоритетами. Тут свои очереди -  30x1500x8 / max 320 <= 1,2 sec
# VIP
${f} queue 2 config pipe 1 weight 80 queue 30 mask dst-ip 0xffffffff gred 0.002/10/30/0.1
${f} queue 21 config pipe 11 weight 80 queue 30 mask src-ip 0xffffffff gred 0.002/10/30/0.1
# users
${f} queue 3 config pipe 1 weight 50 queue 30 mask dst-ip 0xffffffff gred 0.002/10/30/0.1
${f} queue 31 config pipe 11 weight 50 queue 30 mask src-ip 0xffffffff gred 0.002/10/30/0.1
# mldonkey
${f} queue 4 config pipe 1 weight 1 queue 30 mask dst-ip 0xffffffff gred 0.002/10/30/0.1
${f} queue 41 config pipe 11 weight 1 queue 30 mask src-ip 0xffffffff gred 0.002/10/30/0.1

# shaper out
        ${f} add queue 21 ip from "table(1)" to any out via ${if_inet}
        ${f} add queue 31 ip from "table(2)" to any out via ${if_inet}
        ${f} add queue 41 ip from "table(3)" to any out via ${if_inet} uid downloader
# NAT
        ${f} add divert 8778 ip from ${vpnnet} to any out via ${if_inet}
        ${f} add divert 8778 ip from any to ${ipinet} in via ${if_inet}
# shaper in
        ${f} add queue 2 ip from any to "table(1)" in via ${if_inet}
        ${f} add queue 3 ip from any to "table(2)" in via ${if_inet}
        ${f} add queue 4 ip from any to "table(3)" in via ${if_inet} uid downloader

# load tables
        /etc/fw/addtable.sh

Код: Выделить всё

01100  16164   8671027 allow ip from 212.98.175.79 to any out via ng0
01200    240     11652 deny ip from not 192.168.200.0/29 to any out via ng0
01300     80      8016 queue 21logamount 1 ip from table(1) to any out via ng0
01400      24     2045 queue 31 logamount 1 ip from table(2) to any out via ng0
01500      0         0 queue 41 logamount 1 ip from table(3) to any out via ng0 uid downloader
01600     80      8016 divert 8778 ip from 192.168.200.0/29 to any out via ng0
01700  18004  13494255 divert 8778 ip from any to 212.98.XXX.YYY in via ng0
01800     83     56092 queue 2 ip from any to table(1) in via ng0
01900      23      2435 queue 3 ip from any to table(2) in via ng0
02000  17563  13399736 queue 4 ip from any to table(3) in via ng0 uid downloader
65535 704154 329312864 allow ip from any to any
Все отлично работает... Но вот решили увеличить скорость до 1024 .... и началось )

1) первым дело сделали трубы по 1024 и очередь к ним по 50Kb
2) а вот что делать с gred 0.002/10/30/0.1 и очередью... пробывал менять на queue 90 и гред 0.002/30/90/0.1 - реально работает медленнее чем 320... downloader перетягивает канал на себя... :(

вопросы:
1) почему в правиле 1500 ноль по счетчику? неужели оно не обрабатывается?
2) какие параметры лучше выставит для 1024/1024
3) как можно ограничить количество исходящиз tcp ссесий от конкретного ip пробывал пере shaper out прописывать правило

Код: Выделить всё

allow ip from 192.168.200.1/32 to any  limit  src-addr 10
но оно похоже не работает (может потому что по умолчанию обрабатывается и последнее правило - allow all?)
кроме того когда его вводишь вообще не работает инет у 200.1

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

void*
ефрейтор
Сообщения: 52
Зарегистрирован: 2008-01-03 13:25:13
Контактная информация:

Re: FREEBSD 7.0 dummynet gred - смена скорости

Непрочитанное сообщение void* » 2008-05-09 17:44:03

немного офф но всеже, по поводу

Код: Выделить всё

queue 41 logamount 1 ip from table(3) to any out via ng0 uid downloader
В семерке правила с uid приводят к глухому повисанию системы через случайный период времени. В шестерке был сисконтрол debug.mpsafenet который нужно было устанавливать в 1, иначе - зависон. В семерке его убрали. Правда с net.inet.ip.dummynet.io_fast=1 я _НЕ_ пробовал, возможно лечит...
Подробности тут http://forum.lissyara.su/viewtopic.php?f=8&t=7713

void*
ефрейтор
Сообщения: 52
Зарегистрирован: 2008-01-03 13:25:13
Контактная информация:

Re: FREEBSD 7.0 dummynet gred - смена скорости

Непрочитанное сообщение void* » 2008-05-09 18:02:10

Посмотрел... У меня вообще весело:

Код: Выделить всё

root:[/root]# sysctl net.inet.ip.dummynet.io_fast
sysctl: unknown oid 'net.inet.ip.dummynet.io_fast'
root:[/root]# sysctl -dao | grep io_fast
root:[/root]#
как сие понимать... :?

Вы патчили dummynet? Если можна поподробнее, тоже так хочу! :D

luckydevil13
рядовой
Сообщения: 21
Зарегистрирован: 2008-02-21 20:45:09

Re: FREEBSD 7.0 dummynet gred - смена скорости

Непрочитанное сообщение luckydevil13 » 2008-05-09 20:42:24

uid добавил относительно недавно, перед этим обновился до CURRENT

глухие зависоны тоже были... относительно их следующие мысли
1) список правил с привязкой к uid надо запускать до mldonkey
2) при перезапуске качалки, и перезапуска правил (flush) виснет

если выполнять предыдущие пункты +
net.inet.ip.intr_queue_maxlen=512
5 дней полет нормальный

так как насчет моих вопросов в первом посте - есть мысли?

void*
ефрейтор
Сообщения: 52
Зарегистрирован: 2008-01-03 13:25:13
Контактная информация:

Re: FREEBSD 7.0 dummynet gred - смена скорости

Непрочитанное сообщение void* » 2008-05-09 23:34:08

Изложу свои мысли...
Очередь 50кб это ~34 пакета - вроде нормально, можно чуть увеличить, у меня 50 пакетов

GRED штука очень таинственная, описание первого параметра мутное и методику его оптимального выбора я не встречал нигде. Официальное описание RED рекомендует ставить его порядка тысячных, т.е. у вас вроде все ок.
Последующие параметры описаны хорошо. Возьмем ваш случай 0.002/10/30/0.1 В алгоритме GRED:
при длинне очережи менее 10 пакетов - пакеты не теряются
при длинне очереди 10 - 30 пакетов - пакеты теряются с вероятностью, растущей линейно от 0 до 0.1
при длинне очереди 30 - 60 пакетов - пакеты теряются с вероятностью, растущей линейно от 0.1 до 1
Из этого можна зделать вывод, что длинна очереди должна быть вдвое больше предпоследнего параметра в GRED.
Я экспериментировал, уменьшая длинну ниже 2*30 - существенной разници не заметил честно говоря, но рекомендуют следовать этим правилам.

Насчет правила 1500 - покажите что у вас в табличке. И еще момент о UID. Если качалка запускается от одного пользователя а потом делает setuid() то НЕ ВЕСЬ ее трафик попадет в такое правило. Запускать нужно СРАЗУ от имени пользователя downloader, в стартовом скрипте я это делал через su

в остальном надо разбиратся, чесно говоря список правил для меня выглядит немного странновато...
В одну очередь вы пихаете траф от всех клиентов из таблици, при этом канал между ними не делится! Нужно каждого юзера пихать в отдельную очередь со своими приоритетами, а все эти очереди потом в один pipe, тоесть дописать в очередях чегото типа mask src-addr 0xffffffff и т.п.

luckydevil13
рядовой
Сообщения: 21
Зарегистрирован: 2008-02-21 20:45:09

Re: FREEBSD 7.0 dummynet gred - смена скорости

Непрочитанное сообщение luckydevil13 » 2008-05-10 11:21:35

Из этого можна сделать вывод, что длинна очереди должна быть вдвое больше предпоследнего параметра в GRED.
Я экспериментировал, уменьшая длинну ниже 2*30 - существенной разницы не заметил честно говоря, но рекомендуют следовать этим правилам.
в рабочей конфигурации queue 30 gred 0.002/10/30/0.1 - как из него видно длинная очереди 30 - и разрешаемый процент потерь для очереди 30 до 10 процентов - это видно из Изображение

возможно в процессе ваших экспериментов канал был не настолько загружен что бы показать потери... если ставить очередь как рекомендуете вы, получаем неслабые потери на загруженных каналах

поэтому похоже стоит оставлять это параметр равным th_max

Погуглил еще, параметры 0.002 и 0.1 лучше не трогать - они наилучшие
th_mix(5-10) = th_max/(2-3) где-то так

осталось определится с параметром очереди - 30 слотов это приблизительно 45 Kb - то есть пока не наберется это количество данные, они не отдаются (не принимаются) пользователем? если так то 45 kb на 320 канале - 1,2 секунды. вроде ок.

интересная штука получается - судя по всему для канала 1024 логично ставить queue 100 gred 0.002/30/100/0.1 - но результат становиться хуже, толи из-за провайдера, то-ли из-за того что веб сервера не хотят отдавать одним куском данные в 150 kb, несколько быстрых запросов по 30 - явно лучше работают )

оставил как было раньше.

остались первый и третий вопросы )

server# ipfw table 1 list
192.168.200.4/32 0
server# ipfw table 2 list
192.168.200.1/32 0
192.168.200.2/32 0
192.168.200.3/32 0
192.168.200.6/32 0
server# ipfw table 3 list
212.98.XXX.YYY/32 0

то есть в третьей табличке мой внешний ip - почему он не считается???

я делал не setuid, mlnet_user="downloader".
в остальном надо разбиратся, чесно говоря список правил для меня выглядит немного странновато...
В одну очередь вы пихаете траф от всех клиентов из таблици, при этом канал между ними не делится! Нужно каждого юзера пихать в отдельную очередь со своими приоритетами, а все эти очереди потом в один pipe, тоесть дописать в очередях чегото типа mask src-addr 0xffffffff и т.п.
как раз делится, в одну трубу мы пихаем несколько очередей с разными приоритетами, во второй очереди все юзеры равноправны то есть этот тайбл аналог прописывания каждого юзера. то есть как описано у вас, но проще.


ЗЫ:

This means that if you have a configuration such as

ipfw add pipe 4 ip from 127.0.0.1 to 127.0.0.1
ipfw pipe 4 config delay 100ms

and do a simple ping 127.0.0.1 you will see a delay of approximately 400ms. In fact the ICMP request goes through the pipe twice (once down, once up), and the same for the ICMP reply. For the same reason, if you also have bandwidth or queue limitations, remember that the queue sees the traffic multiple times.

void*
ефрейтор
Сообщения: 52
Зарегистрирован: 2008-01-03 13:25:13
Контактная информация:

Re: FREEBSD 7.0 dummynet gred - смена скорости

Непрочитанное сообщение void* » 2008-05-10 12:19:06

Насчер GRED я имел ввиду. что длинна очереди задается в нескольких местах:

pipe 1 config bw 320Kbit/s queue 24Kbytes
queue 2 config pipe 1 weight 80 queue 30 mask dst-ip 0xffffffff gred 0.002/10/30/0.1

по идее первое и второе число должно быть 2*max_th так как в вашем GRED длинна очереди может быть до 60 пакетов, и если например второй параметр 30, то очередь начинает отбрасывать пакеты ранюше GREDа = GRED не работает. Но по непонятным мен причинам ето не так. Если очередь уменьшать - понятно что на больших нагрузках начнутся потери, нужно определить оптимальную длинну, я говорил лиш о отношении этих параметров.
ЗЫЖ канал загружен был полнлстью, у меня аналогичная схемма - mldonkey на сервере + несколько юзеров.

Насчет очередей, виноват, не заметил что mask src-ip/dst-ip 0xffffffff у вас там уже есть :)

Насчет setuid
у меня mldonkey не из портов, потому не знаю что именно делает mlnet_user="downloader" в rc.conf.
Есть 2 метода стартануть mldonkey:
1) стартануть из под рута, а в конфиге указать работать от юзера downloader
2) сразу запустить от юзера downloader, неважно что в конфиге
вот в первом случае не все пакеты попадают в правило з UID

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35439
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: FREEBSD 7.0 dummynet gred - смена скорости

Непрочитанное сообщение Alex Keda » 2008-05-21 19:35:28

статью?
график - эт хорошо, на сайте их вообще нет =)))
Убей их всех! Бог потом рассортирует...

luckydevil13
рядовой
Сообщения: 21
Зарегистрирован: 2008-02-21 20:45:09

Re: FREEBSD 7.0 dummynet gred - смена скорости

Непрочитанное сообщение luckydevil13 » 2008-05-22 10:32:40

:P было бы неплохо )

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35439
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: FREEBSD 7.0 dummynet gred - смена скорости

Непрочитанное сообщение Alex Keda » 2008-05-22 10:38:05

luckydevil13 писал(а)::P было бы неплохо )
ну так пиши =))
Убей их всех! Бог потом рассортирует...

void*
ефрейтор
Сообщения: 52
Зарегистрирован: 2008-01-03 13:25:13
Контактная информация:

Re: FREEBSD 7.0 dummynet gred - смена скорости

Непрочитанное сообщение void* » 2008-07-31 17:01:51

luckydevil13 писал(а):uid добавил относительно недавно, перед этим обновился до CURRENT
глухие зависоны тоже были... относительно их следующие мысли
1) список правил с привязкой к uid надо запускать до mldonkey
2) при перезапуске качалки, и перезапуска правил (flush) виснет
если выполнять предыдущие пункты +
net.inet.ip.intr_queue_maxlen=512
5 дней полет нормальный
так как насчет моих вопросов в первом посте - есть мысли?
Древний топик, но всеже может кому пригодится. На днях попробовал net.inet.ip.intr_queue_maxlen=512 всеравно виснет, может дольше держится но потом виснет. Ходят слухи попробовать упрать PREEMPTION из ведра, как попробую - отпишусь.