Adicionando CPU e memória em máquinas virtuais sem reboot

Quem administra ambiente virtual já deve ter se deparado com a necessidade de aumentar a memória ou a quantidade de CPUS em algumas máquinas. Em ambientes como Vmware e Virtualbox isso é feito com meia dúzia de cliques na interface administrativa … e um reboot na máquina virtual 🙁

Mas saiba que este reboot não é necessário, bastam duas regras no udev ou então um script que pode ser invocado manualmente para que o sistema operacional da sua VM reconheça as mudanças.

Como tudo no ambiente posix é baseado no conceito de arquivos e diretórios, mesmo no caso de dispositivos de hardware como CPU e memória que é nosso interesse, o processo acaba sendo bem simples.

Lidando com a memória

Basicamente, quando você adiciona mais memória a sua VM este novo volume de RAM é registrado em /sys/devices/system/memory/memory* onde “memory*” é um diretório numerado sequencialmente e corresponde a configuração de “blocos” de memória. Dentre os arquivos que estão ali temos um em especial que nos interessa e de nome bastante sugestivo “online”.

Se o conteúdo deste arquivo é “1” a memória está ativa (tudo o que você consegue ver com top, free etc), já se o conteúdo é “0” significa que aquele bloco de memória foi adicionado mas não está ativo.

Para ativar este bloco de memória então basta que você altere o valor deste arquivo ou do arquivo “state” que pode ter o valor “offline” ou “online”.

ex.: Digamos que acabei de adicionar mais memória na minha VM pelo vCenter ou pelo ESXi Console etc. Esta memória não estará imediatamente disponível porque os blocos adicionados estarão offline. Uma forma de saber quais são eles é usar o comando abaixo:

# grep 0 /sys/devices/system/memory/memory*/online
/sys/devices/system/memory/memory44/online:0
/sys/devices/system/memory/memory45/online:0
/sys/devices/system/memory/memory46/online:0

Isso vai listar todos os “blocos” de memória que estão com valor “0”, ou seja, acabaram de ser ativados no Vmware, mas o sistema operacional da sua VM ainda não os habilitou.

No caso acima foram os blocos 44,45 e 46. Para habilitá-los basta executar os comandos assim:

# echo online > /sys/devices/system/memory/memory44/state
# echo online > /sys/devices/system/memory/memory45/state
# echo online > /sys/devices/system/memory/memory46/state

Se você usou o comando free antes e após estes comandos verá que a memória configurada no seu ambiente virtual foi toda entregue e está disponível na sua VM.

Para simplificar mais você pode juntar todo o conceito em um script que automatize a verificação dos blocos inativos e os habilite assim:

#!/bin/bash
echo "Habilita memória hotplug do Vmware"
for FILE in /sys/devices/system/memory/memory*/online ; do 
STATUS=`cat $FILE` ;
if [[ $STATUS == 0 ]]; then 
DEVICE=`dirname $FILE` ;
echo MEMORIA: `basename $DEVICE`;
echo online > $DEVICE/state;
fi
done

O script acima faz um loop sobre todos os arquivos “online” de cada bloco de memória e altera o conteúdo do arquivo “state” de “offline” para “online” ativando todos os blocos de memória.

Lidando com CPUs

Usamos aqui o mesmo conceito para lidar com memória RAM, mas desta vez os arquivos são /sys/devices/system/cpu/cpu*/online, onde “cpu*” é o nome da cpu, numerada de 1 até o quanto existir em seu sistema (por convenção a cpu0 está sempre ativa e não possui o arquivo “online).

Seguindo a mesma lógica o comando abaixo lista quais cpus estão offline:

# grep 0 /sys/devices/system/cpu/cpu*/online
/sys/devices/system/cpu/cpu3/online:0
/sys/devices/system/cpu/cpu4/online:0

E os comandos abaixo ativa estas novas CPUs:

echo 1 >/sys/devices/system/cpu/cpu3/online
echo 1 >/sys/devices/system/cpu/cpu4/online

Veja que neste caso nós alteramos diretamente o arquivo “online” e não o arquivo “state” como fizemos com a memória. O script que passei para automatizar o processo com memórias pode ser facilmente adaptado para tratar com CPUs também como segue:

#!/bin/bash
echo "Habilita vCPU hotplug do Vmware"
for FILE in  /sys/devices/system/cpu/cpu*/online ; do 
STATUS=`cat $FILE` ;
if [[ $STATUS == 0 ]]; then 
DEVICE=`dirname $FILE` ;
echo CPU: `basename $DEVICE`;
echo 1 > $DEVICE/online;
fi
done

Automatizando com o UDEV

Já tratei do UDEV  algumas vezes aqui no blog para lidar com discos. O procedimento para CPU e memória é o mesmo. Você cria um arquivo com a regra e ação desejada e esquece que fez isso, quando o ocorrer um evento que satisfaça aquela regra, a ação será executada.

Nos meus primeiros testes eu usava o udev para invocar os scripts  todas as vezes que o SO detectasse acréscimo de memória e CPU mas depois acabei achando a solução perfeita que é atualizando o atributo online nos subsistemas “cpu” e “memory”.

Para não me estender muito explicando o funcionamento do udev fica apenas o script que cria um arquivo com as duas regras no sistema, mas se preferir você pode abrir o editor de textos de sua preferência e digitá-las em um arquivo com a extensão “.rules”.

# cat <<EOF >/etc/udev/rules.d/cpu-mem-hotplug.rules
# CPU hotadd request
SUBSYSTEM=="cpu", ACTION=="add", TEST=="online", ATTR{online}=="0", ATTR{online}="1"

# Memory hotadd request
SUBSYSTEM=="memory", ACTION=="add", ATTR{state}=="offline", ATTR{state}="online"

EOF

O Debian e o Ubuntu guardam as regras udev do usuário dentro de /etc/udev/rules.d mas se você usa outra distribuição talvez o caminho seja outro.

Se preferir troque o nome do arquivo, coloque em dois arquivos separados, (um pra CPU e outro para memória). O que importa é que as regras sejam estas e o arquivo obrigatoriamente esteja no diretório de regras com a extensão “.rules”.

Com estas regras no seu sistema, toda vez que você adicionar CPU e memória na sua VM ela automaticamente será ativada sem precisar reboot e até mesmo sem usar os scripts que passei.

Script ou UDEV ?

Fica a seu critério. As regras do UDEV tem funcionado a contento em meu ambiente e alteram praticamente em tempo real as mudanças que aplico no vCenter, mas se você preferir ter um pouco mais de controle, o script pode ser a opção já que as novas configurações só terão efeito após um reboot ou após invocar o script.

Referências

https://support.host1plus.com/index.php?/Knowledgebase/Article/View/1357/0/how-to-enable-memorycpu-hot-plugging-on-my-linux-server

https://communities.vmware.com/docs/DOC-10493

https://kb.vmware.com/s/article/1012764

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *