Jump to content
Калькуляторы

FreeBSD 8 Gigabit soft-router

Добрый день всем.

Суть проблемы - при увеличении количества проходящих через маршрутизатор пакетов (до 35K pps, 120 Mbps и на входе и на выходе) имею ~ 500 input errors/sec на внешнем интерфейсе, клиенты немного начинают жаловаться.

 

Ошибки:

bafdb43c4722.jpg

Пакеты:

1503b4042ae8.jpg

Трафик:

d7261b748a1b.jpg

 

Недавно прочитал статью на 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 by classic

Share this post


Link to post
Share on other sites

еще нужен вывод top -SHP в момент дропов, ipfw show как минимум, сколько и каких процов в системе.

 

ps. 300 мегабит и 60 килопаетов в одну сторону тачка с роутингом, шейпингом, натом и нетфлоу должна делать

Edited by bsdelnik

Share this post


Link to post
Share on other sites

Хорошая у вас железка.

С поллингом, более, чем 1200 строчками в фаерволле и натом она умудряется выдавать более 20кппс.

За что же вы ее так жестоко ?

Начните с оптимизации фаерволла - или раскладывается в пайпы через таблицы, или вообще на ng_car поменяйте.

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
в 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 потоками играться грамотно.
С этим согласен, это в данном случае обязательно.

 

Share this post


Link to post
Share on other sites
в 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 by XeonVs

Share this post


Link to post
Share on other sites

Хм! в 8рке разве крутилки отломали?

Их никогда и не было в ядре.

Share this post


Link to post
Share on other sites
Хм! в 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 by XeonVs

Share this post


Link to post
Share on other sites

По поводу сколько и каких процессоров в системе:

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 или что-то более?

 

 

 

 

 

Share this post


Link to post
Share on other sites

GT/MT это все не то. Нужно смотреть в сторону PT - pci express. Но по видимому тогда придется менять еще и тазик.

Share this post


Link to post
Share on other sites

в лоадер:

net.isr.maxthreads=2

net.isr.numthreads=2

пулинг из ядра вообще вынести.

 

и смотреть как будет лучше, с net.isr.direct=0 или =1

 

покупать действительно имеет смысл только PT\ET

Share this post


Link to post
Share on other sites

до STABLE таки надо обновляться - там в if_bge много исправлений , правда тама Luigi Rizzo на ipfw/dummynet издевается... Зато возможно кое что из новинок даж и заработает

Share this post


Link to post
Share on other sites
Можно конечно сделать такую таблицу из IP подсетей на каждом VLAN и все же перейти на tablearg, но даст ли это увеличение производительности? Может все же можно увязать tablearg к абонентскому vlan без IP подсетей ? Да и dummynet в top -SHP практически не создает нагрузку, насколько я понимаю.
ng_car можно прибить к каждому интерфейсу.

А в твоей конструкции проблема не в шейпере, а в том, что КАЖДЫЙ пакет в среднем проходит через 300 правил ipfw, на что требуется процессор и время ;)

 

Share this post


Link to post
Share on other sites

Нат не очень хорошо масштабируется, у меня при двух сотнях кппс нагрузка начала расти экспоненциально. Наплодил кучу натов серая /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, неудачное время.

Share this post


Link to post
Share on other sites

Да, читал тему насчет ifconfig ipfw0, ну там быстро решение нашлось.

Таки думаю взять себе Intel Gigabit ET Dual Port и PCI-E сервер.

Share this post


Link to post
Share on other sites
...

Таки думаю взять себе Intel Gigabit ET Dual Port и PCI-E сервер.

угу - только в силу бурной деятельности інтела над драйверами в последнее время там тож не все так просто..

Share this post


Link to post
Share on other sites
угу - только в силу бурной деятельности інтела над драйверами в последнее время там тож не все так просто..

Я так понимаю ET будет igb ?

 

Share this post


Link to post
Share on other sites
угу - только в силу бурной деятельности інтела над драйверами в последнее время там тож не все так просто..

Я так понимаю ET будет igb ?

да

Share this post


Link to post
Share on other sites

кста в 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

Share this post


Link to post
Share on other sites

Я когда и з 7.2 бсдшный драйвер пробовал как с бубном не плясал а скорость через рутер не поднималась выше 200 мбит, на интеловом драйвере через тазик гиг летает.

Share this post


Link to post
Share on other sites
до 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

Share this post


Link to post
Share on other sites

При net.isr.maxthreads > 1 у меня почему-то один поток грузился намного больше остальных

может был забыл net.isr.direct_force ?

Share this post


Link to post
Share on other sites

После темы

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 by X-RaY™

Share this post


Link to post
Share on other sites

И здесь народ тюнинг Сысоева под веб сервер во всю выдаёт за свой/панацею от всех бед.

Людей которые что то сами тюнят со смыслом тут человек 5 наберётся, под фрю.

Share this post


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
Sign in to follow this