Linux Setting processor affinity for a certain task or process

by on May 7, 2006 · 35 comments· LAST UPDATED April 12, 2008

in , ,

When you are using SMP (Symmetric MultiProcessing) you might want to override the kernel's process scheduling and bind a certain process to a specific CPU(s).

But what is CPU affinity?

CPU affinity is nothing but a scheduler property that "bonds" a process to a given set of CPUs on the SMP system. The Linux scheduler will honor the given CPU affinity and the process will not run on any other CPUs. Note that the Linux scheduler also supports natural CPU affinity:

The scheduler attempts to keep processes on the same CPU as long as practical for performance reasons. Therefore, forcing a specific CPU affinity is useful only in certain applications. For example, application such as Oracle (ERP apps) use # of cpus per instance licensed. You can bound Oracle to specific CPU to avoid license problem. This is a really useful on large server having 4 or 8 CPUS

Setting processor affinity for a certain task or process using taskset command

taskset is used to set or retrieve the CPU affinity of a running process given its PID or to launch a new COMMAND with a given CPU affinity. However taskset is not installed by default. You need to install schedutils (Linux scheduler utilities) package.

Install schedutils

Debian Linux:
# apt-get install schedutils
Red Hat Enterprise Linux:
# up2date schedutils
OR
# rpm -ivh schedutils*
Under latest version of Debian / Ubuntu Linux taskset is installed by default using util-linux package.

The CPU affinity is represented as a bitmask, with the lowest order bit corresponding to the first logical CPU and the highest order bit corresponding to the last logical CPU. For example:

  • 0x00000001 is processor #0 (1st processor)
  • 0x00000003 is processors #0 and #1
  • 0x00000004 is processors #2 (3rd processor)

To set the processor affinity of process 13545 to processor #0 (1st processor) type following command:
# taskset 0x00000001 -p 13545
If you find a bitmask hard to use, then you can specify a numerical list of processors instead of a bitmask using -c flag:
# taskset -c 1 -p 13545
# taskset -c 3,4 -p 13545

Where,

  • -p : Operate on an existing PID and not launch a new task (default is to launch a new task)

See also:

UPDATED for accuracy.

TwitterFacebookGoogle+PDF versionFound an error/typo on this page? Help us!

{ 35 comments… read them below or add one }

1 triton October 5, 2006 at 1:54 am

How can I check if it is is using only 1 cpu?

Reply

2 nixCraft October 5, 2006 at 7:35 am

Use any one of the following commands:
less /proc/interruptsor
cd /sys/devices/system/cpu
ls
ormpstat

See url

Reply

3 Ricardo Reis May 8, 2007 at 4:17 pm

it should be

taskset -c -p 1 13545

options firts, arguments later. I know, it seems stupid but it is what it is. It only worked like this on my machines (debian)

Reply

4 Erik Bussink June 5, 2007 at 11:03 pm

Hiya, thanks for this very interesting subject. I was looking for something like this, to be able to schedule my VMware Workstation 6.0 to run on my HP xw9400 Workstation Dual-Core Opteron (3&4) under RHEL5 (x86-64).

Reply

5 Ramanath June 21, 2007 at 4:39 pm

Suppose I give this command

root@dialer243:~#taskset -c -p 1 13545

how do I check that the command worked or not!! I mean the cpu affinity was set or not ?

Reply

6 Sutanto Kurniawan September 22, 2007 at 12:11 pm

Ramanath:
You can use the ‘top’ command.

After loading ‘top’ press 1 (one) to switch to SMP view, which will show each CPU usage.

Try assigning CPU intensive program to one of your CPU, and see (in ‘top’) whether the affinity is set or not.

In my system, the program taskset definitely do it’s job. If I don’t use the taskset, the CPU that work on my program is vary from 1 to 4 (I have quad core), when I assign the program to one specific CPU, then only that CPU that has high usage.

Reply

7 Boca December 24, 2007 at 11:12 am

A little odd, but installing schedutils on ubuntu gutsy would remove essential components which is not recommended. However, taskset is available as part of default install.

Reply

8 mike503 February 9, 2008 at 9:34 am

Yeah, taskset is from util-linux. The syntax is now taskset -cp $CPU $PID

Took me a few minutes to figure that one out :) It wants to remove util-linux for schedutils and that has valuable utilities in it. It has taskset anyway. This article might be good to update…

Ubuntu 7.10 gutsy x86_64.

Reply

9 ellis bright April 12, 2008 at 6:27 pm

this is great – i have a java wrapper on a engine written in C++ that crashes whenever the engine is run on more than 1 processor. since all the newer processors are multi-core, i have been running the OS in uniprocessor mode and basically wasting the other cores!
~Ellis http://www.lightspoke.com

Reply

10 InQuest May 6, 2008 at 11:07 pm

Does the taskset do its job on already running processes. I tried but it didn’t work. First I ran 2 identical processes without taskset. They were homogeneously running on all 8 cpus I had. Now, when I tried assigning 2 cpus to 1 and 6 to another, it didn’t work.
I killed the process where I assigned 6 cpus. Still the other was using all 8 cpus.

Reply

11 franchisu July 6, 2008 at 3:53 am

hi guys,
I tried using taskset and schedtool interchangeably, and I noticed that when I’m running virtualbox, which is a cpu intensive process, then I change proc affinity which doesn’t seem to have that big an effect in ‘top’. I change from one proc to another and the output of ‘top’ seems unchanged, while the process is already running. However, if I begin a new cpu intensive process and assign it an affinity before running it, then I can see changes in the output of ‘top’. any clues to this? perhaps my already running virtualbox is too ‘attached’ to its original proc that the linux kernel decides to override/not pay attention to my schedtool/taskset commands?

Reply

12 sobrier July 21, 2010 at 8:27 am

Hi,
Could you tell how you change proc affinity, I have found a long time.
Thank you.

Reply

13 anuu July 29, 2008 at 2:19 pm

anu@el[~]$ taskset -c -p 1 11574
pid 11574’s current affinity list: 0,1
pid 11574’s new affinity list: 1

it works to me
debian etch

great tool to look what proceses are running is
htop

Reply

14 franchisu July 29, 2008 at 2:35 pm

Actually, it evidently works especially when I set a process’ affinity before running the process. I noticed that while running a cpu or memory intensive task such as Virtual box or VMware, alternating/changing processor affinity doesn’t seem as evident as my previous example. Anyone noticed this? Perhaps it has something to do with the Linux kernel overriding the manual affinity changing since the kernel knows how to better handle processes and it probably knows that there will be performance hits when moving processes such as VMware/Virtualbox from one proc to another (e.g. cache hit rate etc) ?

Reply

15 Angelina November 8, 2008 at 2:17 pm

Hi,

How to use task set before the process started?

Example: when I start oracle db, I want to use only 2 CPU2 for oracle DB processes. In this point I do not know what is PID.

Oracle says, if you use 4 CPUs at ANY point of time, you should pay oracle license for 4 CPUs.

Please help me … I do not want to setup kernel maxcpus parameter because I will loose CPUs …I want to use them for some other processes.

Regards,
Angelina

Reply

16 nixCraft November 8, 2008 at 4:03 pm

Angelina,

Try following for 2 cpu
taskset -c 0,1 /etc/init.d/oracle-xe start
OR
su - oracle
taskset -c 0,1 lsnrctl start
taskset -c 0,1 dbstart

OR
taskset -c 0,1 sqlplus '/ as sysdba'
And at SQL prompt type:
startup

HTH

Reply

17 Thiru December 12, 2008 at 12:46 am

This is very cool!
One question though: Once you bind a process to certain processors, are those processors dedicated for this process alone? Do other processes use these processors?

Reply

18 Ankit Singh December 15, 2008 at 9:06 am

Ramanath
when you run the command
ankit@hover2:~$ taskset -c -p 0 6369
pid 6369’s current affinity list: 0,1
pid 6369’s new affinity list: 0

0 & 1 is the two cores of my dual core CPU which I changed the affinity to core 0. The above mesg. clearly shows the the affinity was changed to core 0 from core 0,1.

A great article. Keep it up.

Ankit Singh

Reply

19 kishore August 12, 2014 at 5:43 am

how to change affinity

Reply

20 reavers January 5, 2009 at 3:37 pm

How you can unbind a process from the selected processor affinity?
I mean, if you don’t want keep the affinity on a process all time, how can you unbind the established affinity between the processor and the process?
Something like:
taskset -c -p Idprocess?
or
taskset -c * -p Idprocess?
or
taskset -c 0,1,2,3 -p Idprocess?

Reply

21 Jakob Engblom January 28, 2009 at 8:55 pm

What are the key guts needed to make this work? I want to put this into a busybox-based embedded system… where apt-get won’t help me at all. I need to statically get it compiled onto the never-changing initrd…

Reply

22 Bernardo B.L. March 18, 2009 at 3:29 pm

Nixcraft,

This was a very helpful post. It solved part of my problems. But I still have another problem:
How do I know in each processor a current process is running into.
For instance I have a quadcore machine and want to know if the process with pid 999 is running in the cpu 0, 1, 2 or 3.
top command shows only the processor average utilization by this pid but don’t show each cpu is this.
Taskset let me bound a task to a CPU, but yet i don’t know each cpu this process was previously running into.

thanks

Reply

23 Bernardo B.L. March 18, 2009 at 3:42 pm

Just found the solution
ps -eo psr,pid

this gives the processor in each the pid is current assigned to.

Reply

24 mahes September 15, 2009 at 12:03 pm

kool stuff – it helped me a lot .thankx in advance
i am in need of running a application wit the same cofnfig file , but in different processor .
even though i run both pairs in different proccessor (as per ur taskset commands) . both are crashin in the sense if i change something in 1 pair it gets reflected in other..can t they be prevented.

pls help me throu

Reply

25 chango October 22, 2009 at 4:56 am

I hava a proccess with forks, child process will have the same affinity ??.

Thanks :D

Reply

26 JuanPablo November 8, 2009 at 2:03 am

how asign a processor to specific user ?

many thanks.

Reply

27 kannan November 9, 2009 at 9:41 am

taskset -p option pid
option 1 means 1st processor
option 2 means 2nd processor
option 0xffffffff means all the processor

Reply

28 Anderson June 27, 2011 at 1:15 pm

Thanks nixcraft!
Very useful!
Congrats!

Reply

29 JM August 5, 2011 at 1:23 pm

I hawe quad core cpu, and if i want to all linux processes use only 2 cores? What is the right syntax?
Now i have in /etc/init.d/rcS:

/usr/bin/taskset -p 1 1
/usr/bin/taskset -p 1 $$

this sett all proccess to first core, but now i want alocate 2 cores for all proccess

Reply

30 Cyenne February 7, 2012 at 8:38 am

Hi Tony,I have a CentOS 5.7 w/ cPanel 11.30 + ngxcinp plugin. I want to move over to CloudLinux + LiteSpeed. What would you suggest me:a) setup a new server with CentOS 6 -> Install cPanel -> Move customers over -> Upgrade to CloudLinux 6 orb) stay with CentOS 5.7 and upgrade to CloudLinux directly from there?I’ve read that theres no upgrade path between RHEL5 -> RHEL6 and as such nor for CentOS or CloudLinux. Which version do you run on your servers? 5.x or 6.x?Thanks in advance

Reply

31 anbu July 20, 2012 at 12:35 pm

when tried to bind it’s giving

taskset 0x00000001 -p 6268
execvp: No such file or directory
failed to execute -p

please help me!

Reply

32 kirti July 28, 2012 at 8:34 am

Hie..
the same error was encountered by me also..
Please try using

taskset -pc 0,1,2..x(i.e. CPU number) 6268

it works!!

Reply

33 BD April 27, 2013 at 4:46 pm

I had the same result. The syntax in the example is incorrect.
It should be as follows:
taskset -p 0×00000001 6268

Reply

34 Kisho December 10, 2012 at 10:34 am

On Debian Squeeze and newer you need to use “-pc” instead of “-c cpu -p id”
For example:
root@debiansqueeze:~# taskset -c 3 -p 5563
execvp: No such file or directory
failed to execute -p

root@debiansqueeze:~# taskset -pc 3 5563
pid 5563’s current affinity list: 3
pid 5563’s new affinity list: 3

Reply

35 Ivan Petrov January 28, 2013 at 11:20 am

Is it possible by default to assign all specific processes to specific CPU’s.
For example, I want to assign all java processes to CPU 0-1 and all HTTPD proccesses to 2-7.

Reply

Leave a Comment

Tagged as: , , , , , , , , , , , , , , ,

Previous post:

Next post: