Подтвердить что ты не робот

Одно ядро ​​исключительно для моего процесса

Возможный дубликат:
как настроить близость процессора к определенному pthread?

Есть ли способ в Linux отключить одно ядро ​​для всех процессов, кроме одного процесса? Я хотел бы, чтобы одно ядро ​​зарезервировано только и только для моего процесса.

Ожидаемое поведение выглядит следующим образом:

  • Процессы, которые будут созданы после моего процесса, не должны видеть это ядро ​​и использовать другие.
  • Когда мой процесс порожден, все процессы, которые используют это ядро, должны быть переключены на другие ядра.
4b9b3361

Ответ 1

Да, есть. Вы хотите создать два cpusets, один с изолированным процессором, а другой со всеми остальными CPU. Назначьте свой особый процесс изолированному процессору и всем остальным процессам на другой cpuset.

Вот простой пример script, который сделает это:

mkdir /cpuset 
mount -t cpuset none /cpuset/
cd /cpuset

mkdir sys                                   # create sub-cpuset for system processes
/bin/echo 0-2 > sys/cpuset.cpus             # assign cpus (cores) 0-2 to this set
                                            # adjust if you have more/less cores
/bin/echo 1 > sys/cpuset.cpu_exclusive
/bin/echo 0 > sys/cpuset.mems     

mkdir rt                                    # create sub-cpuset for my process
/bin/echo 3 > rt/cpuset.cpus                # assign cpu (core) 3 to this cpuset
                                            # adjust this to number of cores-1
/bin/echo 1 > rt/cpuset.cpu_exclusive
/bin/echo 0 > rt/cpuset.mems
/bin/echo 0 > rt/cpuset.sched_load_balance
/bin/echo 1 > rt/cpuset.mem_hardwall

# move all processes from the default cpuset to the sys-cpuset
for T in `cat tasks`; do echo "Moving " $T; /bin/echo $T > sys/tasks; done

Теперь запустите свой процесс и узнайте его PID и идите:

/bin/echo $PID > /cpuset/rt/tasks

Если вы хотите отменить эти изменения, просто перезапустите свою систему или выполните:

# move tasks back from sys-cpuset to root cpuset
for T in `cat /cpuset/sys/tasks`; do echo "Moving " $T; /bin/echo $T > /cpuset/tasks; done
# remove sys-cpuset
rmdir /cpuset/sys
# move tasks back from rt-cpuset to root cpuset
for T in `cat /cpuset/rt/tasks`; do echo "Moving " $T; /bin/echo $T > /cpuset/tasks; done
# remove rt-cpuset
rmdir /cpuset/rt
# unmount and remove /cpuset
umount /cpuset
rmdir /cpuset

Вот страница man: http://www.kernel.org/doc/man-pages/online/pages/man7/cpuset.7.html

Существуют также более сложные оболочки оболочки, которые могут помочь вам автоматизировать это, например, cset. См.: http://web.archive.org/web/20120428093126/http://www.suse.com/documentation/slerte_11/slerte_tutorial/data/slerte_tutorial.html

Ответ 2

Вы можете посмотреть эту статью lwn для обсуждения решения ядра для этой проблемы.