Gerenciando Recursos de Máquinas Virtuais (VMs)¶
À medida que seu servidor doméstico evolui, seus serviços crescem, ou suas necessidades mudam, você provavelmente precisará ajustar os recursos alocados para suas máquinas virtuais (VMs). Esta página aborda como gerenciar CPU, RAM e discos de VMs existentes no Proxmox VE, com a importante consideração de manter a consistência com sua configuração Ansible (Infraestrutura como Código - IaC).
As modificações de recursos são geralmente realizadas através da Interface Web do Proxmox VE. No entanto, para que essas mudanças sejam persistentes e refletidas na sua IaC, elas também devem ser atualizadas nos seus arquivos Ansible, principalmente no playbook vm-deploy.yml.
1. Redimensionando vCPUs e RAM de uma VM Existente¶
Aumentar ou diminuir o número de processadores virtuais (vCPUs) ou a quantidade de memória RAM alocada para uma VM são tarefas comuns para otimizar a performance ou liberar recursos no host.
Procedimento Recomendado (Interface Web Proxmox + Sincronização com Ansible)¶
-
Desligue a VM (Recomendado para a Maioria das Mudanças de CPU/RAM):
- Na interface web do Proxmox VE, selecione a VM que você deseja modificar.
- Clique em "Shutdown" (para um desligamento gracioso do sistema operacional da VM) ou, se o shutdown não funcionar ou demorar muito, em "Stop" (que força o desligamento da VM).
-
Hotplug de CPU e RAM (Adicionar Recursos com a VM Ligada)
Proxmox VE, em conjunto com o QEMU Guest Agent (que deve estar instalado e rodando nas suas VMs), suporta o "hotplug" (adição "a quente") de vCPUs e RAM para VMs Linux enquanto elas estão em execução. Você pode tentar aumentar esses recursos com a VM ligada.- Hot-Unplug (Remover Recursos): Remover CPU ou RAM "a quente" é geralmente não suportado ou muito mais arriscado e pode levar à instabilidade da VM.
- Para consistência e segurança, especialmente ao reduzir recursos ou fazer grandes alterações, desligar a VM é a prática mais segura e recomendada.
-
Modifique os Recursos na Interface Web do Proxmox:
- Com a VM selecionada (e preferencialmente desligada), vá para a aba "Hardware".
- Para CPU:
- Encontre a entrada "Processors" na lista de hardware.
- Selecione-a e clique no botão "Edit".
- No diálogo "Edit: Processors", ajuste o número de "Cores". Você também pode ajustar "Sockets" se preferir (para a maioria dos casos em homelab, manter 1 socket e ajustar o número de cores é mais simples).
- Clique em "OK".
- Para RAM:
- Encontre a entrada "Memory" na lista de hardware.
- Selecione-a e clique no botão "Edit".
- No diálogo "Edit: Memory", ajuste a "Memory (MiB)" para o novo valor desejado.
- Ballooning: Se a opção "Ballooning Device" estiver habilitada (geralmente está por padrão), ela permite que o Proxmox host tente recuperar memória não utilizada da VM, dentro de um mínimo e máximo configuráveis. Para este guia, focamos em alocação de memória fixa (o valor que você define é o máximo que a VM pode usar), mas o ballooning pode ser explorado para otimizações dinâmicas.
- Clique em "OK".
-
Atualize a Configuração Ansible (Passo Crucial para Manter a IaC): Esta é uma etapa fundamental para garantir que sua Infraestrutura como Código (Ansible) reflita o estado real da sua infraestrutura.
- Na sua máquina de controle Ansible, abra o arquivo
home-server/ansible/playbooks/vm-deploy.yml. - Localize a seção de deploy da VM que você acabou de modificar na UI do Proxmox (e.g., a task para
core-services-vmouai-desktop-vm). - Atualize as variáveis
vm_coresevm_memory(em MiB) para corresponder exatamente aos novos valores que você configurou na UI do Proxmox.# Exemplo de trecho no vm-deploy.yml para core-services-vm - name: "Deploy VM: core-services-vm" ansible.builtin.include_role: name: infra/proxmox-vm vars: vm_id: 100 vm_name: "core-services-vm" vm_cores: 8 # Exemplo: Atualizado para 8 vCPUs vm_memory: 24576 # Exemplo: Atualizado para 24GB RAM (24 * 1024) vm_disk_gb: 100 vm_ipconfig: "ip={{ hostvars['core-services-vm']['ansible_host'] }}/24,gw={{ vm_cloud_init_gateway }}" vm_tags: "docker,core_services,homelab,ansible_managed" - Salve o arquivo
vm-deploy.yml.
- Na sua máquina de controle Ansible, abra o arquivo
-
Execute o Playbook Ansible para Registrar o Novo Estado Desejado: Rode o playbook
!!! warning "Idempotência e Sincronização de Estado" Se você não atualizar os arquivos Ansible após uma mudança manual na UI do Proxmox, na próxima vez que o playbookvm-deploy.ymla partir da sua máquina de controle Ansible. Como a VM já existe, o Ansible (através do módulocommunity.proxmox.proxmox_kvmcomupdate: trueestate: present) deve apenas verificar se os recursos da VM no Proxmox correspondem ao definido no playbook. Se você acabou de fazer a mudança na UI, ele deve reportar "ok" para as tasks de configuração de recursos. Se houvesse uma divergência (e.g., você mudou na UI mas esqueceu de mudar no Ansible e rodou o playbook), o Ansible tentaria aplicar os valores do playbook.vm-deploy.ymlfor executado, ele poderá tentar reverter os recursos da VM para os valores antigos que estavam definidos no playbook. Manter a UI do Proxmox e seus arquivos Ansible sincronizados é a chave para uma IaC eficaz. A configuração Ansible deve ser a fonte da verdade. -
Inicie a VM (se estava desligada):
- Na interface web do Proxmox, inicie a VM.
- Após o boot, conecte-se à VM via SSH e verifique se os novos recursos estão sendo reconhecidos pelo sistema operacional:
- Para CPU:
lscpuouhtop(verá o número de cores). - Para RAM:
free -houhtop(verá a memória total).
- Para CPU:
2. Redimensionando Discos Virtuais de VMs¶
Aumentar o tamanho de um disco virtual existente é uma operação relativamente comum e segura. Diminuir um disco virtual é um processo muito mais complexo, arriscado (risco de perda de dados) e geralmente não recomendado; normalmente envolve ferramentas de particionamento dentro da VM e não é diretamente suportado por uma simples ação no Proxmox.
Aumentar o Tamanho de um Disco Virtual Existente¶
-
Desligue a VM (Opcional, mas Mais Seguro): Embora o Proxmox permita redimensionar discos "a quente" para a maioria dos formatos de disco virtual (como qcow2 em storage LVM ou ZFS) se o QEMU Guest Agent estiver ativo e o SO da VM suportar, desligar a VM pode prevenir problemas potenciais durante a operação no sistema de arquivos da VM.
-
Aumente o Tamanho do Disco Virtual na Interface Web do Proxmox:
- Na UI do Proxmox, selecione a VM e vá para a aba "Hardware".
- Localize o disco virtual que você deseja redimensionar na lista (e.g.,
Hard Disk (scsi0)). - Selecione o disco.
- Clique no botão "Disk Action" (ou similar, dependendo da versão do Proxmox) e escolha "Resize disk".
- No diálogo "Resize disk":
- Você precisará inserir o incremento de tamanho que deseja adicionar ao disco (e.g., se o disco atual tem 50GB e você quer que ele tenha 70GB, você inseriria
+20G). Algumas versões mais recentes do Proxmox podem permitir que você insira o tamanho total final desejado.
- Você precisará inserir o incremento de tamanho que deseja adicionar ao disco (e.g., se o disco atual tem 50GB e você quer que ele tenha 70GB, você inseriria
- Clique em "Resize". Proxmox alocará o espaço adicional para o dispositivo de bloco da VM.
-
Atualize a Configuração Ansible (para IaC):
- No seu arquivo
ansible/playbooks/vm-deploy.yml, localize a definição da VM e atualize a variávelvm_disk_gbpara o novo tamanho total do disco em Gigabytes. - Execute o playbook Ansible para registrar a mudança:
- No seu arquivo
-
Expanda o Sistema de Arquivos DENTRO da VM: Aumentar o tamanho do disco virtual no Proxmox apenas aloca mais espaço para o dispositivo de bloco da VM. O sistema de arquivos dentro da VM (e.g., ext4, xfs) ainda não sabe sobre esse espaço extra e não o utilizará automaticamente.
- Inicie a VM (se estava desligada).
- Conecte-se à VM via SSH.
- Use
lsblkpara identificar o dispositivo de bloco e suas partições (e.g.,/dev/sda,/dev/sda1). - Use
df -hpara ver o tamanho atual do sistema de arquivos montado. - O processo exato para expandir o sistema de arquivos depende de como o disco foi particionado e qual sistema de arquivos está em uso. Para as imagens Cloud-Init do Ubuntu, geralmente há uma única partição principal que ocupa o disco.
- Para um sistema de arquivos
ext4em uma partição simples (comum em imagens Cloud-Init):- Identifique o disco e a partição: Se o disco no Proxmox é
scsi0, ele pode aparecer na VM como/dev/sda(ou/dev/vdase usar VirtIO Block diretamente). A partição principal será algo como/dev/sda1. Uselsblk. - Use
growpartpara expandir a partição: O utilitáriogrowpart(do pacotecloud-guest-utils) pode expandir a partição para preencher o espaço não alocado no disco. - Redimensione o sistema de arquivos
ext4: - Verifique o novo tamanho com
df -h. O sistema de arquivos deve agora mostrar o tamanho aumentado.
- Identifique o disco e a partição: Se o disco no Proxmox é
- Se LVM (Logical Volume Management) estiver em uso dentro da VM: O processo é mais complexo e envolve:
pvresize /dev/sdXN(para expandir o Physical Volume).lvextend -l +100%FREE /dev/mapper/VGNAME-LVNAME(para expandir o Logical Volume).resize2fs /dev/mapper/VGNAME-LVNAME(para ext4) ouxfs_growfs /mount/point(para XFS).
- Para um sistema de arquivos
Adicionando um Segundo (ou mais) Disco Virtual a uma VM¶
Se você precisar de um espaço de armazenamento separado dentro de uma VM (e não quiser usar NFS para esse propósito específico), você pode adicionar um novo disco virtual.
-
Crie o Novo Disco Virtual na Interface Web do Proxmox:
- Selecione a VM -> aba "Hardware".
- Clique em "Add" -> "Hard Disk".
- Storage: Selecione o storage de destino (e.g.,
local-lvmpara o SSD, ou até mesmo seu pooldatase quiser um disco maior em HDDs, mas com performance de HDD). - Disk size (GiB): Defina o tamanho do novo disco.
- Format:
QEMU image format (qcow2)é geralmente uma boa escolha (permite snapshots, thin provisioning).Raw disk image (raw)pode oferecer uma pequena vantagem de performance em alguns casos. - Bus/Device:
SCSI(com controladorVirtIO SCSIna VM) é recomendado para performance. - SSD emulation: Marque se o storage for SSD.
- Clique em "Add". Um novo disco (e.g.,
scsi1) aparecerá.
-
Atualize a Configuração Ansible (Opcional, mas Recomendado para Documentação e Consistência IaC):
- Você pode adicionar a definição do novo disco ao playbook
ansible/playbooks/vm-deploy.ymlpara que o Ansible esteja ciente dele e possa, no futuro, gerenciá-lo (embora o Ansible não vá particionar ou formatar dentro da VM sem tasks adicionais).# Exemplo no vm-deploy.yml, na seção 'vars:' da VM # ... disk: scsi0: # Disco principal existente size: "{{ vm_disk_gb }}G" storage: "{{ proxmox_storage_vm_disks }}" scsi1: # Novo disco adicionado size: "100G" # Exemplo: novo disco de 100GB storage: "{{ proxmox_storage_vm_disks }}" # Ou outro storage se desejado format: "qcow2" # O formato que você escolheu # ... - Execute
ansible-playbook ansible/playbooks/vm-deploy.yml --ask-vault-pass. O Ansible deve reconhecer o disco existente.
- Você pode adicionar a definição do novo disco ao playbook
-
Particione, Formate e Monte o Novo Disco DENTRO da VM:
- Inicie a VM (ou reinicie se já estava rodando para que ela detecte o novo hardware).
- Conecte-se à VM via SSH.
- O novo disco virtual aparecerá como um novo dispositivo de bloco não formatado (e.g.,
/dev/sdbou/dev/vdbse o primeiro disco for/dev/sdaou/dev/vda). Uselsblkpara identificar. - Particione o novo disco (exemplo usando
fdiskpara criar uma única partição GPT): - Formate a nova partição (e.g.,
/dev/sdb1comext4): - Crie um Ponto de Montagem:
- Monte o Disco e Adicione ao
/etc/fstabpara Montagem Automática no Boot:- Obtenha o UUID da nova partição:
sudo blkid /dev/sdb1(copie o valor do UUID). - Edite
/etc/fstab:sudo nano /etc/fstab - Adicione uma linha como:
- Salve o
/etc/fstab. - Monte todos os sistemas de arquivos listados no fstab (ou reinicie a VM):
- Verifique com
df -h. O novo disco deve estar montado.
- Obtenha o UUID da nova partição:
3. Monitorando o Uso de Recursos por VM¶
É crucial monitorar como suas VMs estão utilizando os recursos alocados para identificar gargalos ou oportunidades de otimização.
- Interface Web do Proxmox VE:
- A aba "Summary" de cada VM mostra o uso atual de CPU, RAM, disco e tráfego de rede.
- A aba "Monitor" oferece gráficos históricos mais detalhados para esses mesmos recursos.
- Stack de Monitoramento (Prometheus e Grafana):
- O Node Exporter (instalado em cada VM e no host Proxmox) coleta métricas detalhadas do sistema.
- Grafana Dashboards: Você pode (e deve) importar ou criar dashboards no Grafana para visualizar essas métricas por VM. Dashboards populares como "Node Exporter Full" (ID 1860 no grafana.com/dashboards) ou "Proxmox VE Host and VM stats" (ID 10347) são excelentes pontos de partida.
- Glances:
- A interface web do Glances (
https://glances.{{ base_domain }}) fornece uma visão geral em tempo real dos recursos dacore-services-vm(onde ele roda).
- A interface web do Glances (
- Dentro da VM (Linha de Comando):
htopoutop: Uso de CPU e RAM por processo.free -h: Uso de memória RAM e swap.df -h: Uso de espaço em disco para sistemas de arquivos montados.iostat: Estatísticas de I/O de disco.vmstat: Estatísticas de memória virtual, processos, I/O de bloco, CPU.
4. Considerações Sobre Overcommitment de CPU e RAM¶
"Overcommitment" (ou sobrealocação) ocorre quando a soma dos recursos alocados para todas as VMs excede os recursos físicos disponíveis no host.
- CPU Overcommitment:
- É comum e geralmente bem tolerado em ambientes de virtualização como Proxmox/KVM. Você pode, por exemplo, alocar um total de 16 vCPUs para suas VMs mesmo que seu host Proxmox tenha apenas 6 núcleos físicos (12 threads).
- O hypervisor (KVM) agenda os vCPUs das VMs para rodar nos núcleos físicos do host. Para cargas de trabalho típicas de homelab, onde muitas VMs ou serviços ficam ociosos na maior parte do tempo, isso funciona bem.
- Evite sobrealocação excessiva se você tiver múltiplas VMs com carga de CPU constantemente alta e próxima de 100% dos seus vCPUs alocados, pois isso levará a contenção e degradação de performance para todas as VMs.
- RAM Overcommitment (Geralmente a Evitar ou Usar com Cuidado Extremo):
- Alocar mais RAM total para suas VMs do que a RAM física realmente disponível no host Proxmox (após descontar a RAM usada pelo próprio Proxmox OS e ZFS ARC) é muito arriscado e pode levar a:
- Uso intenso de swap no host Proxmox e/ou dentro das VMs, o que degrada severamente a performance (discos são ordens de magnitude mais lentos que RAM).
- O OOM (Out-of-Memory) Killer do Linux no host ou nas VMs pode começar a matar processos para liberar memória, causando instabilidade e perda de serviços.
- Com 48GB de RAM no Host: Você tem uma margem considerável. Se o Proxmox host usa ~2-4GB para si e para o ZFS ARC (o ARC pode usar até 50% da RAM do host por padrão, mas é dinâmico), você ainda tem mais de 40GB para alocar às VMs. A alocação de 16GB para
core-services-vme 16-24GB paraai-desktop-vmé viável, mas sempre monitore o uso real. - Memory Ballooning:
- Habilitado por padrão no Proxmox para VMs KVM. Permite que a VM devolva memória não utilizada ao host, e que o host peça memória de volta (dentro dos limites mínimo e máximo configurados para a VM).
- Pode ajudar a otimizar o uso de RAM em cenários de baixa contenção, mas pode ter um pequeno overhead de performance. Para cargas de trabalho que precisam de RAM garantida, a alocação fixa (sem depender muito do ballooning para reduzir abaixo do alocado) é mais previsível.
- KSM (Kernel Samepage Merging):
- Pode ser habilitado no Proxmox (Serviços -> KSM). Ele escaneia a memória das VMs e deduplica páginas de memória idênticas, potencialmente economizando RAM.
- Tem um custo de CPU para o escaneamento. O benefício varia dependendo de quão similares são as cargas de trabalho das suas VMs. Pode ser útil se você tiver muitas VMs rodando o mesmo SO e aplicações.
- Alocar mais RAM total para suas VMs do que a RAM física realmente disponível no host Proxmox (após descontar a RAM usada pelo próprio Proxmox OS e ZFS ARC) é muito arriscado e pode levar a:
5. Quando Criar uma Nova VM vs. Adicionar Recursos a uma Existente?¶
A decisão de escalar verticalmente (adicionar mais recursos a uma VM existente) ou horizontalmente (criar uma nova VM) depende de vários fatores:
- Isolamento de Serviços/Riscos:
- Se um novo serviço é crítico, experimental, potencialmente instável, ou tem requisitos de segurança muito diferentes dos seus serviços existentes, colocá-lo em uma nova VM dedicada oferece o melhor isolamento. Uma falha ou comprometimento nessa VM não afetará diretamente suas outras VMs.
- Requisitos de Recursos Específicos:
- Se um serviço precisa de um sistema operacional diferente do Ubuntu Server que usamos.
- Se um serviço precisa de acesso exclusivo a um dispositivo de hardware via passthrough PCI (e você não quer complexidade de múltiplos passthroughs para uma única VM).
- Organização e Gerenciamento:
- Agrupar serviços com propósitos logicamente semelhantes em uma mesma VM (como fizemos com a
core-services-vm) pode simplificar o gerenciamento e a comunicação interna entre eles. - No entanto, não sobrecarregue uma única VM com muitos serviços diversos, pois isso pode dificultar o troubleshooting e aumentar o "raio de explosão" se algo der errado com aquela VM.
- Agrupar serviços com propósitos logicamente semelhantes em uma mesma VM (como fizemos com a
- Impacto de Performance:
- Se adicionar um novo serviço (ou aumentar a carga de um existente) em uma VM já existente está começando a degradar significativamente a performance dos outros serviços naquela VM (mesmo após tentar adicionar mais CPU/RAM a ela), pode ser hora de mover esse serviço para uma nova VM (assumindo que os recursos do host Proxmox o permitam).
- Limites de Recursos Totais do Host Proxmox:
- Lembre-se sempre da capacidade total do seu host Proxmox (CPU, RAM, I/O de disco). Não adianta criar muitas VMs se o host físico não consegue suportar a carga combinada de todas elas de forma estável.
- Monitore o uso de recursos do host Proxmox (via UI Proxmox ou Node Exporter no Grafana) além do uso das VMs individuais.
Gerenciar recursos de VM é um ato de equilíbrio contínuo. Monitore regularmente o uso, entenda os requisitos das suas aplicações, e não hesite em ajustar as alocações (ou criar novas VMs) conforme suas necessidades evoluem, sempre mantendo sua configuração Ansible como a fonte da verdade para a Infraestrutura como Código.