У меня возникли проблемы с обеспечением необходимой пропускной способности сети на сервере, подключенном к анализатору спектра Signal Hound через сетевой интерфейс 10GbE.В принципе, я могу получить хорошую пропускную способность, когда запущен только процесс захвата радио, но когда я запускаю другие процессы, пропускная способность начинает падать. Я использую сетевой адаптер Aquantia PCIe с адаптером QNAP SFP+ 10GbE Thunderbolt 3.
Когда я запускаю простую программу на Python для опроса API-интерфейса анализатора спектра в потоковом режиме, все отлично работает при максимальной пропускной способности (~ 800 МБ/с). Когда я делаю
$ стресс --cpu 8 --io 8 --vm 8 --hdd 8
бок о бок, она снижается примерно до 600 МБ/с, и я начинаю терять много данных.
Что я пробовал:
- Обновление драйверов
- Возиться с параметрами объединения и многими опциями ethtool (MTU и т. д.)
- Отключение гиперпоточности и изоляция процесса на одном ядре (8 из 8) с помощью привязки процессора
- Это также включало изоляцию сетевых прерываний для их собственного ядра (7 из 8).
- Я также меняю регулятор ядра на «производительность», чтобы он всегда работал на максимальной частоте.
- Я также попытался отключить большинство других прерываний для ядер 7 и 8, чтобы предотвратить их замедление, что подтверждается приборной панелью netdata.
- Я в основном пробовал все в здесь
По сути, я знаю, что он может работать в режиме реального времени, потому что он отлично работает, когда сам по себе ограничен двумя ядрами. Но по какой-то причине, хотя другие ядра не мешают циклам процессора или сетевым IRQ, когда ядра 1-6 находятся под большой нагрузкой, они сильно замедляют основной процесс.
Если это поможет, я нахожу, что --вм 4
вариант для стресс
вызывает наибольшее замедление, поэтому я подозреваю, что это как-то связано с распределением памяти и, возможно, с интерфейсом DRAM для сетевой карты.
Я в основном рву на себе волосы, пытаясь получить каждый пакет с радио на машине (которая должна быть очень мощной) с Ubuntu 20.04. У кого-нибудь есть опыт работы с такими приложениями?
РЕДАКТИРОВАТЬ: я скопировал здесь некоторые кривые производительности:
Вот эффект, который я вижу
Так вот утилизация.Core 6 работает на 100% с отложенными прерываниями как в период высокой нагрузки, так и в период «просто захвата». Я пытался разделить сетевые данные на два ядра (5 и 6), но одно из них всегда остается загруженным, а другое кажется чистым, даже если у них одинаковое количество прерываний.
К сожалению, фактическое количество отложенных прерываний падает на ЦП 6 в период выполнения стресс-теста.
Вот эффект, который я вижу в софтнете CPU6.
Кроме того, прерывания, кажется, остаются относительно такими же, хотя они становятся немного менее последовательными в период высокой нагрузки.
Вот прямая скорость сети, и она также выглядит немного непоследовательной в оба периода.
Я довольно внимательно искал аномалии (хотя в netstat есть много графиков), и похоже, что в период высокой нагрузки нет межпроцессной памяти. Может ли это привести к проблемам?
Если кому-то нужно больше сюжетов, дайте мне знать. Я не могу вывести проблему из этого, но я надеюсь, что информации достаточно, чтобы придумать возможные решения.
Еще раз спасибо!