Ativando e desativando CPUs sob demanda

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

[ Hits: 7.040 ]

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, 
				  [email protected]: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, [email protected]: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, 
			 	  [email protected]: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

Atualizando o seu Fedora com o Preupgrade

Tunando o sistema de arquivos - entendendo o journal do EXT3

Dedicando uma CPU para processos específicos

Utilizando o RPM como ferramenta de recovery e auditoria

Ataque de dicionário com OpenSSL - quebrando senhas

Leitura recomendada

Recompilando o kernel do Linux

Economizando energia de laptop com processador multicore

Sidux com kernel 2.6.29 atualizado por script smxi

Driver da nvidia em mais de um kernel no Slackware

Atualização do Kernel no Ubuntu Server 14.04 LTS

  

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
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts