Скажем, на ядре Linux без RT (4.14, Angstrom distro, работает на iMX6) У меня есть программа, которая принимает UDP-пакеты (<1400 байт), которые приходят с очень устойчивой скоростью передачи данных. В основном, </p>
Суть программы:
while (true)
{ recv( sockFd, ... );
update_loop_interval_histogram(); // O(1)
}
Чтобы минимизировать максимально возможное время задержки (интервалы цикла), я начал свой процесс с:
chrt --fifo 99 ./programName
перевод планировщика в режим реального времени SCHED_FIFO с наивысшим приоритетом.
Привязка процессора моего процесса зафиксирована ко 2-му ядру.
- Кроме того, я запустил тестовую программу экземпляр на ядро, намеренно доведя нагрузку на процессор до 100%.
Таким образом, я получаю максимальный интервал цикла ~ 10 мс (против ~ 25 мс без SCHED_FIFO). Такое случается редко. Например, во время за час выполнения сумма подсчетов всех интервалов <400 мкс, деленная на сумму всех отсчетов всех других интервалов времени от 400 мкс до 10000 мкс, составляет более 1,5 миллиона.
Но как бы редко это ни было, все равно плохо. </p>
Это лучшее, что можно надежно получить на ядре Linux, отличном от RealTime, или есть еще какие-то настройки, чтобы получить что-то вроде максимального интервала 5 мс?