Last updated on October 29, 2020 by Dan Nanni
As multi-core CPUs become increasingly popular on server-grade hardware as well as end-user desktop PCs or laptops, there have been growing efforts in the community (e.g., in terms of programming models, compiler or operating system support) towards developing applications optimized for multi-core architecture.
One operating system (OS) support often exploited to run performance-critical applications on multi-core processors is so-called processor affinity or CPU pinning. This is an OS-specific feature that binds a running process or program to particular CPU core(s).
Binding a program to specific CPU cores can be beneficial in several scenarios. For example, when an application with highly cache-bound workload runs together with other CPU-intensive jobs, pinning the application to a specific CPU would reduce CPU cache misses. Also, when two processes communicate via shared memory intensively, scheduling both processes on the cores in the same NUMA domain would speed up their performance.
This tutorial describes how to run a program or process on specific CPU cores on Linux.
To assign particular CPU cores to a program or process, you can use
taskset, a command line tool for retrieving or setting a process' CPU affinity on Linux.
taskset tool is part of
util-linux package in Linux, and most Linux distros come with the package pre-installed by default. If
taskset is not available on your Linux system (like in minimal Docker containers), install it as follows.
taskseton Debian, Ubuntu or Linux Mint
$ sudo apt-get install util-linux
taskseton CentOS, Fedora or RHEL
$ sudo yum install util-linux
To retrieve the CPU affinity information of a process, use the following command. Note that
taskset returns the current CPU affinity in a hexadecimal bitmask format.
$ taskset -p <PID>
For example, to check the CPU affinity of a process with PID 2915:
$ taskset -p 2915
pid 2915's current affinity mask: ff
In this example, the returned affinity (represented in a hexadecimal bitmask) corresponds to
11111111 in binary format, which means the process can run on any of eight different CPU cores (from 0 to 7).
The lowest bit in a hexadecimal bitmask corresponds to core ID 0, the second lowest bit from the right to core ID 1, the third lowest bit to core ID 2, etc. So for example, a CPU affinity
0x11 represents CPU core 0 and 4.
taskset can show CPU affinity as a list of processors instead of a bitmask, which is easier to read. To use this format, run
-c option. For example:
$ taskset -cp 2915
pid 2915's current affinity list: 0-7
taskset, you can pin (or assign) a running process to particular CPU core(s). For that, use the following command.
$ taskset -p <COREMASK> <PID> $ taskset -cp <CORE-LIST> <PID>
For example, to assign a process to CPU core 0 and 4, do the following.
$ taskset -p 0x11 9030
pid 9030's current affinity mask: ff pid 9030's new affinity mask: 11
$ taskset -cp 0,4 9030
-c option, you can specify a list of numeric CPU core IDs separated by commas, or even include ranges (e.g., 0,2,5,6-10).
Note that in order to be able to change the CPU affinity of a process, a user must have
CAP_SYS_NICE capability. Any user can view the affinity mask of a process.
taskset also allows you to launch a new program as pinned to specific CPU cores. For that, use the following command.
$ taskset <COREMASK> <EXECUTABLE>
For example, to launch
vlc program on a CPU core 0, use the following command.
$ taskset 0x1 vlc
taskset allows a particular program to be assigned to certain CPUs, that does not mean that no other programs or processes will be scheduled on those CPUs. If you want to prevent this and dedicate a whole CPU core to a particular program, you can use
isolcpus kernel parameter, which allows you to reserve the CPU core during boot.
Add the kernel parameter
isolcpus=<CPU_ID> to the boot loader during boot or GRUB configuration file. Then the Linux scheduler will not schedule any regular process on the reserved CPU core(s), unless specifically requested with
taskset. For example, to reserve CPU cores 0 and 1, add
isolcpus=0,1 kernel parameter. Upon boot, then use
taskset to safely assign the reserved CPU cores to your program.
Please note that this article is published by Xmodulo.com under a Creative Commons Attribution-ShareAlike 3.0 Unported License. If you would like to use the whole or any part of this article, you need to cite this web page at Xmodulo.com as the original source.