Я работаю над приложением C ++, которое можно квалифицировать как маршрутизатор. Это приложение получает пакеты UDP по заданному порту (почти 37 байтов в секунду) и должно передавать их другим адресатам в течение 10 мс. Однако иногда после приема пакета повторная передача превышает предел 10 мс и может достигать 100 мс. эти задержки запрещены.
Приложение получает по тому же интерфейсу Ethernet, но через другой порт другие типы пакетов (до 200 пакетов почти 100 байтов в секунду). Я не уверен, что этот более поздний поток нарушает другой, потому что эти пики задержки слишком редки (2 пакета из 10000 пакетов)
Каковы могут быть причины этих спорадических задержек? И как их решить?
Постскриптум Мое приложение работает на Linux 2.6.18-238.el5PAE. Задержки измеряются между приемом пакета и после успешной передачи!
Изображение должно быть более четким:
10 мс — жесткий срок для ОС не в реальном времени.
Назначьте свой процесс одной из политик планирования в реальном времени, например, SCHED_RR или SCHED_FIFO (некоторое чтение). Это можно сделать в коде через sched_setscheduler () или из командной строки через CHRT. Отрегулируйте также приоритет, пока вы на нем.
Убедитесь, что ваш код не потребляет процессор больше, чем должен, иначе это повлияет на производительность всей системы.
Вам также может понадобиться RT_PREEMPT патч.
В целом, задача генерации трафика Ethernet для планирования в Linux не простая. Например. увидеть BRUTE, высокопроизводительный генератор трафика; может быть, вы найдете что-то полезное в его коде или в исследовательской работе.
Других решений пока нет …