Ativando e desativando CPUs sob demanda

Publicado por Marcelo Moreira de Mello em 26/10/2009

[ Hits: 7.679 ]

Blog: http://tchellomello.blogspot.com

 


Ativando e desativando CPUs sob demanda



Olá pessoal,

Nesta dica demonstrarei como podemos ativar ou desativar CPUs 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).

# 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
# 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

Pronto! Se seu kernel tem esse suporte, podemos começar a brincar com as CPUs, 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:

# cd /sys/devices/system/cpu/
# ls

cpu0 cpu1
# 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

# 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 CPUs reconhecidas 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.

# pwd
/sys/devices/system/cpu/cpu0
# ls
cache cpufreq crash_notes topology
# cd ../cpu1/
# ls

cache  cpufreq  crash_notes  online  topology

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

# pwd
/sys/devices/system/cpu/cpu1
# ls
cache cpufreq crash_notes online topology
# cat online
1
# echo 0 > online
# cat /proc/cpuinfo | grep -e processor -e "model name"
processor       : 0
model name      : Genuine Intel(R) CPU           T2400  @ 1.83GHz
# 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

Agora sim!!! :)
O kernel está reconhecendo somente 1 processador (core) em meu sistema e fez o recálculo das IRQs e dos processos para serem executados somente pela CPU0.

Para habilitar novamente a CPU1 basta alterar o arquivo online para 1.

# pwd
/sys/devices/system/cpu/cpu1
# ls
crash_notes online
# cat online
0
# echo 1 > online
# 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
# 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

Espero em breve demonstrar como podemos dedicar algumas CPUs para tarefas/processos específicos no sistema, como por exemplo, executar o Oracle em um processo físico com exclusividade em uma máquina biprocessada por exemplo.

Era isso aí!

Outras informações em: http://tchellomello.blogspot.com

Abraços.

Outras dicas deste autor

Ataque de dicionário com OpenSSL - quebrando senhas

Dedicando uma CPU para processos específicos

Atualizando o seu Fedora com o Preupgrade

Utilizando o RPM como ferramenta de recovery e auditoria

Tunando o sistema de arquivos - entendendo o journal do EXT3

Leitura recomendada

Problema com ALSA após atualização do Debian Lenny 5

Kernel 3.19.3-smp no Slackware Current

Como inserir o Tux/TuxDebian durante o boot do Debian

NFtables – O Sucessor do IPtables (já no kernel 3.13)

High System Timer Resolution

  

Comentários
[1] Comentário enviado por removido em 26/10/2009 - 18:01h

Demais! Espero a próxima dica sobre como dedicar as CPUs!

[2] Comentário enviado por SMarcell em 27/10/2009 - 09:47h

Complementando

Também é possível via 'cpufrequtils' configurar o sistema para ajustar a frequência da CPU de acordo com a demanda necessária.

[3] Comentário enviado por Nanna em 02/11/2009 - 15:54h

Boa!

[4] Comentário enviado por albfneto em 05/11/2009 - 00:28h

ué, em linux,pouca gente faz como eu..
joga tudo na alta performance, o máximo possível e ainda um pouco overclocado



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts