mlock заблокирован потоком FIFO другого процесса в Ubuntu Linux - PullRequest
0 голосов
/ 12 октября 2018

Я работаю над некоторыми программами реального времени, которые требуют политики планирования mlock и FIFO для быстрых путей.

Я выполняю два процесса в Ubuntu 16.04 с 12 ядрами ЦП, и я назначил быстрые пути этихпроцессы на разных ядрах.

Процесс 1 запускается нормально и привязывает свой быстрый поток к ЦП и устанавливает для этого потока политику планирования FIFO.

Когда процесс 2 запускается до того, как его быстрый поток становитсясоздан, он пытается вызвать mlock.

Затем процесс 2 застрял.

Я подключил GDB к процессу 2, и стек вызовов, похоже, находится внутри функции mlock.

Если я удаляю настройку FIFO в процессе 1, оба процесса могут работать нормально.

Я подозреваю, что mlock пытается получить доступ к некоторым ресурсам ядра, полученным быстрым потоком процесса 1.

То есть он блокируется и ставится на неопределенное время ожидания.

Кто-нибудь точно знает, чего он ждет?

Я наблюдал эту проблему на двух симах.Локальные серверы IBM с Ubuntu.

Но на машине Supermicro с Redhat Linux такой проблемы не возникало.

Спасибо за любую подсказку или решение!

1 Ответ

0 голосов
/ 13 октября 2018

Если у вас есть процесс SCHED_FIFO, который полностью занял ЦП, так что потоки non-sched-fifo никогда не планируются на этом ЦП, некоторые алгоритмы в ядре могут перестать работать, в зависимости от версии / конфигурации ядра.

Попробуйте загрузиться с rcutree.kthread_prio = N, где N больше, чем приоритет SCHED_FIFO вашего потока.

Попробуйте поиграть с / proc / sys / kernel / sched_rt_runtime_us

Попробуйте получить в ядре обратную трассировкузависания mlock (), чтобы понять, где он ожидает - это может получить подсказку.Для этого используйте / proc / pid / stack (если ваше ядро ​​скомпилировано с CONFIG_STACKTRACE) или, возможно, 'echo t> / proc / sysrq-trigger'

...