Probablemente estéis pensando que nadie en su sano juicio desactivaría procesadores. Bueno, hay razones para hacerlo: ahorro energético o cambiarlo físicamente porque se ha estropeado.
¿Cómo se hace esto? Pues es muy sencillo desactivar CPUs en Linux (siempre y cuando seas root, claro ;)
Os lo voy a contar usando mi portátil del trabajo, un Lenovo T400 que tiene un dual core, concretamente:
[root@currotop ~]# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 23
model name : Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz
stepping : 10
cpu MHz : 800.000
cache size : 3072 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
bogomips : 4789.94
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:
processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 23
model name : Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz
cpu MHz : 800.000
cache size : 3072 KB
physical id : 0
siblings : 2
core id : 1
cpu cores : 2
apicid : 1
initial apicid : 1
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc arch_perfmon pebs bts rep_good pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm ida tpr_shadow vnmi flexpriority
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:
Más concretamente: 1 x Intel Core2 Duo CPU P8600 a 2.4 GHz. Aunque también lo he probado en un MSI Wind con un dual core Atom. Nop, en el trabajo no me han dejado experimentar con los servidores :(
Lo primero que tienes que saber es cuántas CPUs tienes, eso es fácil:
[root@currotop ~]# cat /proc/interrupts | grep CPU
CPU0 CPU1
Si ahora comprobamos nuestro comando dmesg, veremos que efectivamente tenemos 2 cores:
CPU0 attaching NULL sched-domain.
CPU1 attaching NULL sched-domain.
CPU0 attaching sched-domain:
domain 0: span 0-1 level MC
groups: 0 1
domain 1: span 0-1 level CPU
groups: 0-1 (__cpu_power = 2048)
CPU1 attaching sched-domain:
domain 0: span 0-1 level MC
groups: 1 0
domain 1: span 0-1 level CPU
groups: 0-1 (__cpu_power = 2048)
También es aconsejable revisar el messages de nuestro sistema, para ello, el comando:
tail /var/log/messages.log
nos viene muy bien en otra consola.
Siguente paso: desactivar un core. Tecleamos:
echo 0 > /sys/devices/system/cpu/cpu1/online
Y ya está, desactivado el core #1. Para comprobarlo, miramos la salida del comando dmesg y vemos:
SMP alternatives: switching to UP code
CPU0 attaching NULL sched-domain.
CPU1 attaching NULL sched-domain.
CPU0 attaching NULL sched-domain
Y el messages nos muestra:
Dec 1 11:37:37 currotop kernel: CPU 1 is now offline
Dec 1 11:37:37 currotop kernel: SMP alternatives: switching to UP code
Yo tengo la costumbre de tener el gkrellm ejecutándose y veo que no ha desaparecido el monitor para la CPU1, pero sí veo que ya no muestra gráfica ;)
Ahora queremos activar de nuevo el core que hemos desactivado, a ver, ¿a quién se le ocurre cómo hacerlo? Efectivamente:
echo 1 > /sys/devices/system/cpu/cpu1/online
Y el dmesg nos dice:
SMP alternatives: switching to SMP code
Booting processor 1 APIC 0x1 ip 0x6000
Initializing CPU#1
Calibrating delay using timer specific routine.. 4790.68 BogoMIPS (lpj=7980290)
CPU: L1 I cache: 32K, L1 D cache: 32K
CPU: L2 cache: 3072K
CPU: Physical Processor ID: 0
CPU: Processor Core ID: 1
mce: CPU supports 6 MCE banks
CPU1: Thermal monitoring enabled (TM2)
x86 PAT enabled: cpu 1, old 0x7040600070406, new 0x7010600070106
CPU1: Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz stepping 0a
CPU0 attaching NULL sched-domain.
CPU0 attaching sched-domain:
domain 0: span 0-1 level MC
groups: 0 1
domain 1: span 0-1 level CPU
groups: 0-1 (__cpu_power = 2048)
CPU1 attaching sched-domain:
domain 0: span 0-1 level MC
groups: 1 0
domain 1: span 0-1 level CPU
groups: 0-1 (__cpu_power = 2048)
Y su amigote el messages nos dice que:
Dec 1 11:42:06 currotop kernel: SMP alternatives: switching to SMP code
Dec 1 11:42:06 currotop kernel: Booting processor 1 APIC 0x1 ip 0x6000
Dec 1 11:42:06 currotop kernel: Calibrating delay using timer specific routine.. 4790.68 BogoMIPS (lpj=7980290)
Dec 1 11:42:06 currotop kernel: CPU: L1 I cache: 32K, L1 D cache: 32K
Dec 1 11:42:06 currotop kernel: CPU: L2 cache: 3072K
Dec 1 11:42:06 currotop kernel: CPU: Physical Processor ID: 0
Dec 1 11:42:06 currotop kernel: CPU: Processor Core ID: 1
Dec 1 11:42:06 currotop kernel: mce: CPU supports 6 MCE banks
Dec 1 11:42:06 currotop kernel: CPU1: Thermal monitoring enabled (TM2)
Dec 1 11:42:06 currotop kernel: x86 PAT enabled: cpu 1, old 0x7040600070406, new 0x7010600070106
Bieeeeeeeeeen :) Ya tenemos el core otra vez en su sitio, ¿gkrellm? Me vuelven a aparecerlos colorines de las gráficas. Ah, la vida es bella ;) Os pongo una captura de cuando he desactivado y de cuando he vuelto a activar el core:
Y ahora la volvemos a activar:
Ahora en serio, ¿por qué querría yo, como usuario de portátil/PC desactivar un core? Muy sencillo, especialmente para portátiles y Netbooks: consumo de batería. Tengamos en cuenta que las tareas de «escritorio» no suelen sacar grandes ventajas de tener muchos cores. Fijaos que he dicho «no suelen», que no es lo mismo que «no sacan», es decir, no es un «no» tajante. Para aquellos que editen audio/vídeo, estén haciendo cálculos HPC, estén corriendo grandes BBDD en sus portátiles y/o Netbooks, sí sacarán mejor rendimiento al tener muchos cores. Si lo que estás haciendo es algo de ofimática, e-mail, navegar y escuchar un par de canciones (a lo mejor tomarte un rato libre y ver alguna peli o serie), … y estás tirando de batería, no viene mal desactivar un core y ahorrar batería hasta que encontremos un enchufe ;)
Obviamente, esto es cuestión de gustos y manías.