Como posso manter VMs importantes na memória sem desabilitar a troca?

4

VM Host - > Xenon E5-2440 com 48G mem ... Tudo roda CentOS6.5 (2.6.32-431)

Eu tenho 4 VMs convidadas executando cada w / 2G de memória. Suas imagens de disco são arquivos locais. A máquina host também está executando um servidor NFS pouco usado, mas não muito mais. (swappiness = 0) Depois de um dia ou mais, à medida que o cache de buffer cresce para quase 40G, algumas dessas VMs acabam quase totalmente trocadas para o disco. (visto via: grep VmSwap / proc / PID / status)

O problema que estou tendo é que, embora essas VMs não sejam usadas regularmente, elas precisam estar prontas. No entanto, na prática, eles estão sendo trocados causando sérios problemas com seu tempo de resposta.

Eu certamente sou tudo para que minhas VMs convidadas usem um arquivo de swap de tamanho razoável e deixem o sistema operacional decidir o equilíbrio entre o cache de buffer & swap, mas isso não parece estar funcionando para a máquina host no meu caso de uso.

Alguma opção para evitar que a capacidade de resposta das VMs seja degradada, além de desabilitar a troca na máquina host? Tente com cgroups ou apenas puxe o plug no arquivo de swap para este caso de uso?

    
por user2970347 15.12.2013 / 11:01

3 respostas

2

Você pode bloquear as páginas na memória em versões posteriores do libvirt: -

link

Cuidado : Isto não aparece quando usando o Fedora 19 como um hypervisor, no entanto, de acordo com o changelog para o último RPM (eu posso encontrar) para o EL6.5 libvirt que existe;

  • Thu Jul 18 2013 Jiri Denemark - 0.10.2-21
    • conf: Avoid NULL deref for pmsuspended domain state (rhbz#822306)
    • libvirt: Define domain crash event types (rhbz#822306)
    • qemu: Refactor processWatchdogEvent (rhbz#822306)
    • qemu: Expose qemuProcessShutdownOrReboot() (rhbz#822306)
    • qemu: Implement 'oncrash' events when guest panicked (rhbz#822306)
    • qemu: Implement 'oncrash' coredump events when guest panicked (rhbz#822306)
    • conf: Fix a memory leak when parsing nat port XML nodes (rhbz#851455)
    • security_manager: Fix comparison (rhbz#984793)
    • qemu: Prevent crash of libvirtd without guest agent configuration (rhbz#984821)
    • qemu: Fix double free of returned JSON array in qemuAgentGetVCPUs() (rhbz#984821)
    • qemu_agent: Add support for appending arrays to commands (rhbz#924400)
    • Add support for locking domain's memory pages (rhbz#947118)
    • qemu: Implement support for locking domain's memory pages (rhbz#947118)
    • qemu: Check for -realtime mlock=on|off support (rhbz#947118)
    • qemu: Move memory limit computation to a reusable function (rhbz#947118)
    • util: New virCommandSetMax(MemLock|Processes|Files) (rhbz#947118)
    • qemu: Set RLIMIT_MEMLOCK when memoryBacking/locked is used (rhbz#947118)
    • Add Gluster protocol as supported network disk backend (rhbz#849796)
    • qemu: Add support for gluster protocol based network storage backend. (rhbz#849796)
    • tests: Add tests for gluster protocol based network disks support (rhbz#849796)
    
por 15.12.2013 / 22:16
1

Você pode usar cgroups e configurar o swappiness por cgroup

link

link

Uma CPU virtual KVM é apenas um encadeamento no host, portanto, pode ser controlada como qualquer outro processo.

    
por 15.12.2013 / 21:31
0

Aqui estão as instruções passo a passo para a solução de Matthew:

  1. Encerre a VM
  2. virt-xml $VMNAME --edit --memorybacking locked=on
  3. systemctl restart libvirtd (não tenho certeza se isso é necessário)
  4. Iniciar a VM

em que $VMNAME é o nome da VM.

Eu passei com sucesso por uma situação em que anteriormente minha VM seria trocada completamente. Agora, o processo qemu da VM tem 0 uso de troca e é responsivo.

Ressalva: De acordo com a documentação da libvirt , toda a memória do qemu será bloqueada, ela pode crescer de maneira imprevisível e deve-se definir hard_limit para proteger o sistema host (a VM será eliminada, se necessário, para permanecer dentro do limite).

Editar: etapa simplificada 2 (foi virsh edit $VMNAME e adicione <memoryBacking><locked/></memoryBacking> após <domain type='kvm'> )

    
por 18.09.2018 / 13:11