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

Linux softrouter

voron

DemYaN

А вы случайно не в курсе, что такое "receive side scaling" и с чем его едят? Или это просто красивый маркетинговый ход?

 

Из-за чего я затеял всю эту возню с multiqueue... Купил Xeon 3430, материнку S3420GPLC, установил систему, запустил. Гляжу - softirq жрет в среднем 40%, в пике 65% времени ядер, на которых висят прерывания сетевушек. Сетевушек всего 2, из софта установлена только quagga, есть целых 5(!) полос htb, на них аж 2(!) u32 фильтра. Есть еще iptables, который содержит ~2000 правил '-m comment 'xyz'', абсолютно все правила в target RETURN, 2 правила NAT для сетей 10.0.0.0/8 и 192.168.0.0/16. Для такой машины это смешная нагрузка, средний проходящий траффик - 40Мбит, в прыжке - 85Мбит. Вообще-то - эта конструкция - задел под 250-350Мбит, но если на 40Мбит softirq выедает 40% проца, тогда я начинаю сомневаться в успехе мероприятия... Все советы в этой ветке читал, пробовал. Насчет InterruptThrottleRate=100000 - просто становится больше прерываний в секунду на ядро, а загрузка проца softirq не меняется. Если развести RX и TX на разные векторы - та же история: ядро, на котором висит RX загружено на 40-65% softirq, ядро, на котором висит TX свободно как резинка от трусов - редко загрузка прыгает выше 1%.

 

Что характерно - у меня есть другой сервер, собранный на обычном ASUSe, Core2Quad Q6600, Intel Pro/1000 PT (single port), Intel Pro/1000 на PCI, никакой пляски с разделением очередей, все работает как есть, около 3000 полос htb, примерно столько же фильтров fw, 4000+ различных правил iptables, в FORWARD и mangle. Загрузка ядер, задействованных под сетевые платы - 75-85%, средний проходящий траффик - 250 Мбит. И плюс - на нем стоит bind, обслуживающий всю сетку и dhcpd. Что-то я не пойму... То ли лыжи не едут, то ли...

 

Share this post


Link to post
Share on other sites
А вы случайно не в курсе, что такое "receive side scaling" и с чем его едят?
Похоже это аппаратная фича для извлечения flow information из [tcp] трафика для направления этого трафика на нужный CPU в нужную очередь для улучшения cache hits.

 

Share this post


Link to post
Share on other sites
ни у кого не возникали проблемы с сетевой Intel на бордере:

 

01:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)

01:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)

 

с бордера скачка норм, с серверов доступа ходящих через него ~500 килобит, про шейперы и прочее не предлагать, все что можно было отключено...

Столкнулся с аналогичной проблемой, причем на двух одинаковых серверах, с ядром

 

2.6.30-gentoo-r5 #1 SMP Wed Nov 25 01:33:55 EET 2009 x86_64 Intel® Xeon® CPU E5520 @ 2.27GHz GenuineIntel

 

ethtool -i eth0

driver: igb

version: 1.3.16-k2

firmware-version: 1.2-1

bus-info: 0000:03:00.0

 

Менял порты на свиче, менял свич, убирал вланы, перепробывал почти все.

Поставил сетевые на чипе 82574, и чудо проблемы нет.

Грешу теперь на драйвера под 82576 чип.

 

Причем эта же сетевая на 3м сервере работает отлично без каких либо глюков

 

2.6.27-gentoo-r8 #11 SMP Thu Apr 16 23:52:40 EEST 2009 i686 Intel® Core i7 CPU 920 @ 2.67GHz GenuineIntel

 

ethtool -i eth0

driver: igb

version: 1.2.45-k2

firmware-version: 1.2-1

bus-info: 0000:03:00.1

 

 

Кто то уже лечил даную ситуацию?

Смущает только одно, что может дрова на 64 битной системе работают с глюками. Так как на 3 сервере где все отлично, 32битная версия линуха стоит.

 

Хочу продолжить тему, поднятую V@No.

Имеется сетевуха Intel Pro/1000 PT Dual Port (82571EB). На сайте производителя в описании указано: "2Tx, 2Rx queues".

Что бы не пробовал делать на домашнем десктопном компе - не получается вывести в multiqueue режим. Есть ли у кого положительный опыт RX/TX multiqueue с такой сетевушкой?

 

