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

Сетевой трафик грузит только одно ядро Xeon ^(

Собственно вопрос ни кто не сталкивался со следующей проблемой, при большом ППС проходящем через софт роутер (NAT) на Win2003, Xeon 2 ядра, сетевые интегрированные Бордком НетЭкстрим. Нагрузка идёт на одно ядро, под 100%, второе ядро загружено на 10-20%, но при этом трафик начинает теряться, грубо говоря "отказ в обслуживании", сервер вываливается, вплоть до невозможности зайти терминалом.

 

На втором сервере, абсолютно не специализированном на Коре2Дуо, и PCI сетевых, нагрузка распределяется одинаково по ядрам :)))

Share this post


Link to post
Share on other sites

Поставил последний выпущенный драйвер 2011 вместо OEM от IBM 2009 посмотрим... чего сегодня будет...

Share this post


Link to post
Share on other sites

Вот чего нарыл только понять не могу мой ли это случай?

 

Настраиваем RSS в Windows

Аббревиатура RSS обычно ассоциируется совсем с другим, нежели с настройкой TCP. Хотя, в общем, это у всех по-разному – кто-то PHP с ходу расшифровывает как Penultimate Hop Popping, а кто-то думает, что КВД – это НКВД без первой буквы. Все люди разные. Мы будем говорить про тот RSS, который Receive Side Scaling

 

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

 

Суть-то простая, да вот в реализации столько тонкостей, что можно написать отдельную статью. Пока это не является целью, поэтому постараюсь описать оные тонкости сжато и компактно

 

Для начала необходимо, чтобы сетевая карта умела формировать вышеупомянутые очереди, и умела делать это хорошо. По сути, эта задача требует от сетевой карты функционала, отдалённо напоминающего CEF (который Cisco Express Forwarding) – коммутации 3го уровня с определением и разделением отдельных потоков пакетов. Давайте попробуем разобраться на примере, как и зачем это может работать.

 

Допустим, у Вас есть быстрый сетевой адаптер (например, 10Гбит), и по нему к Вам приходит много данных. И эти данные хорошо разделяются на много потоков (например, когда мы ведём вебинары, на каждого слушателя идёт почти по десятку TCP-сессий, а слушателей бывает и 40). По сути, все эти потоки данных выглядят потоками только на транспортном уровне, а на сетевом сливаются в общий поток. Это, в общем, и есть работа протоколов транспортного уровня – мультиплексировать потоки данных от различных приложений на различных хостах. Но от этого нашей принимающей стороне не легче – ведь ей надо из входящего потока сформировать:

 

Отдельные сессии TCP – т.е. для каждой поддерживать session state, буферы данных, состояние cwnd/rwnd, состояние sack’ов и ack’ов вообще

Отдельные буферы для каждого фрагментированного IP-пакета

Отдельные очереди (ведь трафик может обладать приоритетами)

И практически каждое событие во всей этой пачке сессий – это вызов прерывания и его обработка. Крайне затратно, особенно учитывая, допустим, негативный сценарий (10 гигабит поток, ip-пакеты по 1КБ). Можно даже сказать проще – ощутимое количество процентов мощности процессора (весьма дорогого, заметим) уйдёт на решение этих задач тех.обслуживания. Как с этим бороться? Да просто – пусть адаптер формирует отдельные очереди пакетов – тогда на каждую из них можно “привязать” свой процессор/ядро, и нагрузка в плане прерываний и прочего распределится. Но тут нас поджидает неочевидная проблема.

 

Дело в том, что просто так распределить не получится. Т.е. если мы придумаем очень простой критерий распределения (например, две очереди, четные пакеты – налево, нечетные – направо), то у нас может получиться следующая ситуация – у потоков данных часть пакетов попадёт в “четную” очередь, а часть – в “нечетную”. А в этом случае мы потеряем все возможные бонусы, возникающие при обработке непрерывного потока пакетов (обычно эти бонусы выглядят как “первый пакет обрабатываем по-полной, кэшируем все возможные результаты обработки, и все последующие пакеты обрабатываем по аналогии”). Т.е. нам надо всячески избегать ситуации, когда одному процессору придётся, обрабатывая, например, поток очень однотипных мультимедийных пакетов (какой-нибудь RTP например), пытаться “сбегать почитать” в соседнюю очередь. Скажем проще – никуда он вообще бегать тогда не будет, а придётся тогда нам выключать всяческие ускорения обработки TCP/UDP/IP-потоков, потому что работать они будут только в случае ситуации, когда весь поток однотипных пакетов обрабатывается одним ядром/процессором. А это приведёт к тому, что на процессоры придётся переводить вообще всю нагрузку по обработке сетевых данных, что с гарантией “убьёт” даже достаточно мощный CPU.

 

То есть, наша задача-максимум – это распределить входящие данные по нескольким отдельным очередям приёма, да так, чтобы потоки пакетов легли в очереди “целиком”, да и ещё желательно, чтобы заполнились эти очереди равномерно. Тогда мы и распределим нагрузку по процессорным ядрам, и не потеряем другие возможности по ускорению обработки потоков пакетов. Для решения этой задачи нам надо будет действовать сообща – и ОС, и оборудованию.

 

Хороший RSS начинается с сетевой карты. В сетевых картах, которые умеют RSS (а уже понятно, что это не карты минимального уровня), такой функционал есть – например в очень даже недорогой Intel 82576 (в моём случае – встроена в сервер) есть функционал и включения RSS сразу, и выбора количества очередей – 1, 2, 4 или 8.

 

Почему же количество очередей RSS будет выбираться из целочисленных степеней двойки? Тут начинается интересное, что будет роднить логику работы RSS и, допустим, логику балансировки у etherchannel.

 

Примечание: Разные реализации RSS используют разную логику, поэтому тут рассматривается достаточно распространённый вариант

 

Дело в том, что для того, чтобы определить “принадлежность” пакета к потоку, RSS использует следующую логику – берутся несколько ключевых полей пакета – SRC IP, DST IP, код протокола L4, SRC PORT, DST PORT – и от них вычисляется хэш, по последним битам которого (соответственно, для 2х очередей достаточно и одного бита, для 4х – двух, для 8 – трёх) и определяется принадлежность пакета к буферу. Соответственно, пакеты одного протокола, идущие с одного фиксированного порта и IP-адреса на другой адрес и порт, будут формировать поток и попадать в одну очередь. Такой подход достаточно быстр и прост с точки зрения балансировщика, но, как понятно, никак не решает ситуацию “Есть два стула две TCP-сессии – одна 1% канала занимает, другая 99%”. И даже не гарантирует, что обе эти сессии не попадут (с вероятностью 1/2) в одну и ту же очередь, что вообще превратит всю задачу в бессмыслицу.

 

Поэтому, в общем-то, остановимся на следующем факте – если у сетевой карты есть поддержка RSS, то её надо как минимум включить, чтобы первичное разделение входящего трафика на несколько очередей, притом с сохранением потоков, происходило без участия CPU.

 

Ну а вот дальше – уже задача операционной системы – что есть не один, а несколько потоков, и на каждый надо выделить свой процессор или ядро. Это как раз и будет тот самый RSS, который мы будем включать. Он уже будет создавать в драйвере NDIS отдельные очереди и выделять на каждую из них по процессору/ядру.

 

Нововведением в Windows Server 2008 R2 является то, что этим можно управлять – правда, только через реестр. В частности, управлению будут поддаваться 2 параметра – стартовое количество процессорных ядер, выделяемое для всех RSS-очередей на адаптере, и максимальное количество ядер для данной задачи. Параметры эти будут находиться по адресу HKLM\SYSTEM\CurrentControlSet\Control\Class\гуид сетевого адаптера\номер сетевого адаптера\ и называться, соответственно, *RssBaseProcNumber и *MaxRSSProcessors.

 

Примечание: Звёздочка в начале – не опечатка, так и надо вводить. Параметры, как понятно, 32bit DWORD.

 

Примечание: У RSS в Windows Server 2008 R2 есть негативный момент – распределение потоков идёт только между ядрами без HT/SMT. То есть на процессорах с Hyper Threading делите количество доступных ядер пополам.

 

Пример использования данных параметров – допустим, у Вас есть сервер с 16 ядрами (2 процессора по 8 ядер или 4 по 4 – не суть). Есть три сетевых адаптера – один используется для управления системой, два других – для привязки к ним виртуальных машин. Вы можете выставить указанные параметры только у двух интерфейсов, на которых будет подразумеваться высокая нагрузка, притом следующим образом – поставить RssBaseProcNumber равным 2, а MaxRSSProcessors – например, 12. Тогда тот интерфейс, который будет активнее принимать трафик, сможет “отъесть” до 12 ядер системы на обработку очередей, при этом не надо будет жестко задавать этот параметр вручную (это удобно, если нагрузка переместится на другой интерфейс). Безусловно, в этом примере надо, чтобы сетевые адаптеры тоже поддерживали RSS, и, желательно, хотя бы очередей 8.

 

Подводя итоги – RSS – это достаточно практичная и нужная технология, требующая поддержку и со стороны оборудования, и со стороны операционной системы. И становящаяся всё более актуальной, так как на данный момент скорости сетевых интерфейсов растут, равно как и количество процессорных ядер, а, следовательно, старый подход, когда одно ядро “разгребает” единую входящую очередь, становится всё менее эффективным.

 

КАК ВКЛЮЧИТЬ RSS В WINDOWS

netsh interface tcp set global rss=enabled

Share this post


Link to post
Share on other sites

Всё разобрался :((( Бери после этого проф-сервера :(((( Проблема в Броадкомовских сетевых и не у одного меня, решения нет: http://forum.sysinternals.com/hardware-interrupts-high-cpu-windows-server-2003_topic19178.html

 

Вот ради прикола завтра поставлю USB сетевую карту и буду долго смеяться если поможет.

 

Почитал ещё у буржуев, отключил: Interrupt Moderation, вроде как полегче стало.

Edited by Pritorius

Share this post


Link to post
Share on other sites

ахренеть.. весь форум о распределении нагрузки по процам в линухе , а тут на те )) Вынь2003 )

Ты бы еще ISA сетевую втулил туда..

Ставь линукс и все будет распределятся.

Share this post


Link to post
Share on other sites

ахренеть.. весь форум о распределении нагрузки по процам в линухе , а тут на те )) Вынь2003 )

Ты бы еще ISA сетевую втулил туда..

Ставь линукс и все будет распределятся.

 

Читайте между строк, проблема не в винде, а в сетевых.

 

Вот вам для общего развития: http://www.google.ru/search?hl=ru&newwindow=1&tbo=d&spell=1&q=hardware+interrupt+broadcom&sa=X&ei=q1gAUbDhG9SGswb-n4GwAQ&ved=0CC4QvwUoAA

 

У линуксойдов та же беда.

Share this post


Link to post
Share on other sites

ахренеть.. весь форум о распределении нагрузки по процам в линухе , а тут на те )) Вынь2003 )

Ты бы еще ISA сетевую втулил туда..

Ставь линукс и все будет распределятся.

 

Читайте между строк, проблема не в винде, а в сетевых.

 

Вот вам для общего развития: http://www.google.ru/search?hl=ru&newwindow=1&tbo=d&spell=1&q=hardware+interrupt+broadcom&sa=X&ei=q1gAUbDhG9SGswb-n4GwAQ&ved=0CC4QvwUoAA

 

У линуксойдов та же беда.

 

Не встречал ситуацию когда в линуксе нельзя было гвоздем прибить сетевку к ядру.

По ссылке первые линки - о винде, дальше не читал.

Share this post


Link to post
Share on other sites

софт роутер (NAT) на Win2003

Какой винтаж. Я уж думал, что в прошлое попал, когда народ любил на венде роутеры строить.

Не, я понимаю что раз на винде - значит так надо, но просто сам факт роутера на винде заставляет вспомнить старые срачи топики.

Share this post


Link to post
Share on other sites

Тут первое правило программиста работает: работает некуй лезти :)

 

Тем более за столько лет обросло всё своим API билингом. Сервак IBM xSeries тоже пашит как часики, только вот со временем трабл с сетевушками вылез :(

Share this post


Link to post
Share on other sites

Кстати вопрос кто курил: Двухпортовый интегрированный Gigabit Ethernet (10/100/1000Мбит) Intel® 82579LM и 82574L интересно стало почему на двух разных чипах сделана интегрированная сетевая, и не будет ли с ней траблов как броадкомом :)

Share this post


Link to post
Share on other sites

