Jump to content

Recommended Posts

Posted (edited)

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

Суть проблемы - при увеличении количества проходящих через маршрутизатор пакетов (до 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
Posted (edited)

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

 

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

Edited by bsdelnik
Posted

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

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

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

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

 

Posted

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

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

 

Posted (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 by XeonVs
Posted (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 by XeonVs
Posted

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

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

 

 

 

 

 

Posted

в лоадер:

net.isr.maxthreads=2

net.isr.numthreads=2

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

 

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

 

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

Posted

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

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

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

 

Posted

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

Posted
...

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

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

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

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

 

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

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

да
Posted

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

Posted

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

Posted
до 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

Posted

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

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

  • 2 weeks later...
Posted (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 by X-RaY™
Posted

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

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.