One core exclusively for my process

22,809

Solution 1

Yes, there is. You want to create two cpusets, one with your isolated CPU and the other with all the rest of the CPUs. Assign your special process to the isolated cpuset and all the rest of the processes to the other cpuset.

Here is a simple example script that will do it:

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

Now start your process and find out its PID and go:

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

If you want to revert these changes, just restart your system or do:

# 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

Here is the man page: http://www.kernel.org/doc/man-pages/online/pages/man7/cpuset.7.html

There are also more complicated shell wrappers that can help you automate this, such as cset. See: http://web.archive.org/web/20120428093126/http://www.suse.com/documentation/slerte_11/slerte_tutorial/data/slerte_tutorial.html

Solution 2

You can have a look at this lwn article for a discussion of kernel solution to this problem.

Share:
22,809
Kornel Szymkiewicz
Author by

Kornel Szymkiewicz

Updated on July 31, 2022

Comments

  • Kornel Szymkiewicz
    Kornel Szymkiewicz almost 2 years

    Possible Duplicate:
    how to set CPU affinity of a particular pthread?

    Is there a way in Linux to disable one core for all processes except one process? I would like to have one core reserved only and only for my process.

    Expected behavior is as follows:

    1. Processes which will be spawned after my process, should not see this core and use the others.
    2. When my process is spawned, all processes which are utilizing this core, should be switched to other cores.
  • Kornel Szymkiewicz
    Kornel Szymkiewicz over 12 years
    Thank you for such detailed description:) I'll try your solution.
  • Rodrigo Martins de Oliveira
    Rodrigo Martins de Oliveira over 10 years
    And if I want to undo these changes, how can I do that?
  • sjakobi
    sjakobi over 7 years
    The link to the SUSE tutorial is dead, here's an archived version. cset shield fits my needs perfectly.
  • sunshilong369
    sunshilong369 about 4 years
    @Kornel Szymkiewicz I find this solution does work for threads created by kernel under Ubuntu.Is there any solution?