почему на двух разных чипах сделана интегрированная сетевая

Ставим вместо чуть более дорогого чипа чуть более дешевый и можем продавать мамку с 2-мя сетевушками не сильно задирая ее в цене?

 

 

не будет ли с ней траблов как броадкомом

Таки это интел - он всяко получше броадкома.

ЕМНИМС меня вроде такие сетевушки стояли на каком-то серваке - тогда все нормально работало, а щас и посмотреть то уже негде и нечего.

Share this post


Link to post
Share on other sites

Просто вот этот конструктор заюзать, уж очень корпус мне нравится размером с коммутатор :) Шикарный софтроутер получится на E3 Xeon(е) :)

 

Этот корпус и Супермикро и Депо и Асус юзают.

 

Таки это интел - он всяко получше броадкома.

 

Ого... до недавнего дня у меня было противоположное мнение :))))

post-50142-054851300 1359029872_thumb.jpg

Share this post


Link to post
Share on other sites

А сколько по вашему ядер должен утилизировать NAT?

Все ведь верно, на одном интерфейсе тупой роутинг - загрузка 10-20% прерываниями и фаерволом. На втором - NAT, 100% на одно ядро и вылезает. Замена сетевок на аналогичный Intel НЕ ПОМОЖЕТ, да и сетевки броадкомовские далеко не худшие.

Поможет установка нескольких карт в team(aka bonding), либо установка карты умеющей RSS(82576 описан вами же выше).

Share this post


Link to post
Share on other sites

В супермикровских ксеонах, которые идут в таких корпусах, стоит такое:

 

em0@pci0:0:25:0:        class=0x020000 card=0x150215d9 chip=0x15028086 rev=0x05 hdr=0x00
   vendor     = 'Intel Corporation'
   device     = '82579LM Gigabit Network Connection'
   class      = network
   subclass   = ethernet

...

em1@pci0:2:0:0: class=0x020000 card=0x000015d9 chip=0x10d38086 rev=0x00 hdr=0x00
   vendor     = 'Intel Corporation'
   device     = '82574L Gigabit Network Connection'
   class      = network
   subclass   = ethernet

 

Вот тока память туда проблематично найти, чтобы по максимуму набить (8Г без проблем, а вот максимум - уже сложно) :(

Share this post


Link to post
Share on other sites

В супермикровских ксеонах, которые идут в таких корпусах, стоит такое:

 

em0@pci0:0:25:0:        class=0x020000 card=0x150215d9 chip=0x15028086 rev=0x05 hdr=0x00
   vendor     = 'Intel Corporation'
   device     = '82579LM Gigabit Network Connection'
   class      = network
   subclass   = ethernet

...

em1@pci0:2:0:0: class=0x020000 card=0x000015d9 chip=0x10d38086 rev=0x00 hdr=0x00
   vendor     = 'Intel Corporation'
   device     = '82574L Gigabit Network Connection'
   class      = network
   subclass   = ethernet

 

Вот тока память туда проблематично найти, чтобы по максимуму набить (8Г без проблем, а вот максимум - уже сложно) :(

 

А зачем роутеру память? Я планировал 4 гига... не больше? И то из практики основную память веб-сервер жрёт.

 

А сколько по вашему ядер должен утилизировать NAT?

Все ведь верно, на одном интерфейсе тупой роутинг - загрузка 10-20% прерываниями и фаерволом. На втором - NAT, 100% на одно ядро и вылезает. Замена сетевок на аналогичный Intel НЕ ПОМОЖЕТ, да и сетевки броадкомовские далеко не худшие.

Поможет установка нескольких карт в team(aka bonding), либо установка карты умеющей RSS(82576 описан вами же выше).

 

Я же написал у меня два пуля в пулю сервера, только один проф ИБМ на броадкомоских, а второй обычная башня с интегрированной Реалтеком и PCI нонейм... нагрузка распределяется на два ядра... а на ИБМ не в какую.

 

Про RSS уже понял, на мои броадкомах его поддержки нет... в любом случае думаю менять сервер.

Share this post


Link to post
Share on other sites

Тут всётаки удалось давече сбить температуру у пациента :) Только теперь проблема, где взять файрволл с поддержкой встроенного NAT. Который бы понимал пришёл трафик на NAT для трансляции или на приложения самого сервера.

 

На данный момент оставили сервер без защиты на внешнем интерфейсе :( Зато нагрузка на ядро 5-10 процентов :)

Share this post


Link to post
Share on other sites

Просто вот этот конструктор заюзать, уж очень корпус мне нравится размером с коммутатор :) Шикарный софтроутер получится на E3 Xeon(е) :)

Этот корпус и Супермикро и Депо и Асус юзают.

Несколько месяцев назад стали брать такие платформы, потому что достало с рельсами возиться у того же Asus. E3-1240v2 прекрасно в таком живет. Сетевку дополнительно доставляем на борт, а в качестве харда бюджетный SSD на 32Гб (работает как флешка для загрузки ОС).

Share this post


Link to post
Share on other sites

Вот тока память туда проблематично найти, чтобы по максимуму набить (8Г без проблем, а вот максимум - уже сложно) :(

А зачем столько памяти? Я бы вообще 2 Гб ставил, но планки по 1 Гб сложнее найти, чем по 2 Гб, поэтому приходится ставить 4 Гб.

Share this post


Link to post
Share on other sites

Просто вот этот конструктор заюзать, уж очень корпус мне нравится размером с коммутатор :) Шикарный софтроутер получится на E3 Xeon(е) :)

Этот корпус и Супермикро и Депо и Асус юзают.

Несколько месяцев назад стали брать такие платформы, потому что достало с рельсами возиться у того же Asus. E3-1240v2 прекрасно в таком живет. Сетевку дополнительно доставляем на борт, а в качестве харда бюджетный SSD на 32Гб (работает как флешка для загрузки ОС).

 

Дай вам бог здоровья :) Всё ждал отзывов, подскажите где берёте, можно в личку?

 

Зачем ещё сетевую ставите? Для Менеджмента?

Share this post


Link to post
Share on other sites

Дай вам бог здоровья :) Всё ждал отзывов, подскажите где берёте, можно в личку?

 

Зачем ещё сетевую ставите? Для Менеджмента?

 

Встроенные говно ибо (они как раз только для менеджмента и слива трафика в коллектор и годятся) ... а мне надо как минимум по 4 очереди поднимать на сетевке, потому что сервак через себя прокидывает 1.5 Гбит в одну сторону и 1 Гбит в другую. Приходится ставить i350T4 или 82576 4-х портовые.

 

Берем ... хм, где найдем, там и берем. Я на днях почти всю "нерезиновую" объехал и три штуки такие купил. Теперь либо за переплату либо 30 дней под заказ ждать, а мне еще таких 4 штуки надо.

 

Нормальная цена за такое изделие в "нерезиновой" около 13 т.р. Больше - переплата. Вот тут последние две забрал http://www.netshopping.ru/vcd-42164-1-66681/goodsinfo.html

Edited by replicant

Share this post


Link to post
Share on other sites

Дай вам бог здоровья :) Всё ждал отзывов, подскажите где берёте, можно в личку?

 

Зачем ещё сетевую ставите? Для Менеджмента?

Нормальная цена за такое изделие в "нерезиновой" около 13 т.р. Больше - переплата. Вот тут последние две забрал http://www.netshopping.ru/vcd-42164-1-66681/goodsinfo.html

 

Это цена я так понимаю без ЦПУ, HDD и Памяти? Сколько выходит набитый?

Share this post


Link to post
Share on other sites

Это цена я так понимаю без ЦПУ, HDD и Памяти? Сколько выходит набитый?

8 т.р. за ЦПУ типа E3-1240v2 (для минимального энергопотребления 22нм самое оно)

1.5 т.р. за SSD 32Гб

800 руб. за память DDR3-1600 ECC в планках по 2 Гб

 

Итого: в 25 т.р. легко вписывается (без доп. сетевой).

 

DEPO за такие деньги точно ничего аналогичного собрать в этом корпусе не сможет.

Edited by replicant

Share this post


Link to post
Share on other sites

зачем роутеру память?
А зачем столько памяти?

 

Таки эти ксеоны не вечно будут роутерами мпд серваками ;) Хочется на них и виртуалок наплодить и еще для чего нить заюзать, после того, как они РРРоЕ терминировать перестанут.

Share this post


Link to post
Share on other sites

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.