Linux Hotplug a CPU

by on April 2, 2009 · 19 comments· LAST UPDATED April 2, 2009

in , ,

How do I hotplug a CPU on a running Linux system? I would like to dynamically enable or disable a CPU on a running system?

Linux kernel does supports cpu-hotplug mechanism. You can enable or disable CPU without a system reboot. CPU hotplug is not just useful to replace defective components it can also be applied in other contexts to increase the productivity of a system. For example on a single system running multiple Linux partitions, as the workloads change it would be extremely useful to be able to move CPUs from one partition to the next as required without rebooting or interrupting the workloads. This is known as dynamic partitioning. Other applications include Instant Capacity on Demand where extra CPUs are present in a system but aren't activated. This is useful for customers that predict growth and therefore the need for more computing power but do not have at the time of purchase the means to afford.

List all current cpus in the system

Type the following command:
# cd /sys/devices/system/cpu
# ls -l

Sample output:

total 0
drwxr-xr-x 4 root root    0 Apr  2 12:03 cpu0
drwxr-xr-x 4 root root    0 Feb 15 07:06 cpu1
drwxr-xr-x 4 root root    0 Feb 15 07:06 cpu2
drwxr-xr-x 4 root root    0 Feb 15 07:06 cpu3
drwxr-xr-x 4 root root    0 Feb 15 07:06 cpu4
drwxr-xr-x 4 root root    0 Feb 15 07:06 cpu5
drwxr-xr-x 4 root root    0 Feb 15 07:06 cpu6
drwxr-xr-x 4 root root    0 Feb 15 07:06 cpu7
-rw-r--r-- 1 root root 4096 Apr  2 12:03 sched_mc_power_savings

Under each directory you would find an "online" file which is the control file to logically online/offline a processor.

How do I logically turn off (offline) cpu#6 ?

Type the following command:
# echo 0 > /sys/devices/system/cpu/cpu6/online
# grep "processor" /proc/cpuinfo

How do I logically turn on (online) cpu#6 ?

Type the following command:
# echo 1 > /sys/devices/system/cpu/cpu6/online
# grep "processor" /proc/cpuinfo

Once done, you can can actually remove CPU if your BIOS and vendor supports such operation.

Further readings:

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

{ 19 comments… read them below or add one }

1 Akshay Sulakhe April 3, 2009 at 1:57 pm

How to do such a similar thing for a hard disk…Juts unmount it or anything else is necessaey to remove and then add other???

Reply

2 nixCraft April 3, 2009 at 2:29 pm

Just unmount it and if it is hotplug just replace it.

Reply

3 Miker April 3, 2009 at 2:32 pm

I’m really curious about this. Can anyone comment if they’ve actually tried it? I’m not sure if any of the x86_(64) systems I’ve ever worked with support this capability – anyone know of systems that do?

Reply

4 nixCraft April 3, 2009 at 3:01 pm

You need high end servers such as IBM Power6 series to actually add or remove CPU / memory without rebooting the server. This is called Capacity Upgrade on Demand (CUoD). Other vendor such as Sun and HP also provides the same stuff. Your average server only support hard disk hot-plug. Another example is HP ProLiant ML570 G2 business server powered by Intel Xeon CPUs. Ask, your vendor for CUoD aware server and you will get the list. Be prepared to pay extra for all these fancy features ;)

HTH

Reply

5 jrush April 19, 2009 at 1:09 pm

It’s really works !
On my desktop Atom 330 (dual core + hyperthreading = 4 CPU), i can disable 3 CPUs of 4 :)

Reply

6 Stephan April 19, 2009 at 3:57 pm

I tried to offline a core in my i386 (kernel 2.6), but I was notified a permission denied.

stefano@stefano-laptop:~$ echo 1 > /sys/devices/system/cpu/cpu1/online
bash: /sys/devices/system/cpu/cpu1/online: Permission denied
stefano@stefano-laptop:~$ sudo echo 1 > /sys/devices/system/cpu/cpu1/online
bash: /sys/devices/system/cpu/cpu1/online: Permission denied

Can anybody tell me y? Is it by default enabled in the latest versions?
Thx

S.

Reply

7 nixCraft April 19, 2009 at 4:03 pm

You must be root user to hotplug a CPU.

Reply

8 Stephan April 20, 2009 at 7:34 am

I also tried with sudo, as I reported in the post, but didn’t work.
Moreover, in visudo I’ve set:

stefano ALL=(ALL) ALL

Thx.

S.

Reply

9 Callan Bryant August 9, 2010 at 3:17 pm

sudo does not support the > operator
Run the command using sudo -i to get an interactive prompt first

Reply

10 Stephan April 20, 2009 at 11:03 am

Ok, I’v managed.
Thx.
S.

Reply

11 Anonymous June 15, 2010 at 12:16 pm

Could you please tell us how you managed, I get the same error “access denied” when run as root

Reply

12 mangoo July 1, 2009 at 9:42 am

Not only high-end servers – CPU/memory hotplugging is often used in virtualized systems.

Reply

13 Fabian Kempers September 8, 2009 at 11:15 am

I have put cpu 1 to 3 offline.
When I online a cpu I get the following message:
(root @ rhel5)
# echo 1 > /sys/devices/system/cpu/cpu1/online
-bash: echo: write error: Invalid argument

Anyone else got the same message and a solution to this problem?

Reply

14 VA_DOS December 21, 2010 at 8:53 pm

It works. But system will crash if you unplugging CPU or core which currently busy by some process.

I’m looking at taskset utility to resolve this problem

Reply

15 Martin Dimitrov February 7, 2011 at 10:04 pm

I also get the same problem: “echo: write error: Invalid argument”
Did anyone find a resolution for this?

Thank you

Reply

16 Alex June 23, 2011 at 1:46 am

For the people confused by “echo: write error: Invalid argument”: Is the CPU already enabled (if trying to enable it) or disabled (if trying to disable it)? AFAICT, the kernel produces an error when you try to put the CPU in the state it is already in, instead of just ignoring the request.

For the people getting permission errors:
Use “echo 0 | sudo tee /sys/devices/system/cpu/cpu6/online” instead of “sudo echo 0 > /sys/devices/system/cpu/cpu6/online”.

As Vivek points out, you need to be root to hotplug a CPU. You might think “But I used sudo”. However, when you use “>”, bash (or your shell, if you use something else) is responsible for opening the file that you’re trying to write to, and then setting that opened file as the destination for stdout (file descriptor 1). bash will then execute “sudo echo 0″, which will cause sudo to do its magic and run “echo 0″ as root. Unfortunately, bash isn’t running as root, so it will fail to open /sys/devices/system/cpu/cpu6/online.

By instead piping the output of the echo to sudo tee, tee becomes responsible for opening the file and writing to it. Since tee is run under sudo, it can actually succeed.

Reply

17 minxia January 14, 2013 at 10:08 pm

I only have a file

/sys/devices/system/cpu/online that contains the id of cores like that 0-15. How can I disable one of cores? How can I know online cores number by shell script commands?

Minxia

Reply

18 Cristian March 14, 2013 at 5:46 am

Does anyone know if this actually de-energises the CPU? In other words, does the disabled core/processor still use power?

Reply

19 Sam Mingo December 5, 2014 at 6:26 pm

See this doc for more on this feature. https://www.kernel.org/doc/Documentation/cpu-hotplug.txt

Q: Why can’t i remove CPU0 on some systems?
A: Some architectures may have some special dependency on a certain CPU.

For e.g in IA64 platforms we have ability to sent platform interrupts to the
OS. a.k.a Corrected Platform Error Interrupts (CPEI). In current ACPI
specifications, we didn’t have a way to change the target CPU. Hence if the
current ACPI version doesn’t support such re-direction, we disable that CPU
by making it not-removable.

In such cases you will also notice that the online file is missing under cpu0.

Reply

Leave a Comment

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

Previous Faq:

Next Faq: