classic Posted March 30, 2010 Posted March 30, 2010 (edited) Добрый день всем. Суть проблемы - при увеличении количества проходящих через маршрутизатор пакетов (до 35K pps, 120 Mbps и на входе и на выходе) имею ~ 500 input errors/sec на внешнем интерфейсе, клиенты немного начинают жаловаться. Ошибки: Пакеты: Трафик: Недавно прочитал статью на Nag.ru про NAT,Shaping,Netflow на больших сетях и посему хотел бы получить вашего совета, если кто сталкивался, помойму тема схожая. Схема Есть сервер HP Proliant DL360 G4, с установленной FreeBSD 8.0 RELEASE amd64, в сервере 2 встроенных интерфейса (bge, Broadcom BCM5704, NC7782), ядро пересобрано с: + cpu HAMMER - options INET6 + options SMP + options IPFIREWALL + options IPFIREWALL_VERBOSE + options IPFIREWALL_FORWARD + options IPFIREWALL_DEFAULT_TO_ACCEPT + options IPFIREWALL_NAT + options LIBALIAS + options TCPDEBUG + options IPSTEALTH + options DEVICE_POLLING + options HZ=2000 + options DUMMYNET - ненужный мне FireWire - ненужный мне USB - ненужные мне сетевки В /etc/sysctl.conf: net.inet.ip.forwarding=1 net.inet.ip.fastforwarding=1 net.inet.ip.fw.one_pass=1 net.inet.ip.dummynet.io_fast=1 net.inet.ip.dummynet.expire=0 net.inet.ip.dummynet.hash_size=16384 На bge0 с рядом стоящей Cisco ME3400 подана гигабитная медная шворка, порт на коммутаторе в режиме access, наливаем внешний канал. На bge1 с той же Cisco ME3400 подана вторая гигабитная медная шворка, порт в режиме trunk, принимаем VLAN'ы абонентов (сейчас 305 шт). Работаем пока по схеме VLAN на абонента, /30 на абонента - иногда статический внешний IP иногда серый IP. Не оптимально, но пока хватает, ждем Juniper ERX. NAT делаем через ipfw nat: ${ipfw} add 100 nat 123 ip from 192.168.0.0/16 to any out xmit bge0 ${ipfw} add 110 nat 123 ip frmo any to <A.B.C.D> in recv bge0 ${ipfw} nat 123 config ip <A.B.C.D> log same_ports , где A.B.C.D - внешний IP маршрутизатора на bge0. Ограничение скорости (симметричные тарифы 1M / 2M / 5M / 10M) делаем через dummynet 4 строчками на каждого абонента вида: ${ipfw} add 2000 pipe 10 ip from any to any in recv vlan150 ${ipfw} add 2001 pipe 11 ip from any to any out xmit vlan150 ${ipfw} pipe 10 config bw 2Mbit/s ${ipfw} pipe 11 config bw 2Mbit/s , где vlan150 - очередной абонентский vlan Хотел бы узнать, кто сколько в схожей ситуации по оборудованию и ОС смог выжать Unicast Kpackets/sec и Mbps? Если есть какие-либо существенные советы по оптимизации - тоже буду признателен (грешу на встроенные сетевки Broadcom, может Intel ??) Вопрос возник по причине намечающегося увеличения нагрузки (+200 мбит с другого L2 сегмента), в идеале хотелось бы оценить где предел моей текущей конфигурации. Edited March 30, 2010 by classic Вставить ник Quote
bsdelnik Posted March 30, 2010 Posted March 30, 2010 (edited) еще нужен вывод top -SHP в момент дропов, ipfw show как минимум, сколько и каких процов в системе. ps. 300 мегабит и 60 килопаетов в одну сторону тачка с роутингом, шейпингом, натом и нетфлоу должна делать Edited March 30, 2010 by bsdelnik Вставить ник Quote
Lucky SB Posted March 30, 2010 Posted March 30, 2010 Хорошая у вас железка. С поллингом, более, чем 1200 строчками в фаерволле и натом она умудряется выдавать более 20кппс. За что же вы ее так жестоко ? Начните с оптимизации фаерволла - или раскладывается в пайпы через таблицы, или вообще на ng_car поменяйте. Вставить ник Quote
XeonVs Posted March 30, 2010 Posted March 30, 2010 в loader.conf можно добавить hw.bge.rxd=512 hw.bge.rx_coal_desc=64 hw.bge.tx_coal_desc=128 hw.bge.allow_asf=1 hw.bge.rx_int_delay=100 hw.bge.tx_int_delay=500 исспользовать пулинг смысла на 8.0 никакого, лучше с net.isr потоками играться грамотно. Вставить ник Quote
bsdelnik Posted March 30, 2010 Posted March 30, 2010 в loader.conf можно добавитьhw.bge.rxd=512 hw.bge.rx_coal_desc=64 hw.bge.tx_coal_desc=128 hw.bge.allow_asf=1 hw.bge.rx_int_delay=100 hw.bge.tx_int_delay=500 Только если дрова пропатчить... исспользовать пулинг смысла на 8.0 никакого, лучше с net.isr потоками играться грамотно.С этим согласен, это в данном случае обязательно. Вставить ник Quote
XeonVs Posted March 30, 2010 Posted March 30, 2010 (edited) в loader.conf можно добавитьhw.bge.rxd=512 hw.bge.rx_coal_desc=64 hw.bge.tx_coal_desc=128 hw.bge.allow_asf=1 hw.bge.rx_int_delay=100 hw.bge.tx_int_delay=500 Только если дрова пропатчить... Хм! в 8рке разве крутилки отломали? Edited March 30, 2010 by XeonVs Вставить ник Quote
bsdelnik Posted March 30, 2010 Posted March 30, 2010 Хм! в 8рке разве крутилки отломали? Их никогда и не было в ядре. Вставить ник Quote
XeonVs Posted March 30, 2010 Posted March 30, 2010 (edited) Хм! в 8рке разве крутилки отломали?Их никогда и не было в ядре. Ага, ваша правда. Память подводит, да и продакшн никто не трогает лишний раз. По быстрому переделал патчик под 8.0\9.0 может и пригодится кому. --- if_bge.c.org 2010-03-30 21:08:20.000000000 +0400 +++ if_bge.c 2010-03-30 21:10:07.000000000 +0400 @@ -483,8 +483,18 @@ DRIVER_MODULE(miibus, bge, miibus_driver, miibus_devclass, 0, 0); static int bge_allow_asf = 1; +static int bge_rxd = BGE_SSLOTS; +static int bge_rx_coal_ticks = 150; +static int bge_tx_coal_ticks = 150; +static int bge_rx_max_coal_bds = 10; +static int bge_tx_max_coal_bds = 10; TUNABLE_INT("hw.bge.allow_asf", &bge_allow_asf); +TUNABLE_INT("hw.bge.rxd", &bge_rxd); +TUNABLE_INT("hw.bge.rx_int_delay", &bge_rx_coal_ticks); +TUNABLE_INT("hw.bge.tx_int_delay", &bge_tx_coal_ticks); +TUNABLE_INT("hw.bge.rx_coal_desc", &bge_rx_max_coal_bds); +TUNABLE_INT("hw.bge.tx_coal_desc", &bge_tx_max_coal_bds); SYSCTL_NODE(_hw, OID_AUTO, bge, CTLFLAG_RD, 0, "BGE driver parameters"); SYSCTL_INT(_hw_bge, OID_AUTO, allow_asf, CTLFLAG_RD, &bge_allow_asf, 0, @@ -1027,7 +1037,7 @@ bzero(sc->bge_ldata.bge_rx_std_ring, BGE_STD_RX_RING_SZ); sc->bge_std = 0; - for (i = 0; i < BGE_SSLOTS; i++) { + for (i = 0; i < bge_rxd; i++) { if ((error = bge_newbuf_std(sc, i)) != 0) return (error); BGE_INC(sc->bge_std, BGE_STD_RX_RING_CNT); @@ -2787,10 +2797,10 @@ /* Set default tuneable values. */ sc->bge_stat_ticks = BGE_TICKS_PER_SEC; - sc->bge_rx_coal_ticks = 150; - sc->bge_tx_coal_ticks = 150; - sc->bge_rx_max_coal_bds = 10; - sc->bge_tx_max_coal_bds = 10; + sc->bge_rx_coal_ticks = bge_rx_coal_ticks; + sc->bge_tx_coal_ticks = bge_tx_coal_ticks; + sc->bge_rx_max_coal_bds = bge_rx_max_coal_bds; + sc->bge_tx_max_coal_bds = bge_tx_max_coal_bds; /* Set up ifnet structure */ ifp = sc->bge_ifp = if_alloc(IFT_ETHER); Edited March 30, 2010 by XeonVs Вставить ник Quote
classic Posted March 30, 2010 Author Posted March 30, 2010 По поводу сколько и каких процессоров в системе: 2 x Intel Xeon CPU 3.8 GHz одноядерных Сделал, как и советовали, отключил поллинг, включил net.isr.direct (из тех соображений что ядер 2 шт <= сетевок 2 шт): ifconfig bge0 -polling ifconfig bge1 -polling sysctl net.isr.direct=1 "Играться грамотно" с net.isr потоками не получилось, т.к. net.isr.maxthreads и net.isr.numthreads - readonly. После этих действий получил на выходе забавную картину в top -SHP (ранее такого небыло): load averages: 0.00, 0.01, 0.10 99 processes: 4 running, 75 sleeping, 20 waiting CPU 0: 0.0% user, 0.0% nice, 0.0% system, 41.2% interrupt, 58.8% idle CPU 1: 0.0% user, 0.0% nice, 0.0% system, 12.1% interrupt, 87.9% idle Mem: 25M Active, 55M Inact, 286M Wired, 320K Cache, 316M Buf, 2603M Free Swap: 4495M Total, 4495M Free PID USERNAME PRI NICE SIZE RES STATE C TIME WCPU COMMAND 11 root 171 ki31 0K 32K RUN 1 476:47 83.06% {idle: cpu1} 11 root 171 ki31 0K 32K CPU0 0 409:41 63.38% {idle: cpu0} 12 root -68 - 0K 336K CPU0 0 11:26 20.02% {irq26: bge1} 12 root -68 - 0K 336K WAIT 0 7:29 13.09% {irq25: bge0} 26085 root 48 0 26648K 7640K select 0 19:03 3.56% snmpd 12 root -44 - 0K 336K WAIT 1 198:01 1.90% {swi1: netisr 0} 0 root -68 0 0K 112K - 1 29:53 0.00% {dummynet} 12 root -32 - 0K 336K WAIT 1 2:53 0.00% {swi4: clock} Тобиж, насколько я понимаю, обработка прерываний легла на плечи CPU. Это дало отличный результат, т.к теперь при обработке 210 Mbps bge0 <-> bge1 имею 90 Kpackets / sec и 1.5 input errors / sec. Пробовал патчить /usr/src/sys/dev/bge/if_bge.c как вы и посоветовали, номера строк у меня в оригинальном файле не совпадают.... Вручную нашел и заменил строки, пересобрал ядро, появились "крутилки" hw.bge, пока полёт нормальный. Но меня беспокоит в этой связи вопрос - у меня 8.0-RELEASE, есть ли смысл обновиться до STABLE, возможно я получу исправление ошибок в if_bge ? В целом меня ситуация текущая уже куда более устраивает. По поводу ipfw - там 560 правил на текущий момент, сначала NAT, далее как я уже и писал в 1 посте - на каждого клиента подобные конструкции ну и pipe's: 01090 6055544 1836552801 pipe 19 ip from any to any in recv vlan76 01091 10299079 11122224438 pipe 20 ip from any to any out xmit vlan76 Я бы и рад создать отдельно pipe на каждый тариф (1M/2M/5M/10M), а потом создать table для маппинга абонента к определнному pipe согласно тарифного плана, но беда в том что во всей документации по теме ipfw tablearg примеры приводяться для ipfw table <IP_подсеть> <Номер_PIPE>, в то время как у меня VLAN per user и соответственно мне куда лучше сопоставить абонентский VLAN с pipe. Можно конечно сделать такую таблицу из IP подсетей на каждом VLAN и все же перейти на tablearg, но даст ли это увеличение производительности? Может все же можно увязать tablearg к абонентскому vlan без IP подсетей ? Да и dummynet в top -SHP практически не создает нагрузку, насколько я понимаю. P.S. Забегая наперед, нашел много нареканий на Broadcom'овские встроенные сетевки. Сам их тестил iperf без NAT и абонентской нагрузки, на свободном канале - получил 420 Mbps. Думаю что уперся в их предел. Есть ресурс для покупки под текущий проект чего-то лучше чем Broadcom, например Intel 1000 серии, но версий этих сетевок в продаже много, мне пока удавалось потестить лишь GT Desktop Edition - не обрадовали тесты. Есть ли шанс пропустить больше трафика (мои надежды получить до 800 Mbps) если купить Intel 1000 Server Edition GT/MT или что-то более? Вставить ник Quote
dsk Posted March 30, 2010 Posted March 30, 2010 GT/MT это все не то. Нужно смотреть в сторону PT - pci express. Но по видимому тогда придется менять еще и тазик. Вставить ник Quote
XeonVs Posted March 31, 2010 Posted March 31, 2010 в лоадер: net.isr.maxthreads=2 net.isr.numthreads=2 пулинг из ядра вообще вынести. и смотреть как будет лучше, с net.isr.direct=0 или =1 покупать действительно имеет смысл только PT\ET Вставить ник Quote
andriko Posted March 31, 2010 Posted March 31, 2010 до STABLE таки надо обновляться - там в if_bge много исправлений , правда тама Luigi Rizzo на ipfw/dummynet издевается... Зато возможно кое что из новинок даж и заработает Вставить ник Quote
Lucky SB Posted March 31, 2010 Posted March 31, 2010 Можно конечно сделать такую таблицу из IP подсетей на каждом VLAN и все же перейти на tablearg, но даст ли это увеличение производительности? Может все же можно увязать tablearg к абонентскому vlan без IP подсетей ? Да и dummynet в top -SHP практически не создает нагрузку, насколько я понимаю.ng_car можно прибить к каждому интерфейсу.А в твоей конструкции проблема не в шейпере, а в том, что КАЖДЫЙ пакет в среднем проходит через 300 правил ipfw, на что требуется процессор и время ;) Вставить ник Quote
make.kernel Posted March 31, 2010 Posted March 31, 2010 Нат не очень хорошо масштабируется, у меня при двух сотнях кппс нагрузка начала расти экспоненциально. Наплодил кучу натов серая /24 в 1 белый - нагрузка на ядра, которые прерывания от сетевух обрабатывают упала с 70 до 15%, трафик в наты раскладывается таблицей. До этого процентов 5 выиграл на cpuset - 8 ядер и 6 интерфейсов - каждому прерыванию rx свое ядро, остальной хлам на 2 оставшихся. isr.direct=1, fastforwarding=1. Карточки интеловые ЕТ, драйвера 1.4.8 с интела. При net.isr.maxthreads > 1 у меня почему-то один поток грузился намного больше остальных, кроме количества потоков и isr.direct есть еще крутилочки? А то негуглится как-то этот вопрос. Ну и да, на stable как-то грустно сейчас, каждый день пересобирать приходится, из-за ipfw, неудачное время. Вставить ник Quote
classic Posted March 31, 2010 Author Posted March 31, 2010 Да, читал тему насчет ifconfig ipfw0, ну там быстро решение нашлось. Таки думаю взять себе Intel Gigabit ET Dual Port и PCI-E сервер. Вставить ник Quote
andriko Posted March 31, 2010 Posted March 31, 2010 ...Таки думаю взять себе Intel Gigabit ET Dual Port и PCI-E сервер. угу - только в силу бурной деятельности інтела над драйверами в последнее время там тож не все так просто.. Вставить ник Quote
classic Posted March 31, 2010 Author Posted March 31, 2010 угу - только в силу бурной деятельности інтела над драйверами в последнее время там тож не все так просто.. Я так понимаю ET будет igb ? Вставить ник Quote
kapa Posted March 31, 2010 Posted March 31, 2010 угу - только в силу бурной деятельности інтела над драйверами в последнее время там тож не все так просто.. Я так понимаю ET будет igb ? да Вставить ник Quote
andriko Posted March 31, 2010 Posted March 31, 2010 кста в head уже igb revision 1.9.3: - Following the ixgbe code, use a new approach in what was called 'get_buf', the routine now has been made independent of rxeof, it now does the update to the engine TDT register, this design allows temporary mbuf resources to become non-critical, not requiring a packet to be discarded, instead it just returns and does not increment the tail pointer. - With the above change it was also unnecessary to keep 'spare' maps around, since we do not have the discard issue. - Performance tweaks and improvements to the code also. MFC in a week Вставить ник Quote
make.kernel Posted March 31, 2010 Posted March 31, 2010 Я когда и з 7.2 бсдшный драйвер пробовал как с бубном не плясал а скорость через рутер не поднималась выше 200 мбит, на интеловом драйвере через тазик гиг летает. Вставить ник Quote
Laa Posted April 2, 2010 Posted April 2, 2010 до STABLE таки надо обновляться - там в if_bge много исправлений , правда тама Luigi Rizzo на ipfw/dummynet издевается... Зато возможно кое что из новинок даж и заработаетУ меня такой же сервер и к сожалению с bge были проблемы. Поэтому приготовь заранее svn (subversion) для отката назад sys/dev/bge, если что. Ну и не включай в ядро options FLOWTABLE. У меня пока такая нагрузка: netstat -w1 -h -I bge0 input (bge0) output packets errs idrops bytes packets errs bytes colls 34K 0 0 29M 32K 0 21M 0 32K 0 0 27M 31K 0 21M 0 31K 0 0 27M 29K 0 20M 0 30K 8 0 27M 29K 0 18M 0 30K 0 0 25M 29K 0 18M 0 30K 0 0 26M 30K 0 20M 0 31K 0 0 27M 30K 0 19M 0 30K 0 0 25M 29K 0 20M 0 29K 0 0 24M 28K 0 19M 0 Вставить ник Quote
voron Posted April 3, 2010 Posted April 3, 2010 При net.isr.maxthreads > 1 у меня почему-то один поток грузился намного больше остальных может был забыл net.isr.direct_force ? Вставить ник Quote
X-RaY™ Posted April 11, 2010 Posted April 11, 2010 (edited) После темы Bras для 6-7 тысяч рррое понял что руки у меня на редкость из *опы, прошу помочь с pppoe bras на freebsd. Дано: несколько комплектов intel S3420GPLC + xeon X3450, сетевые встроенные em(Intel 82574L and 82578DM) , FreeBSD 8 amd64, mpd5 и ng_car . Хочется получить: стаблильную pppoe терминацию и шейп, нат не нужен. Подскажите по sysctl, loader.conf и ядру, у кого такая же связка софта на пппое стабильно и быстро работает. За последние пол года там столько всего поменялось, поломалось и починилось, что я боюсь советы и тюны даже 2х месячной давности могут навредить(к тому что все темы тут прочел не раз, при сборке прошлых серваков и на гуглил не мало, но там в 95% советы по тюнингу то под вэб сервер, то под файловый и зфс). Заранее спасибо за любые ответы,советы хочется верить что не циской едины для pppoe bras. Edited April 11, 2010 by X-RaY™ Вставить ник Quote
andriko Posted April 12, 2010 Posted April 12, 2010 хм, а что без тюнинга получается? Вставить ник Quote
Ivan_83 Posted April 12, 2010 Posted April 12, 2010 И здесь народ тюнинг Сысоева под веб сервер во всю выдаёт за свой/панацею от всех бед. Людей которые что то сами тюнят со смыслом тут человек 5 наберётся, под фрю. Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.