Всего одно ядро, предназначенное для одиночного процесса
Можно ли каким-либо образом в Linux назначить одно ядро ЦП конкретному данному процессу, и в этом ядре не должно быть никаких других процессов или обработчиков прерываний?
Я прочитал о связности процессов в Linux Процессы привязки к ЦП с помощью утилиты tasket, но это не решает мою проблему, потому что просто пытается аффинировать данный процесс этому ядру, но это возможно, что другие процессы могут быть запланированы на этом ядре, и этого я хочу избежать.
Следует ли изменить код ядра для планирования?
Ответы
Ответ 1
Да, есть. Фактически, есть два разных способа сделать это: -)
Прямо сейчас, лучший способ выполнить то, что вы хотите, это сделать следующее:
-
Добавьте параметр isolcpus = [cpu_number] в командную строку ядра Linux из загрузчика во время загрузки. Это даст указание планировщику Linux не запускать какие-либо регулярные задачи на этом CPU, если специально не запрошено использование слияния cpu.
-
Используйте привязку IRQ для установки других процессоров для обработки всех прерываний, чтобы ваш изолированный CPU не получал никаких прерываний.
-
Используйте привязку к процессору, чтобы исправить вашу конкретную задачу на изолированном CPU.
Это даст вам лучшее, что Linux может предоставить в отношении изоляции процессора без внешних и встроенных патчей.
Ваша задача будет время от времени прерываться кодом Linux, включая другие задачи, такие как прерывание таймера и код планировщика, IPI от других процессоров и прочее, как потоки ядра рабочей очереди, хотя прерывание должно быть довольно минимален.
Для (почти) полного списка источников прерываний проверьте мою страницу на https://github.com/gby/linux/wiki
Альтернативный метод заключается в использовании cpusets, который является более элегантным и динамичным, но на данный момент страдает некоторыми недостатками (например, без миграции таймеров), что заставляет меня рекомендовать старый, грубый, но эффективный параметр isolcpus.
Обратите внимание, что в настоящее время сообщество Linux использует работу для решения всех этих проблем и более того, чтобы обеспечить еще лучшую изоляцию.
Ответ 2
Существует статья Redhat, говорящая об этом. Он изменяет параметр загрузки isolcpus.
И
Ответ 3
Выделение целого ядра процессора для конкретной программы
В то время как набор заданий позволяет назначать определенную программу определенным процессорам, это не означает, что никакие другие программы или процессы не будут запланированы на этих ЦП. Если вы хотите предотвратить это и выделить целое ядро ЦП для конкретной программы, вы можете использовать параметр ядра "isolcpus", который позволяет вам резервировать ядро процессора во время загрузки.
Добавьте параметр kernel "isolcpus =" в загрузчик во время загрузки или файла конфигурации GRUB. Тогда планировщик Linux не будет планировать какой-либо регулярный процесс на зарезервированном ядре процессора, если специально не запрошен с набором задач. Например, чтобы зарезервировать ядра CPU 0 и 1, добавьте параметр ядра "isolcpus = 0,1". После загрузки используйте набор задач, чтобы безопасно назначить зарезервированные ядра ЦП в вашей программе.
Источник()
Ответ 4
Даже если вы выполните шаги в ответе gby, задачи ядра выполняются на изолированном ядре ЦП. В настоящее время ведется работа в реальном времени RT_PREEMPT, чтобы улучшить это. Поэтому, если вы не используете ядро реального времени с истекающим потоком от RP_PREEMPT, возможно, не удастся полностью изолировать ядро процессора.
Ответ 5
По документация
Планировщик Linux будет соблюдать заданное соответствие процессоров, и процесс не будет работать на других процессорах.
Нет никаких упоминаний о том, что конкретный процессор будет обрабатываться исключительно.