То, что я пытаюсь реализовать, - это запустить скрипт Python на собственном ядре на Raspberry Pi 2 с Debian. Можно использовать taskset
чтобы связать процесс с конкретным ядром. Но мне нужно, чтобы это ядро было свободным от загрузки ОС и других процессов одновременно. Как мне это сделать?
2 ответа
Вся эта тема должна быть полезной.
Я хотел бы найти способ ограничить процесс 'init' для запуска на процессоре 1.
В общем случае последние слова должны быть «запущены на всех процессорах, кроме 1». Я думаю, можно использовать некоторые параметры ядра ; irqaffinity
, isolcpus
выглядят многообещающе.
РЕДАКТИРОВАТЬ:
О isolcpus
в документации параметров ядра:
Этот вариант является предпочтительным способом изолировать процессоры. Альтернатива - ручная установка маски ЦП для всех задач в системе - может вызвать проблемы и неоптимальную производительность балансировщика нагрузки.
Я сделал несколько тестов. Результаты:
Параметр ядра
isolcpus
- это тот, который вы можете использовать, чтобы ограничить процессinit
и изолировать ЦП.Мне показалось, что параметр ядра
irqaffinity
не влияет на изолированные процессоры. Вам, вероятно, не нужен этот параметр.Когда я изолировал CPU0, он не работал полностью без дела. Это системное или аппаратное требование для выполнения каких-либо вычислений, несмотря на изоляцию? - Я не знаю.
Когда я изолированные CPU1 или CPU7 он был
твердым,какв режиме ожидания , как камень.
Для того, чтобы изолировать CPU1 добавить isolcpus=1
в вашем grub.cfg
как это:
linux /vmlinuz-
(... все ваши текущие параметры здесь ...)isolcpus=1
ОРИГИНАЛЬНЫЙ ОТВЕТ ПРОДОЛЖАЕТСЯ:
В качестве альтернативы, после запуска системы вы можете переназначить привязку всех запущенных в данный момент процессов, но это выглядит менее элегантно.
Я согласен, что он кажется менее элегантным, но все же может работать достаточно хорошо (РЕДАКТИРОВАТЬ: это может вызвать проблемы и неоптимальную производительность балансировщика нагрузки, как указано выше). В моем Debian работает быстрый и грязный однострочный текст:
sudo bash -c 'cd /proc ; for i in [1-9]* ; do taskset -a -p fffffffe $i ; done'
Я получил ошибки для некоторых pid- ов, но, тем не менее, htop
показывает, что после этого одно ядро практически простаивает. Конечно, вы должны запустить свой скрипт позже, каким-то образом исключить его или просто переназначить:
taskset -a -p 1 PID
Я ожидаю, что вам не нужно будет повторять упомянутую однострочную оболочку, чтобы охватить новые процессы, так как привязка к процессору наследуется.
С пакетом Cpuset:
# cset shield -c 42 -k on
зарезервировать ЦП № 42 для вашей задачи (вы можете зарезервировать группу ЦП), затем
# cset shield -e your_script
запустить your_script
на ваших зарезервированных процессорах. (Смотрите также параметры --user
и --group
.)
Когда вы закончите, освободите процессоры ("сбросить щит") с помощью:
# cset shield -r
Существует много, намного больше в этом инструменте. Например, присоединение ранее запущенного процесса к зарезервированному ЦП:
# cset shield -s -p <PID> --threads
Справка командной строки:
# cset help