[13:14:12]root@xlin64:/usr/src/e1000e-1.0.15/src/# ethtool -i eth1

driver: e1000e

version: 1.1.2-NAPI

firmware-version: 5.11-2

bus-info: 0000:04:00.0

 

Может, это связано с тем, что я пытаюсь сделать невозможное для десктопного чипсета (i965)?

Забудь за эти сетевые они не поддерживают несколько прерываний. Можешь попробывать на 82574 чипе, у меня там получалось 2 прерывания на одну сетевую, одно на rx, одно на tx.
Edited by V@No

Share this post


Link to post
Share on other sites
Забудь за эти сетевые они не поддерживают несколько прерываний.
Если верить исходникам драйвера e1000e 1.1.2 - msi-x включается только для 82574 (netdev.c в районе e1000_82574_info, e1000_configure_msix сделан 82574-specific и использует единственную очередь RXQ0, RXQ1 есть только в e1000_defines.h). Ну и на 82574 сборка
make CFLAGS_EXTRA=-DCONFIG_E1000E_SEPARATE_TX_HANDLER

вынесет tx в отдельное(от Other Causes, e.g. link changes) прерывание, только кому от этого легче :)

 

Так что похоже, 82571/82572 не поддерживают msi-x, да и OpenSDM_8257x-18.pdf про msi-x молчит, как и даташит. Ну и об этом же говорят в e1000-devel (1, 2). Про lspci -v можно и не говорить, результаты те же - нет поддержки msi-x.

 

2DemYaN

Пока не открыл ссылку в FF, не было того, что на скриншоте. В опере пустое место просто :/

Однако пока всё указывает на правоту pdf'ки и отсутствие msi-x

Edited by voron

Share this post


Link to post
Share on other sites

2alexpro: Посмотрите профайлером для начала, что хавает softirq.

 

InterruptRate=100000 - это для захлебывающейся системы. У Вас 85 Мбит трафика можно прожевать на риалтеке, а у Вас интел стоит и не может. Тут Вы что-то из виду упускаете, толи у Вас при 85 Мбитах pps больше чем надо, толи дрова шалят, то ли что-то другое забирает софтовые перывания.

 

В любом случае без профайлера - это пальцем в небо, учитывая, что основнеы моменты ( очереди, фаервол ) Вы уже проверили и там ничего нет. Единственное что меня смущает - это Ваши 2000 правил. В какой таблице они находятся и в какой цепочке? Пробовали их убирать?

Edited by Dark_Angel

Share this post


Link to post
Share on other sites
2alexpro: Посмотрите профайлером для начала, что хавает softirq.
Начиная с ~2.6.31 должно работать
cat /proc/softirqs

 

Share this post


Link to post
Share on other sites
ни у кого не возникали проблемы с сетевой Intel на бордере:

 

01:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)

01:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)

 

с бордера скачка норм, с серверов доступа ходящих через него ~500 килобит, про шейперы и прочее не предлагать, все что можно было отключено...

Столкнулся с аналогичной проблемой, причем на двух одинаковых серверах, с ядром

 

2.6.30-gentoo-r5 #1 SMP Wed Nov 25 01:33:55 EET 2009 x86_64 Intel® Xeon® CPU E5520 @ 2.27GHz GenuineIntel

 

ethtool -i eth0

driver: igb

version: 1.3.16-k2

firmware-version: 1.2-1

bus-info: 0000:03:00.0

тоже все варианты перебрал, уже грешил на железо, но оказалось дело было в ядре (+драйвер igb + поддержка MSI-X в ядре?)

 

У меня slackware 13.0 32-битная, проблемы были на ядре 2.6.29.6, перепробовал много версий igb и настроек, где-то скачка становилась лучше, серфинг никакой, в других случаях было наоборот.

 

На тестовом стенде с ядром 2.6.29.6 была такая же проблема. Собрал ядро 2.6.30.9 и обновил драйвер igb до версии 2.0.6, проблемы пропали, сейчас уже стоит в продакшене и работает без нареканий

Edited by maxxxxu

Share this post


Link to post
Share on other sites
ни у кого не возникали проблемы с сетевой Intel на бордере:

 

01:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)

01:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)

 

