Dark_Angel Posted December 30, 2008 Posted December 30, 2008 (edited) Всем доброе время суток. Я прочел множество статей о kosftirqd, драйверах NAPI для e100, e1000, как они работают и много всякой другой теории об этих связках, но вы сами понимаете, что теория, это только теория. Недавно наткнулся на тему про softrouter на FreeBSD ( тут же ) и увидел там, что хендлеры для rx/tx операций заводят как треды на разные процессоры, используя драйвера от Яндекс, таким образом выполняя, как бы sharing soft irq. Я попытался погуглить по данной теме что для Linux, но нашел только теорию. На практике есть какие-то самописные непроверенные патчи к 2.6 ядрам. Но как я понял эта штука называется Scaling I/O и по заявлению некоторых товарищей ( http://www.linux.org.ru/view-message.jsp?msgid=2182914 ) она уже давно применяется в Linux и якобы назвается sotirq-net-tx/rx. При обычной загрузке машины - прерывания распределяются по процессорам примерно равномерно. Но при перегрузке от количества пакетов в top начинает выступать один ksoftirqd, который занимает только один процессор, ну и естественно, устраивает капец сетевому трафику, хотя другие процессоры занимаются user-level операциями и в принципе свободны. Ситуация стандартная, но вопросы таковы: 1. Есть ли какие-то методы распределения софт прерываний на несколько процессоров, для их более быстрой обработки? 2. Можно ли как-то управлять поллингом для драйвера e1000? Потому как, судя по документации, поллинг начинает работать только, когда количество пакетов превышает количество возможных прерываний в системе 3. Можно ли как-то просматривать статистику драйвера? ( сколько пакетов в буфере сетевой карты, шедулятся ли пакеты на soft_irq, может еще что-то ) 4. Можно ли как-то просмотреть что именно делает ksoftirq во время работы? 5. В каком ядре ( 2.4 / 2.6 ) по-вашему лучше реализована работа этого всего механизма? Можно, так же ответить на вопрос, который, я думаю, заинтересует не только меня: это кто еще как решал вопрос при перегрузке сетевого интерфейса/интерфейсов от количества пакетов, но все же интересуют именно заданные выше вопросы. Все заранее спасибо за ваши ответы. Edited December 30, 2008 by Dark_Angel Вставить ник Quote
Ivan Rostovikov Posted December 30, 2008 Posted December 30, 2008 (edited) >1. Есть ли какие-то методы распределения софт прерываний на несколько процессоров, для их более быстрой обработки? сервер ксеон 4 ядра. линукс. 4 гигабитные сетевухи. vmlinuz-2.6.26.5-e1000e Все параметры ядра по умолчанию + e1000e драйвер. Смотрите как равномерно распределены прерывания по ядрам: cat /proc/interrupts | grep eth 1261: 1127602476 1127685973 1127530955 1127464435 PCI-MSI-edge eth3 1262: 1151096626 1151292994 1151015951 1151011638 PCI-MSI-edge eth2 1263: 1130046456 1129901596 1130186351 1130179831 PCI-MSI-edge eth1 1264: 1226653615 1226507124 1226663069 1226742880 PCI-MSI-edge eth0 >2. Можно ли как-то управлять поллингом для драйвера e1000? Потому как, судя по документации, поллинг начинает работать только, когда количество пакетов превышает количество возможных прерываний в системе Если режим - авто - то нельзя. Иначе можно указать конкретное кол-во пакетов на каждое прерывание. >3. Можно ли как-то просматривать статистику драйвера? ( сколько пакетов в буфере сетевой карты, шедулятся ли пакеты на soft_irq, может еще что-то ) Это незнаю. >4. Можно ли как-то просмотреть что именно делает ksoftirq во время работы? oprofile >5. В каком ядре ( 2.4 / 2.6 ) по-вашему лучше реализована работа этого всего механизма? А ,что в 2.4 она вообще есть ? Edited December 30, 2008 by Ivan Rostovikov Вставить ник Quote
Dark_Angel Posted December 30, 2008 Author Posted December 30, 2008 (edited) 2Ivan Rostovikov: > 1. Смотрите как равномерно распределены прерывания по ядрам: >> При обычной загрузке машины - прерывания распределяются по процессорам примерно равномерно. Тут именно вопрос о распределении soft_irq 2. Я знаю, что можно задавать интевалы времени на которые откладываются прерывания, но чтобы пакеты. Откуда система будет знать сколько пакетов в буфере сетвой карты и что пора делать прерывание? Может Вы вспомните опцию которой можно задать это количество пакетов для драйвера? 3. 4. Спасибо, посмотрю. 5. Да, кажется с 2.4.19 появился NAPI. Edited December 30, 2008 by Dark_Angel Вставить ник Quote
Ivan Rostovikov Posted December 31, 2008 Posted December 31, 2008 Однажды я довольно многовремени убил на поиски решения проблемы "большая загрузка от soft_irq". Тоже kosftirqd " грузил цпу. Ядрокот обьяснил популярно, что kosftirqd это собственно само ядро, а именно все что происходит с пакетом между интерфейсами - это kosftirqd. Значит молищите проблему не только в драйвере и сетевухе но и в обработке пакета (роутинг, iptables, qdisc... и т.д.). И Вы знаете, так оно было. В моем случае банально iptables нагружал цпу. Выяснил с помощью oprofile (собрал ядро с отладкой). Помоим ощущениям, современные процессоры и шины, практически невозможно "перегрузить" обычными пакетами (обычным трафиком) на гигабитных интерфейсах. На 10Г - может быть. Так, что проблема скорее всего не в NAPI. И не в сетевухе вообще. Вставить ник Quote
Dark_Angel Posted December 31, 2008 Author Posted December 31, 2008 Вы все верно говорите. Вот только задайте себе вопрос: неужели нельзя обрабатывать всю эту лабуду "(роутинг, iptables, qdisc... и т.д.)." на нескольких процессорах? Это как бы основной вопрос. Насчет перегрузки, я с Вами не соглашусь. Когда packet blasters начинают рисовать по 350-400 Kpps четырех процессорный ксеон немного "худеет", даже слегка прихудевает от этого. А это "всего" 200-250 Мбит трафика. И повесьте Вы даже 100 процессоров, всеравно при входе в soft irq - машина будет умирать, потому что их обрабатывает 1 процессор. Кстати, даже, если нет iptables, qdisc. Вставить ник Quote
Ivan Rostovikov Posted December 31, 2008 Posted December 31, 2008 >потому что их обрабатывает 1 процессор pppoe4:~# top -b | grep ksoftirq 4 root 15 -5 0 0 0 S 0 0.0 0:53.30 ksoftirqd/0 7 root 15 -5 0 0 0 S 0 0.0 0:57.97 ksoftirqd/1 10 root 15 -5 0 0 0 S 0 0.0 0:59.63 ksoftirqd/2 13 root 15 -5 0 0 0 S 0 0.0 0:59.92 ksoftirqd/3 pppoe4:~# uptime 13:15:56 up 5 days, 22:56, 1 user, load average: 0.16, 0.07, 0.02 Трафик в среднем примерно 2Гб/с через всю машину. Похоже тики по всем ядрам распределены довольно ровно. Я сильно не присматривался но мне казалось видел и больше.400kpps точно было.Без проблем. Т.е. я намекаю на то, что софт ирки тоже расходятся по ядрам.Так же как и хард ирки. Вставить ник Quote
BETEPAH Posted December 31, 2008 Posted December 31, 2008 (edited) всё правильно темный ангел говорит, 4 сетевые и все задействованы, у меня четырёхядерник ксеон, но 2 сетевые, вот как прерывания распределены: [root@billing ~]# cat /proc/interrupts CPU0 CPU1 CPU2 CPU3 0: 90806 21096 459586880 1619224 IO-APIC-edge timer 1: 4 1 156 24 IO-APIC-edge i8042 6: 1 0 1 0 IO-APIC-edge floppy 8: 2 0 1 0 IO-APIC-edge rtc 9: 0 0 0 0 IO-APIC-level acpi 12: 33 32 125 32 IO-APIC-edge i8042 209: 104937 0 68496895 0 PCI-MSI ahci 225: 1842 3815866906 1843 1860 IO-APIC-level eth0 233: 42623 0 0 3540210025 PCI-MSI eth1 NMI: 0 0 0 0 LOC: 461083806 461083771 460995047 460994963 ERR: 0 MIS: 0 [root@billing ~]# получается, что 2 ядра тупо простаивают, когда другие 2 вечером загружены по самое немогу Edited December 31, 2008 by BETEPAH Вставить ник Quote
DemYaN Posted December 31, 2008 Posted December 31, 2008 Тут нужно смотреть на чип сетевого интерфейса, например 82571EB/82572EI устанавливаемые в частности в EXPI9400PT имеют по 2 независимых TX/RX очереди и поддерживают MSI-X, соответственно каждая очередь может быть посажена на отдельный CPU. В 82575EB 4 очереди, а в новых 82576EB которые используются в адаптерах ET-серии вообще 16 очередей. Вставить ник Quote
Dark_Angel Posted December 31, 2008 Author Posted December 31, 2008 2Ivan Rostovikov: А можете сказать какие именно у Вас сетевые карты, потому что если у Вас 2 Гбита и 400 kpps валит и нагрузка на 4-х ядрах 0.1 - это более чем интересно. Вставить ник Quote
Ivan Rostovikov Posted January 3, 2009 Posted January 3, 2009 2 X Broadcom NetXtreme II BCM5708 1000Base-T (B2) PCI-X 64-bit 133MHz + 2 X Intel® PRO/1000 PF Server Adapter Intel® Gigabit PCI Express Вставить ник Quote
Dark_Angel Posted January 3, 2009 Author Posted January 3, 2009 2DemYaN: А где об этом количестве очередей можно прочесть? 2Ivan Rostovikov: А какой чип на Интелах? Вставить ник Quote
Ivan Rostovikov Posted January 3, 2009 Posted January 3, 2009 Боюсь ошибиться но вроде: Intel® 82572GI Поправка. У меня на PF, а PT. http://www.intel.com/Assets/PDF/general/252454.pdf Вставить ник Quote
BETEPAH Posted January 4, 2009 Posted January 4, 2009 2 DemYaN: ткните пожалуйста, где можно прочитать про очереди и как их настроить на разные ядра, потому что нашёл, что в моём чипе 82566DM тоже независимые очереди RX и TX, правда про второй чип 82541GI не нашёл инфу. Вставить ник Quote
DemYaN Posted January 4, 2009 Posted January 4, 2009 Количество очередей можно глянуть тут: http://www.intel.com/products/ethernet/ind...rnetcontrollers Сейчас не вспомню какую именно работу читал, где описывается более подробно работа дескрипторов очередей, однако поверхностно можно глянуть тут: http://www.intel.com/network/connectivity/...pers/318483.pdf еще здесь немножко (хотя касается в большей мере DCA): http://rethink.intel.com/Download/318677.pdf о DCA с пристрастием: http://www.stanford.edu/group/comparch/pap...uggahalli05.pdf касательно поддержки IO/A и DCA в Linux: http://downloadmirror.intel.com/10959/ENG/README.txt Вставить ник Quote
azazello Posted January 4, 2009 Posted January 4, 2009 При 2082М суммарного RX/TX трафика на двух гигабитных интерфейсах начинает подскакивать ksoftirqd/0-1 На машине ещё много всего крутится (tc u32 около 2,5тыс. пайпов в пиках, iptables-ipset, fprobe, биллинг, mysql и прочее) Я так понимаю увеличением частоты процессоров вопрос не решить и подозреваю что спасает только установка дополнительных сетевых? А может поможет и то и другое? :) Вставить ник Quote
Sonne Posted January 5, 2009 Posted January 5, 2009 При 2082М суммарного RX/TX трафика на двух гигабитных интерфейсах начинает подскакивать ksoftirqd/0-1На машине ещё много всего крутится (tc u32 около 2,5тыс. пайпов в пиках, iptables-ipset, fprobe, биллинг, mysql и прочее) Я так понимаю увеличением частоты процессоров вопрос не решить и подозреваю что спасает только установка дополнительных сетевых? А может поможет и то и другое? :) Поможет разнесение сервисов по машинам. Лично мне бы в страшном сне mysql и фаирвол на одной машине крутить не приснилось бы. Вставить ник Quote
Dark_Angel Posted January 5, 2009 Author Posted January 5, 2009 2DemYaN: Большое спасибо за ссылки - изучаю. Вы на практике пробовали это юзать? Работает? Вставить ник Quote
azazello Posted January 5, 2009 Posted January 5, 2009 Поможет разнесение сервисов по машинам.Лично мне бы в страшном сне mysql и фаирвол на одной машине крутить не приснилось бы. В системе всего 8 ядер по 4 на 2-х процессорах. Остальные сервисы грузят мало, ядрышки гуляют. Убито только по одному ядру в каждом процессоре там где висят сетевые. Вставить ник Quote
nuclearcat Posted January 5, 2009 Posted January 5, 2009 azazello - если какая-то операция I/O заблокирует "нужную подсистему" локом - встанут все ядра, и буду ждать, пока закончит. conntrack меня таким поведением доводил до белого каления... пока нашел в чем дело. Плюс - используя mysql - можно "уронить" firewall глюками - которые возникают только из mysql (threads, mmap и т.п.) Т.е. вероятность падения всего сервера - растет. Я пробовал два варианта - сверхмощный сервер для "всего", и много "средних" или "дешевых" серверов. Из-за несовершенности софта, пришлось откатиться ко второму варианту, в большинстве случаев. Вставить ник Quote
azazello Posted January 5, 2009 Posted January 5, 2009 Да я согласен со всем изложенным. Но в случае второго варианта повышается цена обслуживания зоопарка серверов и возникают проблемы другого характера. Можно еще посмотреть в сторону виртуализации, но там тоже не все так гладко :( В общем mysql таки перенесу :) Вставить ник Quote
Dark_Angel Posted January 6, 2009 Author Posted January 6, 2009 2nuclearcat: Попутно читая Вашу тему про softrouter, nag edition и обсуждение про ядра, хотел узнать, может Вы можете высказать по вопросу 5) этого топика? Потому как бытует мнение, что в 2.4 работа с сетью реализована быстрее и стабильнее нежели в текущих 2.6 ядрах. Так ли это по-вашему? Вставить ник Quote
nuclearcat Posted January 6, 2009 Posted January 6, 2009 Однозначно нет. 2.4 при работе с сетью - медленнее. Именно поэтому Микротик перешел на 2.6. Ребята с openwrt/dd-wrt подняли RB-533 на 2.6, и их сборка оказалась гораздо быстрее в сетевых делах, чем родная микротиковская, основанная в то время на 2.4. Да я согласен со всем изложенным. Но в случае второго варианта повышается цена обслуживания зоопарка серверов и возникают проблемы другого характера.Можно еще посмотреть в сторону виртуализации, но там тоже не все так гладко :( В общем mysql таки перенесу :) В некоторых случаях один сервер допустим.... небольшая организация, где более 1 сервера незачем ставить, и некритичные задачи.Да и если не падает и не тормозит, можно пока не трогать :-) Вставить ник Quote
ingress Posted January 6, 2009 Posted January 6, 2009 nuclearcat а как дела обстоят с множественными таблицами маршрутизации(аля VRF), route leaking, все приложения и фичи vrf-aware? Вставить ник Quote
nuclearcat Posted January 6, 2009 Posted January 6, 2009 ip route add table 200 1.2.3.0/24 dev eth0 ip route add table 200 default via 1.2.3.4 Т.е. отдельная таблица, 200 В таблицу можно классифицировать по src, dst адресу, tos, fwmark, входящему устройству, Если можно, нужна задача... чтоб понять, что именно требуется и можно ли это реализовать в Линуксе Вставить ник Quote
yun Posted January 6, 2009 Posted January 6, 2009 Это все же не полноценный виртуальный стек. Например iptables получается один на все пакеты/интерфейсы/таблицы маршрутизации Поэтому, например, нат (или любой другой механизм использующий контраки) становится совсем не тривиальным при прохождении пакета более одного раза через стек. Вставить ник 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.