Динамический шейпер (ipfw+dummynet+gred)

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
mediamag
лейтенант
Сообщения: 693
Зарегистрирован: 2008-10-02 20:49:21

Динамический шейпер (ipfw+dummynet+gred)

Непрочитанное сообщение mediamag » 2010-11-09 17:43:22

Очень долго (порядка 2 месяцев) я составляю правила для динамических труб. Задача - разделить 4 мегабита на четыре канала (2+1+768+256) и завести юзеров в 4 таблицы, чтобы между юзерами равномерно распределялась отданая ему скорость. В этом плане я все сделал - провел тесты (во всех трубах канал режется равномерно между юзерами в таблице). Вот проблема которую мне не удается решить 2 месяца:
Возьмем одну из четырех труб (неважно какую) например 768 кбит. Поставим на закачку, нечто из локальных ресурсов на трёх компах. Скорость поделится равномерно - тут всё чётко, НО!!..проходит минут 20-30 и начинается: пинги начинают рватся, причем хаотично (3 подряд через 30 пингов или по одному через 10 пингов). Если я остановлю закачку на одном из компов (через 30 минут после старта) - закачка останавливается, а пинг пропаает и примерно 5-6 секунд невозможно выйти с этой машины в инет. Если я возобновлю закачку (неважно через какое время), то на всех качающих компах пинг пропадает на 1 секунду почти синхронно. Если на одном из трёх компов остановить закачку и просто лазить по инету и открывать нетяжёлые старнички (mail.ru vkontakte) пинг еще какое то время будет рватся на этой тачке и вести себя так, как будто комп еще качает. Менял всевозможные параметры, гуглил и читал кучу статей, но так и не поборол эту фигню. Привожу конфиг думинета+очередей+гред и конфиг sysctl.conf:

DUMMYNET

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

# table 1
$fwcmd pipe 1 config bw 2000Kbit/s queue 230kbytes
$fwcmd pipe 2 config bw 256Kbit/s queue 28kbytes

# table 2
$fwcmd pipe 3 config bw 1000Kbit/s queue 115kbytes
$fwcmd pipe 4 config bw 256Kbit/s queue 28kbytes

# table 3
$fwcmd pipe 5 config bw 768Kbit/s queue 87kbytes
$fwcmd pipe 6 config bw 256Kbit/s queue 28kbytes

# table 4
$fwcmd pipe 7 config bw 256Kbit/s queue 28kbytes
$fwcmd pipe 8 config bw 256Kbit/s queue 28kbytes

#---queues for tables-------------------------------------------------------------------------------

# table 1
$fwcmd queue 1 config pipe 1 queue 239kbytes gred 0.002/38kbytes/115kbytes/0.1 mask dst-ip 0xffffffff
$fwcmd queue 2 config pipe 2 queue 28kbytes gred 0.002/4kbytes/14kbytes/0.1 mask src-ip 0xffffffff

# table 2
$fwcmd queue 3 config pipe 3 queue 115kbytes gred 0.002/19kbytes/57kbytes/0.1 mask dst-ip 0xffffffff
$fwcmd queue 4 config pipe 4 queue 28kbytes gred 0.002/4kbytes/14kbytes/0.1 mask src-ip 0xffffffff

# table 3
$fwcmd queue 5 config pipe 5 queue 87kbytes gred 0.002/14kbytes/43kbytes/0.1 mask dst-ip 0xffffffff
$fwcmd queue 6 config pipe 6 queue 28kbytes gred 0.002/4kbytes/14kbytes/0.1 mask src-ip 0xffffffff

# table 4
$fwcmd queue 7 config pipe 7 queue 28kbytes gred 0.002/4kbytes/14kbytes/0.1 mask dst-ip 0xffffffff
$fwcmd queue 8 config pipe 8 queue 28kbytes gred 0.002/4kbytes/14kbytes/0.1 mask src-ip 0xffffffff

#----allow pipe and queue traffic-------------------------