с бордера скачка норм, с серверов доступа ходящих через него ~500 килобит, про шейперы и прочее не предлагать, все что можно было отключено...

Столкнулся с аналогичной проблемой, причем на двух одинаковых серверах, с ядром

 

2.6.30-gentoo-r5 #1 SMP Wed Nov 25 01:33:55 EET 2009 x86_64 Intel® Xeon® CPU E5520 @ 2.27GHz GenuineIntel

 

ethtool -i eth0

driver: igb

version: 1.3.16-k2

firmware-version: 1.2-1

bus-info: 0000:03:00.0

тоже все варианты перебрал, уже грешил на железо, но оказалось дело было в ядре (+драйвер igb + поддержка MSI-X в ядре?)

 

У меня slackware 13.0 32-битная, проблемы были на ядре 2.6.29.6, перепробовал много версий igb и настроек, где-то скачка становилась лучше, серфинг никакой, в других случаях было наоборот.

 

На тестовом стенде с ядром 2.6.29.6 была такая же проблема. Собрал ядро 2.6.30.9 и обновил драйвер igb до версии 2.0.6, проблемы пропали, сейчас уже стоит в продакшене и работает без нареканий

обновился до 2.6.31-gentoo-r6 #1 SMP Wed Dec 9 02:36:00 EET 2009 x86_64 Intel® Xeon® CPU E5520 @ 2.27GHz GenuineIntel

проблема пропала. все отлично.

 

Share this post


Link to post
Share on other sites

Подскажите, пожалуйста, правильное направление.

 

Есть роутер на линукс, цпу Intel® Xeon CPU 2.80GHz - одно ядро, гипертрединг (от которого, как я понимаю, на роутере толку мало).

Имеется iptables, conntrack, шейпинг и fprobe+ulog.

Сетевушки

Ethernet controller: Intel Corporation 82545GM Gigabit Ethernet Controller (rev 04)

Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller

 

На сервере стоит старая ОС - mandriva 2006:

ядро 2.6.12

драйверы для сетевух e1000 версия 6.0.60-k2

 

При входящих 210Mbit, 29Kpps и исходящих 160Mbit,28Kpps вылезает ksoftirqd и все плохо. Имеет ли смысл при таком ЦПУ пытаться апгрейдить ядро и драйверы или не надо хотеть чудес от устаревшего железа?

 

P.S.

Если при этих 57К пакетов в секунду mpstat показывает 17к прерываний - то значит NAPI задействован, да?

 

P.P.S.

Вопрос про другой роутер.

Правильно ли я понял из сказанного ранее в теме, что если на роутере загрузка ЦПУ выглядит нормально - на каждом ядре порядка 30% свободно, но есть задержки при передаче пакетов, то это может быть из-за conntrack и полезно ядро 2.6.22.6 обновить до самого свежего?

 

Заранее спасибо.

Share this post


Link to post
Share on other sites
или не надо хотеть чудес от устаревшего железа?
Можете поиграться с настройками драйвера e1000, я использую
options e1000 InterruptThrottleRate=3000 FlowControl=0 TxDescriptors=4096 RxDescriptors=4096

 

Share this post


Link to post
Share on other sites

эээ... слушайте, а если у меня e1000 в ядро вкомпилено - я параметры ему выставить уже не смогу?

Share this post


Link to post
Share on other sites

Я так понял, что Intel 82571 (82572) не поддерживают multiqueue, и заказал двухпортовую Intel Pro 1000ET (82576), которая уж точно должна поддерживать. В этой связи есть 2 вопроса к применяющим этот самый multiqueue (возможно они глупые, прошу тапками не кидаться):

1. Пакеты, приходящие на интерфейс попадают в очереди равномерно, или нагружают сначала одну, потом вторую и т.д.?

2. Не было ли проблем с iptables и iproute2 (HTB) в связи с несколькими очередями на одном интерфейсе? Имеется в виду: softirq, попадания мимо фильтра/полосы, попадания мимо таблицы/правила?

 

Собираюсь запустить сетевушку "в бой" сразу, а испытать толком не на чем... Не хотелось бы неприятных сюрпризов как для себя, так и для юзеров в новогодние праздники...

 

Share this post


