Рейтинг:2

Как обеспечить пропускную способность сетевого устройства 10GbE в Ubuntu 20.04 при большой нагрузке

флаг jp

У меня возникли проблемы с обеспечением необходимой пропускной способности сети на сервере, подключенном к анализатору спектра Signal Hound через сетевой интерфейс 10GbE.В принципе, я могу получить хорошую пропускную способность, когда запущен только процесс захвата радио, но когда я запускаю другие процессы, пропускная способность начинает падать. Я использую сетевой адаптер Aquantia PCIe с адаптером QNAP SFP+ 10GbE Thunderbolt 3.

Когда я запускаю простую программу на Python для опроса API-интерфейса анализатора спектра в потоковом режиме, все отлично работает при максимальной пропускной способности (~ 800 МБ/с). Когда я делаю

$ стресс --cpu 8 --io 8 --vm 8 --hdd 8

бок о бок, она снижается примерно до 600 МБ/с, и я начинаю терять много данных.

Что я пробовал:

  1. Обновление драйверов
  2. Возиться с параметрами объединения и многими опциями ethtool (MTU и т. д.)
  3. Отключение гиперпоточности и изоляция процесса на одном ядре (8 из 8) с помощью привязки процессора
    • Это также включало изоляцию сетевых прерываний для их собственного ядра (7 из 8).
    • Я также меняю регулятор ядра на «производительность», чтобы он всегда работал на максимальной частоте.
    • Я также попытался отключить большинство других прерываний для ядер 7 и 8, чтобы предотвратить их замедление, что подтверждается приборной панелью netdata.
    • Я в основном пробовал все в здесь

По сути, я знаю, что он может работать в режиме реального времени, потому что он отлично работает, когда сам по себе ограничен двумя ядрами. Но по какой-то причине, хотя другие ядра не мешают циклам процессора или сетевым IRQ, когда ядра 1-6 находятся под большой нагрузкой, они сильно замедляют основной процесс.

Если это поможет, я нахожу, что --вм 4 вариант для стресс вызывает наибольшее замедление, поэтому я подозреваю, что это как-то связано с распределением памяти и, возможно, с интерфейсом DRAM для сетевой карты.

Я в основном рву на себе волосы, пытаясь получить каждый пакет с радио на машине (которая должна быть очень мощной) с Ubuntu 20.04. У кого-нибудь есть опыт работы с такими приложениями?

РЕДАКТИРОВАТЬ: я скопировал здесь некоторые кривые производительности:

Вот эффект, который я вижу

Так вот утилизация.Core 6 работает на 100% с отложенными прерываниями как в период высокой нагрузки, так и в период «просто захвата». Я пытался разделить сетевые данные на два ядра (5 и 6), но одно из них всегда остается загруженным, а другое кажется чистым, даже если у них одинаковое количество прерываний. Загрузка процессора

К сожалению, фактическое количество отложенных прерываний падает на ЦП 6 в период выполнения стресс-теста. Мягкий номер IRQ

Вот эффект, который я вижу в софтнете CPU6. Софтнет CPU6

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

Вот прямая скорость сети, и она также выглядит немного непоследовательной в оба периода. Информация о сети

Я довольно внимательно искал аномалии (хотя в netstat есть много графиков), и похоже, что в период высокой нагрузки нет межпроцессной памяти. Может ли это привести к проблемам? введите описание изображения здесь

Если кому-то нужно больше сюжетов, дайте мне знать. Я не могу вывести проблему из этого, но я надеюсь, что информации достаточно, чтобы придумать возможные решения.

Еще раз спасибо!

флаг jp
Брендан Грегг ждет вас. Начните с его веб-страницы https://www.brendangregg.com/, начните собирать метрики производительности системы, ищите узкие места.
Eric avatar
флаг jp
Спасибо Алекс за предложения! Я отредактировал исходный пост, добавив больше кривых производительности, чтобы, надеюсь, кто-то умнее меня мог помочь мне понять, что происходит.
Рейтинг:0
флаг jp

Ладно, кажется, я нашел ответ на свою проблему. Я думаю, что ключевым графом здесь был граф «softirq». При нормальной работе я не думаю, что он должен быть таким высоким.

У меня был небольшой момент во время профилирования: в основном, поскольку я запускаю CUDA и кучу других библиотек, которые нужно установить, я запускал все это в док-контейнере (я знаю, что вы все говорите!) . Так как я не заморачивался с сетевыми штуками для радио в докере, я как бы и не задумывался об этом.И да, как вы уже догадались, сеть докеров добавила достаточно обработки, чтобы подтолкнуть меня к отбрасыванию пакетов. Я закончил тем, что установил сетевой режим к хозяин использовать хост-сеть, и это решило мою проблему. Надеюсь, это может быть полезно для кого-то еще!

Но это еще не все - чтобы понять это, я потратил немало времени на профилирование, чтобы выяснить, почему именно я вижу тот эффект, который вижу (спасибо @AlexD за ресурсы). Вот график пламени закрепленного ЦП 7, на котором были запущены драйверы API: введите описание изображения здесь

Как вы можете видеть, он тратит много времени на выделение памяти из-за ошибки страницы (что должно было быть еще одной подсказкой, хотя я не разместил ее здесь. Незначительные ошибки памяти были выше крыши во время захвата). Это объясняет, почему бег стресс с --вм 4 дал наихудшие результаты - это вызывало конкуренцию за память, что значительно замедляло работу драйвера. Кроме того, после небольшого тестирования я думаю, что ему все равно нужно более одного ядра (он отбрасывал пакеты, прикрепленные исключительно к ядру 7, но работал, закрепленные к 6 и 7). Я получал лучшие результаты после разгона (но все еще не идеальные), и это объясняет, почему.

Итак, вот оно: объяснение того, почему все происходило так, а не иначе, с графиками, подтверждающими это. У меня около 60% использования двух ядер для радио API, и он довольно стабильно получает все пакеты (другое ядро ​​​​обрабатывает программные прерывания примерно на 10%, по сравнению с 95%, которые вы видите на графике выше). Я чувствую себя немного тупым из-за того, что не подумал о том, что докер замедляет меня, но гораздо лучше, когда я во всем этом разобрался. Надеюсь, этот пост поможет кому-то еще!

Ответить или комментировать

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