Я разрабатываю приложение Linux на 4-ядерном процессоре ARM. В приложении есть два процесса, и я выделил каждый процесс процессору, как показано ниже.
- core1 : process1 (графический интерфейс)
- core2-4 : precess2 (приложение реального времени)
Без процесса 1, процесс 2 легко справляется со своим процессом и не о чем беспокоиться. Но проблема в том, что когда я запускаю процесс 1, он оказывает огромное влияние на производительность процесса 2 и процесс 2 вообще не работает должным образом.
Что может быть причиной этого?
Дополнительная информация:
cpu2-4 изолирован с isolcpus=1-3
Я проследил потоки всей системы и заметил, что только когда есть процесс 1, процесс 2 пробуждает множество задач, называемых rcu_preempt на ядре 1. Однако эти два процесса не разделяют память.
Я заменил процесс 1 некоторыми другими процессами и обнаружил, что процесс, быстро записывающий много данных в выделенную память, влияет на процесс 2. Просто процесс, выполняющий простую работу ЦП (вроде цикла while), не влияет.
решение1
Вы захватили все ЦП, заставив ядро Linux вытеснять работающие процессы, чтобы запустить свои собственные потоки. Затем ядро не различает ЦП и может вытеснять ЦП1 так же хорошо, как и любой другой ЦП. Чем больше активности происходит в компьютере, тем больше ядру нужно будет вытеснять, опять же, не различая ЦП.
Кроме того, ЦП — это не все, и архитектура компьютера может иметь более неявные узкие места. Некоторые из них — это банки памяти, где одновременный доступ к банку зависит от количества каналов к этому банку. Затем идут шина памяти компьютера, кэш диска, сам диск и т. д.
Дополнительные советы о том, как по-настоящему запустить процесс в реальном времени, вы можете найти в статье Как запустить приложение реального времени в Linux? Однако именно ваше фактическое оборудование определяет, что будет работать лучше или хуже.