Link to post
Share on other sites
1. Пакеты, приходящие на интерфейс попадают в очереди равномерно, или нагружают сначала одну, потом вторую и т.д.?

2. Не было ли проблем с iptables и iproute2 (HTB) в связи с несколькими очередями на одном интерфейсе? Имеется в виду: softirq, попадания мимо фильтра/полосы, попадания мимо таблицы/правила?

1. Равномерно.

 

>cat /proc/interrupts | grep eth1-
 39:          1          0          0          0    1726006          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-tx-0
 40:          1          0          0          0          0 1182562228          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-tx-1
 41:          1          0          0          0          0          0    1608544          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-tx-2
 42:          1          0          0          0          0          0          0   12272817          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-tx-3
 43:         28          0          0          0 3322815218          0          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-rx-0
 44:         28          0          0          0          0 3296269300          0          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-rx-1
 45:         28          0          0          0          0          0 3453214061          0          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-rx-2
 46:         28          0          0          0          0          0          0 3538887856          0          0          0          0          0          0          0          0   PCI-MSI-edge      eth1-rx-3

>ethtool -S eth1 | grep queue
    tx_restart_queue: 160
    tx_queue_0_packets: 2272100
    tx_queue_0_bytes: 1076187983
    tx_queue_1_packets: 129933060036
    tx_queue_1_bytes: 126776763655694
    tx_queue_2_packets: 2273234
    tx_queue_2_bytes: 1321075252
    tx_queue_3_packets: 28824675
    tx_queue_3_bytes: 38374394282
    rx_queue_0_packets: 26822352467
    rx_queue_0_bytes: 16024328774328
    rx_queue_1_packets: 26955108335
    rx_queue_1_bytes: 15936905403561
    rx_queue_2_packets: 26967956652
    rx_queue_2_bytes: 15845185234217
    rx_queue_3_packets: 27437601610
    rx_queue_3_bytes: 16519307617664

2. С IPTables проблем нет. Для HTB рекомендуют отключать TCP Segmentation Offload, чтобы точность шейпера не падала.

 

>ethtool -K eth0 tso off

Share this post


Link to post
Share on other sites
Собираюсь запустить сетевушку "в бой" сразу
ну тогда не забудьте, что драйвер для неё igb, а не e1000e :)

 

Share this post


Link to post
Share on other sites

Судя по даташитам (1gbit only) только 82574IT, 82574L и 82576EB поддерживают MSI-X, следовательно очереди по прерываниям раскиданы.

В 82571 есть очереди, только они через MSI, то есть через одно прерывание.

Edited by c0rec0re

Share this post


Link to post
Share on other sites

voron

Спасибо за подсказку :)

Я в курсе, что igb, именно поэтому и заказывал 82576.

 

c0rec0re

82574L поддерживает MSI-X, может разводить RX и TX на разные вектора. Но больше одной очереди на прием он не организовывает. Более того, в драйвере e1000e нету поддержки multiqueue. Первый раз я смотрел исходник невнимательно. При более детальном рассмотрении выяснилось, что драйвер именно с чипами 82574, включает MSI-X. Причем, он либо занимает 2 вектора (eth<x>-Q0 (tx-rx queue) и eth<x>(link)), либо занимает 3 вектора (eth<x>-rx, eth<x>-tx и eth<x>). И это все, на что способен e1000e, причем, ТОЛЬКО с 82574. Что самое странное - при инициализации IntMode=2 драйвер его хавает с любой сетевушкой, и даже пишет в лог, что "Interrupt Mode set to 2", хотя, MSI-X, судя по исходникам драйвера, выставляется только для 82574.

А 82576 - это уже не e1000e, а igb, который поддерживает multiqueue.

 

Share this post


Link to post
Share on other sites

alexpro

именно это и написано в README к дравам e1000e с сайта интел, но не указано, к каким именно чипсетам это применимо:

To Enable a Separate Vector for TX

----------------------------------

# make CFLAGS_EXTRA=-DCONFIG_E1000E_SEPARATE_TX_HANDLER

 

This will allocate a separate handler for tx cleanups. This might be useful

if you have a lot of CPU cores under heavy load and want to spread the

processing load around.

 

With this option, you would get three MSI-X vectors: one for TX, one for RX,

and one for link.

На счёт броадкомов, ихних чипсетов и раскидкой очередей по прерываниям никто не в курсе?

Гигабитники, что мне попадались, работают только на одном прерывании.

Share this post


Link to post
Share on other sites
На счёт броадкомов, ихних чипсетов и раскидкой очередей по прерываниям никто не в курсе?

Гигабитники, что мне попадались, работают только на одном прерывании.

Поддерживаю вопрос!

Asus-платформа, cpu q6600, две встроенные карты BCM5721, ядро 2.6.27, драйвер tg3.

Пока сделал для них только smp_affinity на последние два ядра.

Скорее всего, потолком будут 350mbps (nat), при этом первые два ядра простаивают впустую.

Share this post


Link to post
Share on other sites

Получил сетевушку Intel Pro/1000ET Dual Port. Все завелось, как и хотелось, даже больше. Хотел сделать 2 очереди на интерфейс, а она делает 4. Ну, это ладно, пусть будет 4.

К вопросу, заданному здесь: в настройках QoS в ядре Linux есть такой пункт: "Hardware Multiqueue-aware Multi Band Queuing (MULTIQ)". Я его в ядро собрал. Кто-то знает, как оно работает, и работает ли с HTB? И еще, надо ли в настройках HTB давать какие-то дополнительные параметры, касающиеся этого "multiq"? В документации что-то ничего не обнаружил...

Share this post


Link to post
Share on other sites
Хотел сделать 2 очереди на интерфейс, а она делает 4. Ну, это ладно, пусть будет 4.
насколько я понимаю, это настраивается параметрами модуля, по крайней мере
parm:           QueuePairs:QueuePairs - TX/RX queue pairs for interrupt handling (array of int)

в igb 2.0.6 очень на это похож.

Кто-то знает, как оно работает, и работает ли с HTB?
Похоже, что этот шедулер того же уровня, что и HTB, применить его вряд ли получится для целей шейпинга. Да и Dave Miller упоминает об умных шейперах как об узком месте, как и товарищи, тестировавшие 10G роутинг

Share this post


Link to post
Share on other sites

voron

Т.е. - если используется HTB, то с multiqueue могут быть проблемы? Я конечно буду пробовать перед запуском... Но всего не проверишь в лабораторных условиях... А вот насчет параметров модуля, я так и не понял, как их указывать. В стд. поставке ядра доки на igb нет вообще, а тот, что от интела, может (судя по доке) только IntMode=3 и все. Кстати, в стд. ядре igb ругается на параметр IntMode, и безо всяких параметров загребает по 9 векторов на устройство (4 rx, 4 tx, 1 link). Я еще не рыл исходник, может, там где-то в районе init_module() и можно что-то отыскать (если оно вообще есть).

 

Share this post


Link to post
Share on other sites
Т.е. - если используется HTB, то с multiqueue могут быть проблемы? Я конечно буду пробовать перед запуском... Но всего не проверишь в лабораторных условиях...
не будет масштабируемости по ядрам у HTB.
А вот насчет параметров модуля, я так и не понял, как их указывать. В стд. поставке ядра доки на igb нет вообще, а тот, что от интела, может (судя по доке) только IntMode=3 и все. Кстати, в стд. ядре igb ругается на параметр IntMode, и безо всяких параметров загребает по 9 векторов на устройство (4 rx, 4 tx, 1 link). Я еще не рыл исходник, может, там где-то в районе init_module() и можно что-то отыскать (если оно вообще есть).
я говорил про последнюю версию igb с e1000.sf.net

Share this post


Link to post
Share on other sites

voron

Я уже нашел и поставил драйвер, прочитал доку. Все работает, как мне надо. Сказка прямо.

 

А вот насчет HTB мне непонятно. Как оно вообще тогда работает? На схеме "одна сетевая - одно ядро" softirq грузит именно то ядро, на котором работает сетевая, на которую назначены htb фильтры. А если "одна сетевая - два ядра", как это будет работать? Какое ядро из двух будет загружено softirq?

 

Share this post


Link to post
Share on other sites
voron

А если "одна сетевая - два ядра", как это будет работать? Какое ядро из двух будет загружено softirq?

Если сетевая карта без MSI/MSI-X то будет работать точно также :0)

А если фича есть то можно раскинуть прерывания отдельно от RX и TX например, по разным ядрам.

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