Большие потоки трафика и управление прерываниями в Windows

Мне очень понравился топик про распределение нагрузки от прерываний сетевого адаптера по процессорам, поэтому я решил описать как это делается в Windows.

Disclaimer: судя по некоторым комментариям в предыдущих постах, мне стоит повторить то, с чего я начал первый пост: я не даю (и не могу давать) общеприменимых рецептов. Особенно это касается производительности, где мельчайшая неучтенная деталь может катастрофически повлиять на результат. Вернее рекомендацию то я даю: ТЕСТИРОВАНИЕ И АНАЛИЗ. Смысл моей писанины в том, чтобы дать людям как можно больше информации для анализа, ведь, чем больше понимаешь в том, как что либо работает, тем легче находить пути устранения боттлнеков.

Итак, масштабируемость пропускной способности сети. Потребуется Windows Server 2003 SP2+. Сетевая карта, поддерживающая Receive Side Scaling (можно с достаточной долей уверенности сказать, что подойдет любая серверная сетевая карта, выпущенная в последние 5 лет или любая вообще 1Gb+ NIC, хотя частенько можно увидеть RSS и на 100Mb). Устанавливаем Windows Server и драйвера на карту…


ВСЕ. Настройка завершена. RSS по умолчанию включен во всех версиях Windows, в которых он поддерживается.

Тестирование


Возьмем не особо новый Dell-овый сервер с двумя четырехядерными ксеонами:


На борту две двухпортовые 1Gb сетевые карты и одна 10Gb, но я не нашел 10Gb свитча, так что завести не удалось — ну да ладно:


Что интересно в этих картах, так это то, что несмотря на поддержку RSS в 8 очередей, они не поддерживают ни MSI-X ни даже MSI. Более того, из четырех доступных линий pin-based прерываний на каждый сетевой порт отведена только одна (соответственно никакими способами заставить прерывания приходить на разные процессоры уже нельзя — это аппаратное ограничение данной конфигурации). 10 гигабитка зарегистрировала на себя то ли 32 то ли 64 (на глаз) вектора прерываний, но ее использовать — не судьба. Сможет ли индусская поделка для запуска игр справиться с задачей?


На всякий случай проверяем RSS (хотя если его не будет — будет заметно и так):


Для начала выключим RSS (включал обратно я уже после тестирования, но том же окне)


и запустим нагрузочный тест:
Полностью загружены два ядра, все остальные простаивают


Сеть загружена на треть:


50% одного процессора забито обработакой прерываний, еще 20% того же процессора — обработка DPC. Остальное — tcpip стек и приложение, которое отдает трафик.


Включаем RSS (скриншот выше). Процессор:


Сеть:


Треть одного процессора забита прерываниями, но DPC отлично распараллелены.


В общем, на данной конфигурации можно было бы отдавать порядка 3 гигабит (с одной сетевой карты) и только тогда мы бы встретили бутылочное горлышко.

На всякий случай, скажу, что у RSS есть менее известный родственник — Send Side Scaling. Если перед посылкой списка буферов выставить значение хеша, то прерывание после завершения посылки будет доставлено в соответствии с установленными indirection table-ами.

Вот здесь можно почитать про RSS, а здесь есть неплохая презентация в картинках поясняющая работу RSS. Если интересно, могу попробовать своими словами описать механизмы работы RSS, но как по мне — лучше читать первоисточники.

TCP Offload Engine


Если нечто подобное RSS в Linux вот-вот появится (не нашел никаких упоминаний о поддержке нормального аппаратного RSS в Linux: кто знает — дайте ссылку — проапдейчу пост). То с TOE в Linux все официально сложно. Патч от Chelsio (один из производителей high-end сетевых карт), реализующий поддержку TOE, был отклонен, а вместо этого начались какие то совершенно идиотские отмазки (при прочтении стоит иметь в виду, что BSD и Windows имеют нормальную поддержку TOE уже много лет).

Итак, что же это такое? TOE — это полная реализация TCPIP на аппаратном уровне: с подтверждением доставки, ретрансмитами при ошибках, контролем окна и пр.: сетевая карта по DMA прямо из памяти берет данные, режет на пакеты, присоединяет хедеры, а рапортует (при помощи прерываний) только в самых крайних случаях.

По умолчанию TOE стоит в automatic режиме. Смотреть Chimney Offload State:


Скриншот снимался во время активного тестирования, но в статистике видно, что ни одного «выгруженного» в сетевую карту соединения нет (о причинах позже). Включем принудительно (и через некоторое время запрашиваем статистику):


А вот и причина: в данную сетевую карту можно выгрузить только 1024 соединения (но реально система смогла выгрузить 1022). Довольно дорогой ресурс, чтоб можно было выгружать все подряд. Система эвристически пытается обнаруживать соединения (get/put больших файлов по http, пересылка файлового контента на файл-серверах и т.п.), которые проживут долго и выгружает в первую очередь их.

Но все же глянем, что получилось. Процессор разгрузился втрое:


Очень сильно уменьшилось количество (и время проводимое в) как ISR так и DPC:
+79
17 ноября 2010, 10:12
88
amirul 214,3

комментарии (35)

+3
InG0d #
Было бы интересно увидеть ваше описание механизма работы RSS, не все хорошо владеют английским.
+1
mitnlag #
учите. пригодится.
+1
amirul #
Ну я наверное все равно напишу, но попозже — это все ж таки отнимает приличное количество времени.
0
mazy #
Спасибо. очень интересно.
+1
theurs #
кто нибудь из провайдеров использует вин серверы?
+2
bondbig #
я как-то жил в Апрелевке, там был один такой. Пара тысяч абонентов (по моим прикидкам), вин-сервер и ТрафикИнспектор на нем. Я даж как-то админа по телефону консультировал ) Позвонил в саппорт, когда не работал инет, в итоге я рассказывал ему, как настраивать RRAS на пул публичных адресов для NAT
0
bondbig #
вот он, кстати: ultra-telecom.ru
Хочется верить что с тех пор у них всё по-другому. То был 2008-й год.
0
Halt #
<шутка>А потом вам счет за поддержку прислали?</шутка>

А вообще хорошо, когда удается достучаться. А то еще самого же идиотом обзовут
+1
bondbig #
Не, мне скорость на безлимите увеличили вдвое в награду и выдали айпишник публичный )
Ну и на работу звали потом, этот админ оказался еще и гендиром по совместительству ) Увы, денег мало предлагал.
+2
Sallaxer #
Видно сразу — человек гордиться профессией. Другой бы сказал, что ген.дир. по-совместительству админ, а тут наоборот )))
0
4dmonster #
Заранее прошу прощения за некий оффтопик, но хочется спросить у сведущего человека:

Я несколько раз встречал заявления о том, что стек TCP/IP у винды взят почти полностью у BSD (благо лицензия позволяет). Насколько это соответствует действительности?
+6
amirul #
Здесь подробно изложено.
Временная реализация, лицензированная у Spider Systems была основана (частично или полностью) на BSD. Пока она трудилась над доставкой TCP приложениям, Microsoft работал над собственной реализацией TCP/IP, которая была включена в NT3.5, а временный код был выброшен.
0
4dmonster #
Спасибо большое. Всё по полочкам разложено.

Там ещё из интересного упоминания что благодаря подходящей лицензии: утилиты переписанные с БСД сокетов на Вин сокеты — скорее всего так и остались БСДшными, для совместимости со STREAMS (которые вроде никому не нужны) могли оставить чуток БСД кода.
0
Dyr #
Кстати, в разработке файервола для Windows XP принимал участие главный разработчик фряшного ipfw.
0
merlin_rterm #
кстати ipfw есть и портированный под windows — wipfw
+8
digreen #
Мне одному теперь кажется, что среди виндузятников тоже есть сови красноглазики?
Amirul, не обижайтесь, это реально комплимент -) Спасибо за статьи.
+4
Halt #
Красноглазие не зависит от используемых инструментов. Это, если желаете, состояние души :)
+2
Dyr #
Состояние глаз )
+2
MAXH0 #
Вот такие холивары я люблю.
Хотелось бы еще сравнение на равном железе, под равной нагрузкой.
+1
amirul #
Linux я «готовить не умею» — так что в моих руках он гарантированно покажет худший результат :-)
Можно на tpc.org посмотреть или вот на spec.org как раз вебсерверы (но там реалистичные сценарии, а не network-bound статика как у меня)
0
amirul #
На SPEC IIS не представлен. Ну можно дать мне фору и тестить в дефолтных настройках :-)
0
untitledds #
Я бы все же не советовал включать данные фичи бездумно (а лучше их все-таки выключать). Вот хотя бы из-за этого:
support.microsoft.com/kb/948496
support.microsoft.com/kb/949234
+1
amirul #
Естественно. Тестировать надо. С другой стороны это было в 2k3 сервере. Там как бы NDIS5.2, который не то чтобы совсем нативно поддерживает RSS и TOE.

Вообще, думается, дефолтные настройки вполне безопасны. Протестированы на миллионах инсталляций и сценариев.
0
amc #
У нас неоднократно были случаи некорректной работы ТОЕ на 2003 сервере, вычислялось элементарно, по плавающей скорости работы с файлами и плавающими ошибками сети, после чего запускался Ethereal на котором было видно кучу ретрансмитов. Отключали оффлоад — всё работает вообще без нареканий.
Так что опасного, по дефолту, действительно нет.
+1
amirul #
Ретрансмиты после того, как соединение уже выгружено, это похоже проблема железа (ОС там не особо на что то влияет между upload-ом соедиинения и download-ом его обратно). И здесь два варианта: либо Вам «повезло» с этой конкретной железкой либо это дефект всей серии (вон у меня ноут — hp dv9000, если интересно — как то сгорел к чертям из-за неверно спроектированного теплоотвода — это не повод перестать пользоваться ноутами вообще).
0
amc #
Наблюдалось и на бренд-серверах (HP DL380 G4, Broadcom Gigaчётотам, к примеру) и на машинках из обычных десктопных комплектующих (сетевые — всё что встраивают, Марвел, Атерос, Реалтек).
В общем никогда в этот вопрос сильно не углублялись, не стоило оно того.
+1
amirul #
Если на нескольких серверах — это да, могла быть вся партия такой. С другой стороны, правильно ли я понимаю, что речь идет о достаточно давнем времени?
0
amc #
Да, давнее время (2006-2008, отдельные эпизоды иногда и сейчас). Ещё раз уточню что машины совсем разные, в разных организациях, так что не в партии дело, а просто в не дружбе TOE (в отдельных случаях) и Checksumm offload (в большинстве случаев) с некоторыми другими устройствами.
0
amirul #
Ну не знаю, вот на той железке, что тестил я, даже под стрессовой нагрузкой было меньше процента ретрансмитов и тысячные доли процента ошибок, да и сам тест не показал особого увеличения количества ошибок. Chimney offload «придумали» в 2005-м году, в общем не очень удивительно, что девайсы глючили в 2006-м. В любом случае, загрузить несколько 10Gb карт без TOE достаточно проблематично, технология будет вылизываться, а скорости — расти. Так что вряд ли она куда нибудь денется в обозримом будущем (разве что будет заменена на что нибудь более продвинутое).
0
untitledds #
Насколько мне известно, ошибка появляется и в windows 7
+1
amirul #
Ну у меня на работе несколько Win7 машин. Надо уточнить, думаю там есть RSS, но вряд ли есть TOE. Я постоянно коннекчусь по RDP (в том числе и к серверам с TOE/RSS), постоянно использую Outlook, постоянно коннекчу машины друг к другу — проблем не наблюдал (но это мой личный опыт — он может и не значить ничего). Да и в тех KB написано, что МОГУТ быть проблемы и в prerequisites указан 2k3 server sp2.
0
Igg #
>>На борту две двухпортовые 1Gb сетевые карты и одна 10Gb, но я не нашел 10Gb свитча

И куда здесь можно отдать 3Gb?
+1
bondbig #
две двухпортовые можно объединить, будет 4Gbit/s.
0
amirul #
Если их объединить, то у них на всех будет 4 линии прерываний, которые пойдут на разные процессоры. Я имел в виду, как правильно сказали ниже, что даже у сетевой карты с одной линией прерываний (и, как следствие, невозможностью лоадбалансить прерывания по разным процессорам), есть почти троекратный запас по пропускной способности самого узкого места (в данном случае пропускной способности процессора, обрабатывающего прерывания).
+1
009b #
он говорил не о своём железе, а о загрузке процессора на обработку.
включил фичу — загрузка упала, гигабит отдается полностью. померили загрузку и прикинули, сколько бы мы смогли отдавать… чтобы загрузить это место по полной.

не факт, что это действительно насущное для автора поста.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.