# table 1
$fwcmd add 1 queue 1 ip from any to "table(1)" out
$fwcmd add 2 queue 2 ip from "table(1)" to not me in

# table 2
$fwcmd add 3 queue 3 ip from any to "table(2)" out
$fwcmd add 4 queue 4 ip from "table(2)" to not me in

# table 3
$fwcmd add 5 queue 5 ip from any to "table(3)" out
$fwcmd add 6 queue 6 ip from "table(3)" to not me in

# table 4
$fwcmd add 7 queue 7 ip from any to "table(4)" out
$fwcmd add 8 queue 8 ip from "table(4)" to not me in
SYSCTL.CONF

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

net.inet.ip.fw.one_pass=0

# Превращаем сервер в черную дыру. Так ядро не будет слать ответные пакеты при попытке подключиться к незанятым портам (снижает нагрузку на машину во время DD
net.inet.tcp.blackhole=2
net.inet.udp.blackhole=1

net.inet.tcp.fast_finwait2_recycle=1

net.inet.tcp.always_keepalive=0

net.inet.tcp.keepidle=40000

net.inet.tcp.keepintvl=40000

net.inet.tcp.keepinit=40000

net.inet.tcp.finwait2_timeout=5000

net.inet.tcp.delayed_ack=0

net.inet.tcp.sendspace=16384

# This parametr useable only on http-servers with 8192 and on file servers with 65535
net.inet.tcp.recvspace=8192

net.inet.tcp.syncookies=1

# Уменьшаем время ожидания ответного пакета на запрос SYN-ACK (защита от SYN-флуда):
net.inet.tcp.msl=7500

net.inet.tcp.maxtcptw=40960

net.inet.tcp.nolocaltimewait=1

net.inet.tcp.sack.enable=0

net.inet.tcp.sendbuf_max=16777216

net.inet.tcp.recvbuf_max=16777216

net.inet.tcp.mssdflt=1460

net.inet.tcp.slowstart_flightsize=54

net.inet.tcp.sack.enable=0

net.inet.tcp.drop_synfin=1

net.inet.ip.random_id=1

net.inet.ip.redirect=0

net.inet.ip.portrange.first=1024

net.inet.ip.portrange.last=65535

net.inet.ip.portrange.randomized=0

net.inet.ip.intr_queue_maxlen=1024

net.inet.ip.sourceroute=0

net.inet.ip.accept_sourceroute=0

# Increases TTL (default 64)
net.inet.ip.ttl=128

# Ограничиваем число ответов на ICMP-сообщения 50-ю в секунду (защита от ICMP-флуда)
net.inet.icmp.icmplim=100

net.inet.icmp.maskrepl=0

# не отвечаем на пинг на широковещательный адрес
net.inet.icmp.bmcastecho=0

net.inet.icmp.drop_redirect=1

net.inet.icmp.log_redirect=0

# Увеличиваем максимальное количество подключений к серверу (защита от всех видов DDoS)
kern.ipc.somaxconn=32768

# Recive clusters (on amd64 7.2+ 65k is default)
# For such high value vm.kmem_size must be increased to 3G
kern.ipc.nmbclusters=229376

kern.ipc.maxsockets=204800

kern.ipc.maxsockbuf=262144

kern.maxvnodes=2000000

kern.maxfiles=204800

kern.maxfilesperproc=200000

kern.timecounter.hardware=TSC

net.inet.ip.fw.dyn_buckets=1024

net.inet.ip.fw.dyn_max=65536

net.inet.ip.fw.dyn_ack_lifetime=120

net.inet.ip.fw.dyn_syn_lifetime=10

net.inet.ip.fw.dyn_fin_lifetime=2

net.inet.ip.fw.dyn_short_lifetime=10

net.link.ether.inet.max_age=1200

net.link.ether.inet.max_age=800

#---atacks log to messages-------
sysctl net.inet.tcp.log_in_vain=1

#---optimize dummynet-----------

# размер хэш-таблицы, используемой dummynet для
# хранения очередей. Увеличение этого значение ускоряет работу
# dummynet при большом #количестве очередей, естественно в
# обмен на оперативную память

net.inet.ip.dummynet.hash_size=1024

# режим шейпинга =1, эмуляция медленного соединения =0
net.inet.ip.dummynet.io_fast=1

# логическая переменная. При установке в 1 очереди dummynet удаляются
# через некоторое время после того, как через них перестали "бегать" пакеты.
# В противном случае очереди удаляются только при нехватке памяти для размещения новых.
# Значение по умолчанию - 1. Имеет смысл выставлять в 0, если Ваш сервер обслуживает
# несколько крупных потребителей трафика, постоянно находящихся в режиме on-line - в этом случае
# кратковременное прекращение активности потребителя не должно вызывать удаления
# его очереди, чтобы не тратить времени на ее создание заново при появлении
# потребителя. В случае множества мелких потребителей, подключающихся и
# отключающихся от сети на длительный срок имеет смысл освобождать
# ресурсы, чтобы ускорить работу dummynet за счет меньшей таблицы очередей.

net.inet.ip.dummynet.expire=0

# целочисленная переменная, значение по умолчанию - 16. Количество очередей,
# способных одновременно храниться в одной ячейке хэш-таблицы. При превышении этого
# значение пустые очереди удаляются. (или те, которым меньше всего повезло).
net.inet.ip.dummynet.max_chain_len=32
Очень надеюсь хоть на какую то помощь...я экспеременировал с gred, меняя параметры в трубах, эксперементировал так же с параметрами net.inet.ip.dummynet.hash_size=1024 net.inet.ip.dummynet.io_fast=1 net.inet.ip.dummynet.expire=0 net.inet.ip.dummynet.max_chain_len=32 - результата никакого.

Хостинговая компания 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/

Аватара пользователя
baton4eg
сержант
Сообщения: 274
Зарегистрирован: 2009-10-11 14:36:35
Контактная информация:

Re: Динамический шейпер (ipfw+dummynet+gred)

Непрочитанное сообщение baton4eg » 2010-11-10 8:35:18

на какой версии фряхи делали ?
"Все говорят, что у меня /dev/hands криво и я всё делаю через /dev/ass. А у меня этих файлов вообще нет!" (c)
"Я ем руками, она вилкой и ножом, я бью вилкой и ножом, она руками" (с)


Аватара пользователя
baton4eg
сержант
Сообщения: 274
Зарегистрирован: 2009-10-11 14:36:35
Контактная информация:

Re: Динамический шейпер (ipfw+dummynet+gred)

Непрочитанное сообщение baton4eg » 2010-11-10 9:48:54

игрался на днях с 7.2 и queue, много не объяснимого выскачило, работает не как в теории должно. А есть ли у вас возможность на 8.1-stable протестить данный пример?
"Все говорят, что у меня /dev/hands криво и я всё делаю через /dev/ass. А у меня этих файлов вообще нет!" (c)
"Я ем руками, она вилкой и ножом, я бью вилкой и ножом, она руками" (с)

mediamag
лейтенант
Сообщения: 693
Зарегистрирован: 2008-10-02 20:49:21

Re: Динамический шейпер (ipfw+dummynet+gred)

Непрочитанное сообщение mediamag » 2010-11-10 10:28:57

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

mediamag
лейтенант
Сообщения: 693
Зарегистрирован: 2008-10-02 20:49:21

Re: Динамический шейпер (ipfw+dummynet+gred)

Непрочитанное сообщение mediamag » 2010-11-11 10:17:23

Еще заметил, когда рвется пинг, а потом возобнавляется - скорость прыгает вверх, как будто только начал качать, а потом попускается до нужного значения, учитывая всех качающих

Аватара пользователя
baton4eg
сержант
Сообщения: 274
Зарегистрирован: 2009-10-11 14:36:35
Контактная информация:

Re: Динамический шейпер (ipfw+dummynet+gred)

Непрочитанное сообщение baton4eg » 2010-11-11 12:26:21

завтра свой 7.2 буду до 8.1-stable обновлять и опыты ставить, отпишу о результатах
"Все говорят, что у меня /dev/hands криво и я всё делаю через /dev/ass. А у меня этих файлов вообще нет!" (c)
"Я ем руками, она вилкой и ножом, я бью вилкой и ножом, она руками" (с)

mediamag
лейтенант
Сообщения: 693
Зарегистрирован: 2008-10-02 20:49:21

Re: Динамический шейпер (ipfw+dummynet+gred)

Непрочитанное сообщение mediamag » 2010-11-11 14:43:31

Я понял почему пинг рвется.....Например, качает из группы который отведено 2мбита 3 юзера, скорость у них одинаковая - 2/3 каждому. Заходит четвертый юзер в инет и просто активно ходит по сайтам (например по сайтам интернет магазинов) и вот тогда начинается каша!!!!, скорость у 3 юзеров становится не одинаковая, пинги рвутся даже у того, кто просто открывает странички в инете. Вывод: шейпинг не понимает или не ловит кратковременные всплески скорости. Только когда все из группы равномерно качают, тогда всё гуд. Перелопатил кучу сайтов и мануалов - нигде даже приблизительно нет решения похожей проблемы. Вопрос, как подкрутить шейпер, чтобы он ловил кратковременные всплески?

P.S. не думаю что за это отвечают параметры gred, так как я их перемусолил вдоль и впоперек - улучшений никаких.

Аватара пользователя
baton4eg
сержант
Сообщения: 274
Зарегистрирован: 2009-10-11 14:36:35
Контактная информация:

Re: Динамический шейпер (ipfw+dummynet+gred)

Непрочитанное сообщение baton4eg » 2010-11-11 15:16:20

если есть icq, сбрось личным сообщением, кое что про gred спрошу :)
"Все говорят, что у меня /dev/hands криво и я всё делаю через /dev/ass. А у меня этих файлов вообще нет!" (c)
"Я ем руками, она вилкой и ножом, я бью вилкой и ножом, она руками" (с)

mediamag
лейтенант
Сообщения: 693
Зарегистрирован: 2008-10-02 20:49:21

Re: Динамический шейпер (ipfw+dummynet+gred)

Непрочитанное сообщение mediamag » 2010-11-14 23:05:44

Расскажу про вышеописанный глюк и про то как теоретически можно решить его. Группа ограничена трубой в 2мбита. Начинают качать 3 айпи из группы. Скорость режется чётко (по 1/3 на рыло). Пинги не рвутся. Появляется активность от четвёртого айпи, а именно: открытие сайтов с содержанием фото, или просто тяжелые на контент сайты. Появляется кратковременный всплеск скорости, который система не учитывает и продолжает пытаться резать скорость между тремя юзерами. Только вот скорости в 2мбита то и нет уже. Вот и получаем косяки на всех четырёх айпи в виде неравномерной нарезки скорости и бешеных обрываний пингов. Вывод: система (в данном случае моя) не понимает или не видит кратковременных всплесков активности инета за какой то период времени и не учитывает его в равномерной нарезке скорости. Вопрос: как можно отрегулировать систему шейпинга, чтобы она ловила эти самые кратковременные всплески????????

mediamag
лейтенант
Сообщения: 693
Зарегистрирован: 2008-10-02 20:49:21

Re: Динамический шейпер (ipfw+dummynet+gred)

Непрочитанное сообщение mediamag » 2010-11-23 23:46:31

Сегодня поставил фрю 8,1, правда не на продакшн а так - поиграться (минисетка на 2 тачки). Первые впечатления: ipfw pipe show и ipfw queue show стали показывать только трубы или только очереди, а не как раньше - всё в куче. Если gred поставили в килобайтах, то теперь по ipfw queue show отображается корректно в полных байтах (во фре 7,3 были непонятные значения и даже с минусом). Тестировать под нагрузкой буду позже