The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Оценка способности сетевого стека Linux обрабатывать миллион пакетов в секунду

17.06.2015 20:45

Марек Майковски (Marek Majkowski), разработчик ядра Linux, работающий в компании CloudFlare, провёл заслуживающий внимания эксперимент, пытаясь разобраться насколько быстр сетевой стек ядра Linux и возможно ли в Linux обеспечить работу пользовательского приложения, способного обработать миллион UDP-пакетов в секунду на обычном сервере с шестиядерным CPU Xeon (2GHz) и сетевой картой 10G.

В эксперименте применялась связка из программы для отправки данных, использующая вызов sendmmsg для отправки информации порциями по 1024 пакета за раз, и программы для приема данных, использующая системный вызов recvmmsg, более эффективный чем recv благодаря пакетной обработке данных.

Первый вариант приложения продемонстрировал производительность отправки данных в диапазоне от 197 до 350 тысяч пакетов в секунду. Непостоянство производительности объяснялось миграцией обработчиков между ядрами CPU. После жесткого закрепления программы за одним ядром CPU возросла эффективность кэша и производительность стабилизировалась на отметке в 350 тысяч пакетов в секунду. Следующим шагом стало распараллеливание отправки в несколько нитей, генерация пакетов значительно возросла, но принимающая программа не смогла обработать больше чем при первой попытке, уперевшись в производительность ядра CPU, выполняющего код приложения.

Данное ограничение удалось преодолеть при помощи задействования нескольких принимающих очередей (RX queue), привязанных к разным CPU и закреплённых за разными IP-адресами. Распределение запросов по двум принимающим очередям увеличил производительность до 650 тысяч пакетов в секунду. Попытка дальнейшего увеличения числа RX-очередей привела к очередному узкому месту - несмотря на то, что сетевая карта справлялась с доставкой пакетов ядру, ядро оказалось не способно доставить их приложению, которое не успевало их принимать. Увеличение числа принимающих нитей, из-за ограниченного размера буфера UDP, не улучшило положение.

