Каким образом можно уменьшить задержку в обработке сетевого пакета с данными, ядром линукса?
На моей целевой станции, крутится программное обеспечение, одним из компонентов которого является промышленный протокол обмена данными в реальном времени (ethercat).
Для того чтобы это работало мне необходимо соблюсти ряд условий, основным из которых является обеспечение этого реального времени операционной системой.
Прежде всего я поставил патч preempt_rt и отключил ряд функционала цпу, относящегося к энергофективности/виртаулизации/гипертрейдингу.
В этой части мне кажется я все сделал правильно и полученные максимальные значения задержек по ядрам цпу составляют 20-30 мкс (получено через cyclictest).
Однако при запуске я столкнулся с некоторой нестабильностью работы, а именно периодические задежрки в отправке/получении пакета системой (нормальное время отклика устройств у меня составляет 70-80 мкс, а при задержке может доходить до 1500 мкс). Ну и т.к. мой протокол является механизмом реального времени, то все начинает падать в ошибках.
Так же стоит отметить, что частота таких сбоев зависит от загрузке цпу - чем больше она, тем чаще происходят ошибки.
В мануале к протоколу имеется некоторое описание, как правильно настраивать приоритеты прерываний, но выполненные мной настройки не дали видимого эффекта.
Кроме того я попробовал пересобрать ядро с увеличенным таймером - 1000Гц (вместо 250) - эффекта не дало.
Так же попробовал поиграться с параметрами swap и выставил vm.swappiness = 0 и тоже не увидел разницы.
Прошу уточнить:
Правильно ли я думаю, что моя проблема в настройки связи между хардварными и софтварными прерываниями?
Какие настройки приоритетов прерываний стоит задать в многоядерной системе?
Каким образом можно определить конкретную причину, задержек в обработке прерываний?
Версия ядра:
4.19.135-rt60 #1 SMP PREEMPT RT Sun Aug 7 00:06:45 +05 2022 x86_64 x86_64 x86_64 GNU/Linux
CPU - Intel(R) Core(TM) i7-9700 CPU @ 3.00GHz
Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev 03)
Чисто теоретически:
Возможно стоит поиграть с приоритетом приложения. Запускайте ваше приложение с повышенным приоритетом. По идее, после установки патча должны добавится дополнительные приоритеты. Возможно вместе с патчем идут дополнительные утилиты, позволяющие использовать новые приоритеты.
Загрузка ЦП все равно имеет значение. Например, если у вас будет запущено несколько приложений с повышенным одинаковым приоритетом, то они начнут бороться за ЦП между собой и если ЦП будет не хватать, то все - реального времени не будет.
res2001, то что относится к изеркату я запускаю с рантаймовскими приоритетами 95 93 91 87, соответветнно их не должно перекрывать ничего кроме системных процессов.
А может есть какой-то механизм просмотра что прерывает процесс в цпу?
я вообще не спец, но может попробовать копнуть в сторону freebsd? там сетевой стек всегда был хорош. Но у вас слишком уж уникальная ситуация, так что можете игнорить