Чи можливо обробляти мільйони дейтаграм в секунду за допомогою Windows?


11

Я розслідую, чи можу я застосувати додаток HPC в Windows, який отримує невеликі дейтаграми багатоадресної передачі UDP (в основному 100-400 байт), використовуючи десяток або до, можливо, 200 багатоадресних груп (тобто за допомогою MSI-X і RSS я можу масштаб до декількох ядер), виконує деяку обробку на пакет, а потім відправляє його. Надсилання через TCP мені вдалося піднятися настільки, наскільки мені потрібно (6,4 Гбіт / сек), не вдарившись про стіну, але отримання дейтаграм з високою швидкістю pps виявилося проблемою.

Під час нещодавнього тестування на високошвидкісному апараті NUMA з 2-портовим 10Gb Ethernet NIC для Windows 2012 R2 мені вдалося отримати лише сотні тисяч дейтаграм UDP в секунду (раннє падіння, тобто без фактичної обробки даних, до видалити обробки накладних витрат мого програми з рівняння , щоб побачити , наскільки швидко він отримує) , використовуючи 2x12 ядра, а ядро частина 12 багатоадресних груп випробувані , здавалося, отримати розподілені по 8 або 10 ядер одного NUMA вузла ( Max RSS черзі був набір до 16) - хоч і з додатком .net, тому рідні програми повинні мати можливість працювати швидше.

Але навіть Лен Холгейт у своїх високоефективних тестах Windows RIO отримав лише пакети UDP зі швидкістю 500 кп / с , використовуючи навантаження UDP у 1024 байти.

У посібнику QLogic (в тесті ОС не згадується) обмеження для "багатопотокової маршрутизації супермалих пакетів" (так, що включає в себе як отримання, так і подальше відправлення?) Встановлено в 5,7 Мп / с . У статтях про мережу Linux ліміти встановлюються від 1 Мпс до 2 Мп / с на ядро ​​(як повідомляється, масштабування більш-менш лінійно) або навіть 15 Мп / с за допомогою спеціальних рішень, які обходять ядро.

Наприклад, мережна карта

може генерувати трафік за лінійною швидкістю ( 14,88Mpps ) на каналі 10GigE лише з одним ядром, що працює на частоті 900 МГц. Це дорівнює приблизно 60-65 тактовим циклам на пакет, і добре масштабує ядра та тактову частоту (з 4 ядрами, швидкість передачі ліній досягається менше 450 МГц). Аналогічні ставки досягаються на стороні отримання .

Тож як далеко я можу взяти (останні версії) Windows / Windows Server, зокрема отримувати UDP багатоадресну передачу, як описано у провідному параграфі?

Редагувати Існує хмарна публікація блогу - і цікавий розділ коментарів - як це зробити в Linux: Як отримати мільйон пакетів в секунду , і там є відповідна сторінка коментарів новин хакера .


@Ramhound Теоретично це можливо, в Windows. Але як це можливо на практиці? На даний момент я натрапив на досить багато звітів від людей, які досягають таких рівнів в Linux на стандартному апаратному забезпеченні, але жоден з них не наближається до Windows. І як ви думаєте, як я міг би зменшити обсяг питання? Просто так: "Які найвищі показники прийому багатоадресної передачі UDP у Windows?". Основна частина тексту мого запитання - це лише приклади, які повинні показати, що це можливо з Linux - і що я зробив домашнє завдання.
Євген Бересовський

@Ramhound 'Якщо можливо в Linux, то можливо і в Windows'. Я відповідно не погоджуюся .. однією системою, яка миттєво приходить в голову, є iptables .. так, удача, імітуючи цю систему на Windows. ^ _ ^
NiCk Newman

Я насправді не намагався так сильно, тому ви завжди можете взяти весь код, який я маю для тестування RIO, який я зробив, і продовжувати натискання.
Лен Холгейт

Відповіді:


5

За даними Microsoft, тести в їхній лабораторії показали, що "на конкретному сервері на ранньому тестуванні" RIO вони змогли впоратися

  • 2Mpps без втрат у Windows Server 2008R2, тобто без RIO
  • 4Mpps на (попередній випуск) Windows Server 8 за допомогою RIO

Знімок екрана з цього відео (44:33):

введіть тут опис зображення

Тож відповідь на моє запитання Is it possible to process millions of datagrams per second with Windows?буде: Так , і, мабуть, це було ще до RIO, в Windows Server 2008R2.

Але на додаток до офіційних даних, особливо щодо неопублікованого програмного забезпечення, яке потрібно брати з дрібкою солі, лише з рідкою інформацією, наведеною в цій презентації, залишається багато питань щодо тесту, а отже, як правильно інтерпретувати результати. Найбільш релевантні:

  1. Чи є цифри для надсилання? Прийом? Або, можливо, для маршрутизації (тобто отримувати + відправляти)?
  2. Який розмір пакету? -> Мабуть, найнижчий з можливих, як це робиться, як правило, під час спроби змусити фігури pps похвалитися
  3. Скільки з'єднань (якщо TCP) / пакетів потоків (якщо UDP) ? -> Напевно, стільки, скільки потрібно для розподілу навантаження, щоб можна було використовувати всі наявні ядра
  4. Що налаштування тесту? Характеристики машин та NIC та електропроводка

Перший є вирішальним, тому що для надсилання та отримання потрібні різні кроки та можуть бути істотні відмінності у продуктивності. Для інших фігур, ймовірно, можна припустити, що найнижчий розмір пакету, щонайменше, один з'єднання / потік пакета на ядро, використовувався на високоспецифічній машині, щоб отримати максимально можливі показники Mpps.


Редагування Я просто натрапив на документ Intel про високопродуктивну обробку пакетів в Linux, і відповідно до цього (Linux)

платформа може підтримувати швидкість транзакцій близько 2 млн транзакцій в секунду

використовуючи стандартний стек Linux (на фізичному хості з 2x8 ядрами). Трансакція в цьому тесті запиту / відповіді включає обидва

  1. прийом пакету UDP
  2. подальше пересилання цього пакету

(використовуючи netserf netperf). Тест проводив паралельно 100 транзакцій. У статті є багато деталей для тих, хто цікавиться. Я хотів би, щоб у нас було щось подібне для Windows для порівняння ... У будь-якому випадку, ось найрелевантніший графік для цього тесту на запит / відповідь:

введіть тут опис зображення


2

тл; д-р

Щоб дати чітку відповідь, здається, що потрібно більше тестів. Але непрямі дані свідчать про те, що Linux використовується ОС практично виключно у спільноті надмірних затримок, яка також регулярно обробляє завантаження Mpps. Це не означає, що це неможливо з Windows, але Windows, ймовірно, відставатиме зовсім небагато, навіть якщо можливо досягти числа Mpps. Але для цього потрібно встановити тестування і, наприклад, розібратися, за яку вартість (ЦП) ці цифри можна досягти.

NB: Це не відповідь, яку я маю намір прийняти. Він покликаний дати кожному, хто зацікавлений у відповіді на запитання, деякі підказки про те, де ми стоїмо та де далі розслідувати.


Лен Холгейт, який, за словами google, здається, єдиний, хто перевірив RIO для отримання більшої продуктивності в мережі Windows (і опублікував результати), просто пояснив у коментарі до свого блогу, що він використовує єдину комбо IP / Port для надсилання пакетів UDP.

Іншими словами, його результати повинні бути дещо порівняними з показниками однієї основної в тестах на Linux (хоча він використовує 8 потоків - що, ще не перевіривши його код, здається шкідливим для продуктивності під час обробки лише одного потоку пакетів UDP, а не роблячи будь-яку важку обробку пакетів, і він зазначає, що фактично використовуються лише декілька потоків, що мало б сенс). Це незважаючи на те, що він сказав:

Я не дуже намагався досягти максимальної продуктивності просто для порівняння відносної продуктивності між старими та новими API, тому я не був таким ретельним у своєму тестуванні.

Але що відмовляється від (відносної) зони комфорту стандартного IOCP для більш грубого світу RIO, окрім як «дуже старатися»? Принаймні, що стосується одного потоку пакетів UDP.

Я здогадуюсь, що він має на увазі - як він намагався виконати різні підходи до дизайну в декількох тестах RIO - це те, що він, наприклад, не налаштовував налаштування NIC, щоб видалити останній шматочок продуктивності. Що, наприклад, у випадку розміру буфера отримання, потенційно може мати величезний позитивний вплив на показники продуктивності прийому та втрати пакетів.

Проблема, проте, намагаючись безпосередньо порівняти його результати з результатами інших тестів Linux / Unix / BSD, полягає в наступному: Більшість тестів, намагаючись просунути межу "пакетів на секунду", використовують найменший можливий розмір пакета / кадру, тобто Ethernet кадр з 64 байт. Лен перевірив 1024 байт-пакети (-> кадр 1070 байт), який (особливо для UDP No-Nagle) може отримати вам набагато більші цифри "біт на секунду", але може не підштовхувати межу pps, наскільки це можливо з меншими пакетами . Тож було б справедливо порівнювати ці цифри як є.

Підбиваючи підсумки моїх пошуків роботи з UDP Windows, отримані результати:

  • Ніхто насправді не використовує Windows, намагаючись розробити наднизькі затримки та / або додатки з високою пропускною спроможністю, в наші дні вони використовують Linux
  • Практично всі тести та звіти про ефективність з фактичними результатами (тобто не просто рекламою товару) в наші дні працюють на Linux або BSD (дякую Лену за те, що він був першопрохідцем і що дав нам хоча б одну точку відліку!)
  • Чи UDP (стандартні сокети) в Windows швидше / повільніше, ніж у Linux? Я ще не можу сказати, мені доведеться робити власне тестування
  • Чи високопродуктивний UDP (RIO проти netmap) у Windows швидше / повільніше, ніж у Linux? Linux легко обробляє повну швидкість 10Gb з одноядерним процесором на 900 МГц, Windows, в кращому випадку опублікований , може отримати до 43% або 492kpps для великого розміру пакету UDP 1024, тобто цифри в секунду для менших розмірів, ймовірно, будуть значно гірше, хоча цифри pps, ймовірно, зростуть (якщо обмежуючий фактор не буде переривати обробку чи якийсь інший простір ядра).

Що стосується того, чому вони використовують Linux, це повинно бути, тому що розробка рішень, що передбачають зміни ядра, такі як netmap або RIO - необхідні, коли наповнюють продуктивність до меж - майже неможлива при закритій системі, як Windows, якщо ви не отримаєте ваші зарплати з Редмонда, або у вас є спеціальний контракт з Microsoft. Ось чому RIO - продукт MS.

Нарешті, лише для наведення декількох крайніх прикладів того, що я виявив, що відбувається і відбувається в Linux Linux:

Вже 15 років тому деякі отримували 680 кп / с, використовуючи процесор Pentium III з частотою 800 мГц, шиною 133 МГц на лицьовій стороні на 1GbE NIC. Редагувати : Вони використовували Click , маршрутизатор у режимі ядра, який обходить більшу частину стандартного мережевого стеку, тобто вони "обманювали".

У 2013 році Argon Design вдалося отримати

позначте затримки в торгівлі лише 35 секунд [наносекунд]

До того ж вони це стверджують

Переважна більшість існуючих сьогодні обчислювальних кодів для торгівлі написана для Linux на архітектурах процесорів x86.

та Аргон використовують перемикач Arista 7124FX , який (крім FPGA) має ОС

побудований поверх стандартного ядра Linux.


0

Вам неодмінно знадобляться "вимірювання" різних конфігурацій та сценаріїв. Це можна зробити AFAIK з двома передачами, наданими двома компаніями. IXIA та Spirent . Вони пропонують апаратні генератори трафіку, здатні перекачувати рух на швидкості лінії. Вони пропонують тест на рампі, де ви можете виявити швидкість, з якою ваша система може розвалитися. Пристрої дорогі, але їх можна взяти в оренду.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.