3

Ativando e Desativando CPU’s sob demanda

Olá pessoal,
Após 1 semana sem escrever algum post (semana corrida) hoje irei demonstrar como podemos ativar ou desativar CPU’s sob demanda no seu linux.
Antes de começarmos, necessitamos checar se o kernel utilizado tem suporte a CPU Hotplug ( o kernel do Red Hat Entreprise Linux e o Fedora 11 tem).

[root@mmello boot]# grep HOTPLUG config-2.6.18-164.el5   | grep -v PCI
CONFIG_HOTPLUG=y
CONFIG_HOTPLUG_CPU=y
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
CONFIG_ACPI_HOTPLUG_CPU=y
[root@mmello boot]# uname -a
Linux mmello.gru.redhat.com 2.6.18-164.2.1.el5xen #1 SMP Mon Sep 21 04:52:16 EDT 2009 i686 i686 i386 GNU/Linux
[root@mmello boot]#

Pronto!!! Se seu kernel tem esse suporte, podemos começar a brincar com as CPU’s, entretanto se o kernel utilizado não tem suporte, você pode adicionar o suporte.
Q: How to i enable my kernel to support CPU hotplug?
A: When doing make defconfig, Enable CPU hotplug support

   “Processor type and Features” -> Support for Hotpluggable CPUs
   Make sure that you have CONFIG_HOTPLUG, and CONFIG_SMP turned on as well.
You would need to enable CONFIG_HOTPLUG_CPU for SMP suspend/resume support as well.
Fonte: /usr/share/doc/kernel-doc-*/Documentation/cpu-hotplug.txt
 Visualizando a quantidade de CPUs utilizados no momento: 

[root@mmello cpu]# cd /sys/devices/system/cpu/
[root@mmello cpu]# ls
cpu0  cpu1
[root@mmello cpu]# cat /proc/cpuinfo  | grep -e processor -e “model name”
processor       : 0
model name      : Genuine Intel(R) CPU           T2400  @ 1.83GHz
processor       : 1
model name      : Genuine Intel(R) CPU           T2400  @ 1.83GHz
[root@mmello cpu]#
[root@mmello cpu]# cat /proc/interrupts
           CPU0              CPU1             
  1:      15838          0        Phys-irq  i8042
  8:          1          0        Phys-irq  rtc
  9:      15563          0        Phys-irq  acpi
 12:    1419340          0        Phys-irq  i8042
 14:     196343          0        Phys-irq  ide0
 16:          2          0        Phys-irq  yenta, uhci_hcd:usb2, radeon@pci:0000:01:00.0
 21:         27          0        Phys-irq  ehci_hcd:usb1, uhci_hcd:usb5
 22:       1635          0        Phys-irq  uhci_hcd:usb3, HDA Intel
 23:          0          0        Phys-irq  uhci_hcd:usb4
248:     563615       4974        Phys-irq  iwl3945
249:      11012          0        Phys-irq  peth0
250:     111120          0        Phys-irq  ahci
256:    3211767          0     Dynamic-irq  timer0
257:     456846          0     Dynamic-irq  resched0
258:         51          0     Dynamic-irq  callfunc0
259:          0     725421     Dynamic-irq  resched1
260:          0        123     Dynamic-irq  callfunc1
261:          0    1709771     Dynamic-irq  timer1
262:        771          0     Dynamic-irq  xenbus
263:          0          0     Dynamic-irq  console
264:          2          0     Dynamic-irq  vif1.0
265:          1          0     Dynamic-irq  blkif-backend
NMI:          0          0
LOC:          0          0
ERR:          0
MIS:          0

 Como podemos perceber, dentro do diretório /sys/devices/system/cpu existem 2 diretórios (cpu0 e cpu1) que na verdade refletem a quantidade de CPU’s reconhecida pelo kernel.
Um detalhe interessante é que dentro do diretório /sys/devices/system/cpu/cpu0 não existe o arquivo online, pois a CPU0 é utilizada para iniciar outros componentes de hardware.

[root@mmello cpu0]# pwd
/sys/devices/system/cpu/cpu0
[root@mmello cpu0]# ls
cache  cpufreq  crash_notes  topology
[root@mmello cpu0]# cd ../cpu1/
[root@mmello cpu1]# ls
cache  cpufreq  crash_notes  online  topology
[root@mmello cpu1]#

Para desligar a CP
U, basta alterarmos o valor do arquivo online e o kernel irá desligar essa CPU sendo totalmente ignorada pelo sistema.

[root@mmello cpu1]# pwd
/sys/devices/system/cpu/cpu1
[root@mmello cpu1]# ls
cache  cpufreq  crash_notes  online  topology
[root@mmello cpu1]# cat online
1
[root@mmello cpu1]# echo 0 > online
[root@mmello cpu1]# cat /proc/cpuinfo  | grep -e processor -e “model name”
processor       : 0
model name      : Genuine Intel(R) CPU           T2400  @ 1.83GHz
[root@mmello cpu1]# cat /proc/interrupts
           CPU0             
  1:      18028        Phys-irq  i8042
  8:          1        Phys-irq  rtc
  9:      15808        Phys-irq  acpi
 12:    1459630        Phys-irq  i8042
 14:     199799        Phys-irq  ide0
 16:          2        Phys-irq  yenta, uhci_hcd:usb2, radeon@pci:0000:01:00.0
 21:         27        Phys-irq  ehci_hcd:usb1, uhci_hcd:usb5
 22:       1657        Phys-irq  uhci_hcd:usb3, HDA Intel
 23:          0        Phys-irq  uhci_hcd:usb4
248:     572614        Phys-irq  iwl3945
249:      11206        Phys-irq  peth0
250:     111818        Phys-irq  ahci
256:    3282320     Dynamic-irq  timer0
257:     479545     Dynamic-irq  resched0
258:         51     Dynamic-irq  callfunc0
262:        771     Dynamic-irq  xenbus
263:          0     Dynamic-irq  console
264:          2     Dynamic-irq  vif1.0
265:          1     Dynamic-irq  blkif-backend
NMI:          0
LOC:          0
ERR:          0
MIS:          0
[root@mmello cpu1]#


Agora sim!!! :)   O kernel esta reconhecendo somente 1 processador (core) em meu sistema e fez o recálculo das IRQ’s e dos processos para serem executados somente pela CPU0.
Para habilitar novamente a CPU1, basta alterar o arquivo online para 1.
[root@mmello cpu1]# pwd
/sys/devices/system/cpu/cpu1
[root@mmello cpu1]# ls
crash_notes  online
[root@mmello cpu1]# cat online
0
[root@mmello cpu1]# echo 1 > online
[root@mmello cpu1]# cat /proc/cpuinfo  | grep -e processor -e “model name”
processor       : 0
“background-color: #eeeeee; color: black;” />model name      : Genuine Intel(R) CPU           T2400  @ 1.83GHz
processor       : 1
model name      : Genuine Intel(R) CPU           T2400  @ 1.83GHz
[root@mmello cpu1]# cat /proc/interrupts
           CPU0              CPU1             
  1:      19194          0        Phys-irq  i8042
  8:          1          0        Phys-irq  rtc
  9:      15923          0        Phys-irq  acpi
 12:    1467238          0        Phys-irq  i8042
 14:     201365          0        Phys-irq  ide0
 16:          2          0        Phys-irq  yenta, uhci_hcd:usb2, radeon@pci:0000:01:00.0
 21:         27          0        Phys-irq  ehci_hcd:usb1, uhci_hcd:usb5
 22:       1660          0        Phys-irq  uhci_hcd:usb3, HDA Intel
 23:          0          0        Phys-irq  uhci_hcd:usb4
248:     576780       4974        Phys-irq  iwl3945
249:      11294          0        Phys-irq  peth0
250:     112381          0        Phys-irq  ahci
256:    3316395          0     Dynamic-irq  timer0
257:     480164          0     Dynamic-irq  resched0
258:         51          0     Dynamic-irq  callfunc0
259:          0     761653     Dynamic-irq  resched1
260:          0        123     Dynamic-irq  callfunc1
261:          0    1759641     Dynamic-irq  timer1
262:        771          0     Dynamic-irq  xenbus
263:          0          0     Dynamic-irq  console
264:          2          0     Dynamic-irq  vif1.0
265:          1          0     Dynamic-irq  blkif-backend
NMI:          0          0
LOC:          0          0
ERR:          0
MIS:          0

[root@mmello cpu1]#

No próximo post, demonstrarei como podemos dedicar algumas CPU’s para tarefas/processos específicos no sistema, como por exemplo, executar o Oracle em um processador físico com exclusividade em uma máquina bi-processada por exemplo.

Era isso aí!!!
Abraços.