Справиться с ограничением помог флаг SO_REUSEPORT, позволяющий сразу нескольким слушающим сокетам подключиться к одному порту для приёма соединений. При этом каждый обработчик использует отдельный дескриптор сокета, т.е. свой отдельный принимающий буфер UDP. Запустив четыре обработчика производительность удалось довести до 1.1 млн пакетов в секунду. Привязав обработку RX-очереди и принимающее приложение к одному узлу NUMA производительность удалось поднять до 1.4 млн пакетов в секунду.

  1. Главная ссылка к новости (https://blog.cloudflare.com/ho...)
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/42449-linux
Ключевые слова: linux, kernel, speed
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (46) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (-), 21:20, 17/06/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    udp/udp-lite прост, лучше бы провели тесты TCP...
     
     
  • 2.13, Pilat (ok), 05:07, 18/06/2015 [^] [^^] [^^^] [ответить]  
  • +8 +/
    > udp/udp-lite прост, лучше бы провели тесты TCP...

    С подтверждением ? Это будет тест чего?

     

  • 1.2, A.Stahl (ok), 21:20, 17/06/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +7 +/
    Пакеты, надо полагать, пустые?
    С одной стороны это очень много и круто, но любопытно было бы сравнить с кем-то.
    Что скажут BSDшники, которые всегда указывают на свой сетевой стек, когда заходит речь о полезности их системы. Может для BSD это вообще не масштаб?
     
     
  • 2.3, Аноним (-), 21:40, 17/06/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Спроси у Netflix и NGinx (они контрибутят ядро BSD), линукс на свой страх и риск.
     
     
  • 3.32, Аноним (-), 19:53, 18/06/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Спроси у Netflix и NGinx (они контрибутят ядро BSD), линукс на свой страх и риск.

    Так мы и спрашиваем: покажете 1М+ PPS на обычной машине? Отмазы про нжинкс и нетфликс - не есть циферки в бенчах.

     
     
  • 4.47, bOOster (ok), 03:37, 22/06/2015 [^] [^^] [^^^] [ответить]  
  • –2 +/
    С бумажкой на которых напечатаны эти циферки в бенче - можешь в толчок сходить и подтереться ими.
    Эти бенчи приводят к появлению дыр в ядре, и все сообщество линуксоидов пердячим паром их ликвидирует…
    ДАЖЕ если вдруг стек и не дотягивает до такой производительности - то уж он на голову стабильнее поделок под Линь.
     
  • 4.48, Аноним (-), 18:34, 15/08/2015 [^] [^^] [^^^] [ответить]  
  • +/
    >покажете 1М+ PPS на обычной машине?

    Обычная такая машина с 10G и NUMA :) Попей уже водички ..

    PS: Нововсти этой месяца 3 уже как, с разморозкой ! :)

     
  • 2.4, Аноним (-), 21:48, 17/06/2015 [^] [^^] [^^^] [ответить]  
  • +/
    http://wand.net.nz/pubs/211/pdf/p21.pdf
     
     
  • 3.5, A.Stahl (ok), 21:55, 17/06/2015 [^] [^^] [^^^] [ответить]  
  • +5 +/
    Ну этот документ стар и считает не пакеты, а килободы. И TCP, а не UDP.
    Впрочем, если кому интересно, то вот оттуда данные:
    TCP Implementation   Min     Mean  Max     SD
    Linux 2.6.10        164.38 213.98 287.67 22.75
    Linux 2.4.27        153.82 207.42 248.70 22.86
    FreeBSD 5.3         136.77 176.20 225.01 17.11
    FreeBSD 5.2.1       128.74 162.81 219.01 19.56
    Windows XP SP2      89.90  137.31 191.00 21.67
    OpenBSD 3.5         63.84  117.98 166.82 22.11

    Как мы видим фряха отстаёт процентов на 15.
    А опенБСД даже хуже винды.

     
     
  • 4.6, oopss (?), 22:01, 17/06/2015 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Бугога) Верни мне мой 2007й?
     
     
  • 5.7, Crazy Alex (ok), 22:05, 17/06/2015 [^] [^^] [^^^] [ответить]  
  • +6 +/
    Нет проблем, тащите свежие данные
     
     
  • 6.17, oopss (?), 08:24, 18/06/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    да данные такой давности даже упоминать глупо
     
  • 4.8, Sadok (ok), 22:09, 17/06/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Ну этот документ стар и считает не пакеты, а килободы. И TCP,
    > а не UDP.
    > FreeBSD 5.3         136.77 176.20
    > 225.01 17.11
    > FreeBSD 5.2.1       128.74 162.81 219.01 19.56

    Поперхнулся. 5.х, помнится, даже в продакшене нигде не жила. С 4 сразу на 6 прыгали

    > Как мы видим фряха отстаёт процентов на 15.
    > А опенБСД даже хуже винды.

     
     
  • 5.9, Аноним (-), 22:15, 17/06/2015 [^] [^^] [^^^] [ответить]  
  • +/
    >> Ну этот документ стар и считает не пакеты, а килободы. И TCP,
    >> а не UDP.
    >> FreeBSD 5.3         136.77 176.20
    >> 225.01 17.11
    >> FreeBSD 5.2.1       128.74 162.81 219.01 19.56
    > Поперхнулся. 5.х, помнится, даже в продакшене нигде не жила. С 4 сразу
    > на 6 прыгали
    >> Как мы видим фряха отстаёт процентов на 15.
    >> А опенБСД даже хуже винды.

    Про производительность Multipath TCP for FreeBSD на 10GbE коробке тоже не слова...

     
     
  • 6.10, Аноним (-), 22:16, 17/06/2015 [^] [^^] [^^^] [ответить]  
  • +/
    >>> Ну этот документ стар и считает не пакеты, а килободы. И TCP,
    >>> а не UDP.
    >>> FreeBSD 5.3         136.77 176.20
    >>> 225.01 17.11
    >>> FreeBSD 5.2.1       128.74 162.81 219.01 19.56
    >> Поперхнулся. 5.х, помнится, даже в продакшене нигде не жила. С 4 сразу
    >> на 6 прыгали
    >>> Как мы видим фряха отстаёт процентов на 15.
    >>> А опенБСД даже хуже винды.
    > Про производительность Multipath TCP for FreeBSD на 10GbE коробке тоже не слова...

    100G

     
     
  • 7.33, Аноним (-), 19:55, 18/06/2015 [^] [^^] [^^^] [ответить]  
  • +/
    >> Про производительность Multipath TCP for FreeBSD на 10GbE коробке тоже не слова...
    > 100G

    Угу, покажи нам миллионы PPSов и 100Гбит.

     
  • 5.18, XoRe (ok), 09:07, 18/06/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Поперхнулся. 5.х, помнится, даже в продакшене нигде не жила. С 4 сразу
    > на 6 прыгали

    Кое-где попала и в продакшен, кровь попортила изрядно.
    Не только переходом на SMP, но и изменениями в портах.
    А вообще да, странно, что в сравнении не взяли FreeBSD 4.9.

     
  • 4.21, t28 (?), 09:38, 18/06/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Ну этот документ стар и считает не пакеты, а килободы.

    "Боды" — это вообще о чём вы? Вообще-то Бод — это единица измерения количества изменений модуляции (или манипуляции) в секунду.

     
     
  • 5.22, A.Stahl (ok), 09:50, 18/06/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Не ной. Да, некорректно использовал термин. Но идея ясна.
     
  • 4.46, Аноним (-), 02:23, 22/06/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Вы бы внимательно перечитали документ, а конкретно размеры буфера и TCP-окна в Windows XP SP2. Что за замеры такие, когда тесты проводятся с параметрами по умолчанию?!
     
  • 2.11, iZEN (ok), 23:10, 17/06/2015 [^] [^^] [^^^] [ответить]  
  • –5 +/
    Можно здесь посмотреть некоторые соображения: https://calomel.org/network_performance.html
     
     
  • 3.19, Andrey Mitrofanov (?), 09:18, 18/06/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Можно здесь посмотреть некоторые соображения: https://calomel.org/network_performance.html

    ""Соединение с calomel.org было неожиданно прервано. Возможно, также была прервана передача данных.""

    Посмотрел. В ахе.

     
     
  • 4.25, Аноним (-), 11:36, 18/06/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > ""Соединение с calomel.org было неожиданно прервано. Возможно, также была прервана передача
    > данных.""
    > Посмотрел. В ахе.

    Вот как-то так оно пакеты и обрабатывает.

     
     
  • 5.28, Аноним (-), 13:21, 18/06/2015 [^] [^^] [^^^] [ответить]  
  • +/
    h2o и http/2.0 вас приветствует...

    говорят у h2o 20% запросов это отказ

     
  • 3.34, Аноним (-), 20:06, 18/06/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Можно здесь посмотреть некоторые соображения: https://calomel.org/network_performance.html

    Самое годное что там есть - фоновая картинка. Которая однако прозрачно намекает что основное время бояздэшники проводят в трублешутинге и твиках того, что у остальных сразу работает нормально.

    А так - да, там отлично видно:
    1) В качестве генератора пакетов на 10Гбит линк почему-то используются убунты. Наверное потому что они этот 10Гбит линк вообще могут прогрузить, для начала, в отличие от исследуемого на производительность предмета? :)
    2) Коменты про отключение HT и однопоточность - улыбают. Да, очень круто когда 1 рубит а семеро в кулак трубят. Это оказывается было сказано про работу OpenBSD на восьмиядернике :)
    3) Не надо быть семи пядей во лбу, чтобы заметить что твиков TCP/IP стека у обычной убунты - разика так в три поболее чем у бздюков. Так что когда что-то покрутить приспичило - это хотя-бы можно, для начала. Про то что у редхата еще больше настроек в их самопальных ядрах - я и вовсе молчу.

     
     
  • 4.44, Аноним (-), 12:28, 19/06/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > А так - да, там отлично видно:
    > 1) В качестве генератора пакетов на 10Гбит линк почему-то используются убунты. Наверное
    > потому что они этот 10Гбит линк вообще могут прогрузить, для начала,
    > в отличие от исследуемого на производительность предмета? :)

    Ух ты! Так там, внезапно, вдруг, оказывается, [b]исследуется[/b] производительность, т.е. это не просто пример твикалки огнестены меж двух бубунто-серверов?
    Интересно, а почему же не используют сразу бубунту для всего? =)

    > 3) Не надо быть семи пядей во лбу, чтобы заметить что твиков
    > TCP/IP стека у обычной убунты - разика так в три поболее
    > чем у бздюков.

    Ну да, особенно, когда все твики идут вообще отдельно https://calomel.org/freebsd_network_tuning.html
    *на третий день Фанатег Зоркий Глаз заметил ...*

    А так, да, все верно :)

     
  • 3.38, AlexAT (ok), 22:02, 18/06/2015 [^] [^^] [^^^] [ответить]  
  • +/
    А теперь в юзерспейсе.


     
  • 2.20, t28 (?), 09:33, 18/06/2015 [^] [^^] [^^^] [ответить]  
  • –5 +/
    > Пакеты, надо полагать, пустые?
    > С одной стороны это очень много и круто, но любопытно было бы

    350 kpps — это мало и совсем не круто.
    Уровень 1 Mpps достижим при отказе от сетевого стека ядра и реализации части драйвера сетевухи, IP-стека и собственно обработчика этих пакетов на уровне user-space приложения. Где-то была статья год назад на эту тему. Естественно, что такой подход позволяет выжать максимум из железа.

     
     
  • 3.26, Аноним (-), 11:46, 18/06/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Это конечно же полный бред.
     
  • 3.35, Аноним (-), 20:08, 18/06/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Вообще-то для х86 самого по себе - без дополнительых ухищрений очень сложно дернуться 350 000 раз в секунду. Прерывания на х86 довольно медленные, переключение контекста - дорогое. Все прелести. В результате навороченный 4-гигагерцевый кирпич может убить все время на телепание между контекстами, заваливание в прерывания и прочую сугубо техническую работу.
     
     
  • 4.37, AlexAT (ok), 22:01, 18/06/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Ну сетевухи уже давно не дёргают x86 на каждый пакет, тащемта.
     
     
  • 5.39, Аноним (-), 01:49, 19/06/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Ну сетевухи уже давно не дёргают x86 на каждый пакет, тaщeмта.

    Ну да. Там всякие довольно жестокие изгаления по части interrupt mitigation, насколько я знаю.

     
  • 2.23, Dmitry (??), 10:13, 18/06/2015 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Миллион восемьсот пакетов в секунду при включенном fastforwarding

    http://bsdrp.net/documentation/technical_docs/performance

     
     
  • 3.24, Аноним (-), 11:34, 18/06/2015 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Cкажите мне как художник художнику, вы читать умеете ?
     
     
  • 4.40, Аноним (-), 05:41, 19/06/2015 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Если в тексте написано что BSD как обычно вздрючило пингвина, и _подробно_ расписано как повторить опыт ... то для художников оно не читаемо? Ню-ню :)
     
     
  • 5.45, Аноним (-), 12:38, 19/06/2015 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Если в тексте написано что BSD как обычно вздрючило пингвина, и _подробно_
    > расписано как повторить опыт ... то для художников оно не читаемо?
    > Ню-ню :)

    Ну, вы ведь понимаете, что именно ЭТОТ конь -- абсолютно неправильной сферичности!
    Ведь провели замер скорости пингвинообразной поняшки в вакууме -- а у "бздюков", точно таких же "тестов", нема! Значит что? Значит, они СЛИЛИСЯ! Уррра товарищи!!!
    Причем, каждый третий норовит высказать свое "Фи" так, как будто он, как минимум, причастен к разработке  сетевого стека пингвина!
    Детский сад, штаны на лямках :)


     
  • 3.36, Аноним (-), 20:10, 18/06/2015 [^] [^^] [^^^] [ответить]  
  • +/
    > Миллион восемьсот пакетов в секунду при включенном fastforwarding

    Круто. А теперь попробуй получить 1.8М пакетов в секунду программой в юзерспейсе и расскажи как получилось.

     
     
  • 4.43, Dmitry (??), 11:01, 19/06/2015 [^] [^^] [^^^] [ответить]  
  • +/
    >> Миллион восемьсот пакетов в секунду при включенном fastforwarding
    > Круто. А теперь попробуй получить 1.8М пакетов в секунду программой в юзерспейсе
    > и расскажи как получилось.

    Про netmap прямо здесь рассказывать ?

     

  • 1.14, svsd_val (ok), 05:57, 18/06/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Весьма и весьма не плохо, интересно аналогичные результаты можно достичь на мелко мягких ?
     
  • 1.16, Аноним (-), 08:13, 18/06/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • –4 +/
    тут больше в само ядро упирается. чем в "трюки" вокруг него.
    помнится, N2O, Yaws и cowboy - выдавали на стрекозе и QNX до в 30х и 8х раз больший траффик с того-же железа. а в линукс - просто ядро сатурировалось и ж-а наступала. ни сервисам ничего ни доставалось ни достучаться до него - низя было.
    по той-же причине и hammerfs в linux не прикрутить - ведро с болтами это - не тянет такое.
     
     
  • 2.27, Аноним (-), 11:46, 18/06/2015 [^] [^^] [^^^] [ответить]  
  • +/
    Очередное творчество душевнобольных.
     
  • 2.29, YetAnotherOnanym (ok), 14:13, 18/06/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    А что, Erlang на QNX уже считается пригодным для эксплуатации? Сами создатели эрланга на вопрос о работе под QNX отвечают "Там какой-то чувак пилит порт, спроси в рассылке".
     
  • 2.30, fleonis (?), 14:39, 18/06/2015 [^] [^^] [^^^] [ответить]  
  • +/
    что за тесты? есть ссылка?
     
  • 2.41, Аноним (-), 05:44, 19/06/2015 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > выдавали  QNX до в 30х и 8х раз больший траффик с того-же железа.

    Сказочник грёбанный :))))
    QNX - редкий тормоз в сетях, это я тебе как доктор говорю :)

     

  • 1.31, rob pike (?), 14:46, 18/06/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Разбор полётов внутри ядра - где тормоза и куда пилить - https://lwn.net/Articles/629155/, http://people.netfilter.org/hawk/presentations/LCA2015/net_stack_challenges_1
     
  • 1.42, ArtemDPI (?), 10:46, 19/06/2015 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    1M пакетов для 10G - это, всё же, мало.
    Физический предел для такого интерфейса - около 15M фреймов в секунду (с минимальной полезной нагрузкой 64Б) и около 5M фреймов со средним размером полезной нагрузки в 256Б (сегодня в сетях примерно так). Учитывая, что интерфейсы дуплексные, умножаем на 2.
    Соответственно, если мы хотим хотя бы близко подойти к использованию всех возможностей 10G интерфейса (про 40 и 100 молчу), сетевой стек Linux использовать нельзя.
    Для этого и пилят всякие DPDK и Netmap'ы (там мы, правда, начинаем уже упираться в память, процессоры и интерконнект, но это уже другой вопрос).
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру