Ativando e desativando CPUs sob demanda
Dica publicada em Linux / Kernel
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"
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"
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"
Era isso aí!
Outras informações em: http://tchellomello.blogspot.com
Abraços.
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.