O OpenStack Juno Live-Migration nunca é concluído para instâncias com alta carga e tamanho 64GB

2

Eu encontrei situações em que as migrações ao vivo nunca parecem ser concluídas ou com erros.

Veja como consegui reproduzir o problema.

Aqui está a instância que estou migrando:

[root@osc1-mgmt-001 tmp]# nova show gb72-net-002-org-001
+--------------------------------------+---------------------------------------------------------------------+
| Property                             | Value                                                               |
+--------------------------------------+---------------------------------------------------------------------+
| OS-DCF:diskConfig                    | MANUAL                                                              |
| OS-EXT-AZ:availability_zone          | nova                                                                |
| OS-EXT-SRV-ATTR:host                 | osc1-net-002.example.com                                          |
| OS-EXT-SRV-ATTR:hypervisor_hostname  | osc1-net-002.example.com                                          |
| OS-EXT-SRV-ATTR:instance_name        | gb72-net-002-org-001                                                |
| OS-EXT-STS:power_state               | 1                                                                   |
| OS-EXT-STS:task_state                | migrating                                                           |
| OS-EXT-STS:vm_state                  | active                                                              |
| OS-SRV-USG:launched_at               | 2016-05-12T20:01:23.000000                                          |
| OS-SRV-USG:terminated_at             | -                                                                   |
| accessIPv4                           |                                                                     |
| accessIPv6                           |                                                                     |
| config_drive                         |                                                                     |
| created                              | 2016-05-12T20:00:58Z                                                |
| flavor                               | gb72_vm (668ca3b4-a7c0-4309-a11e-4fb5377e4180)                      |
| hostId                               | 44206a2390a038b0ede2a4375f1239b0cef917149bd5976fcada6781            |
| id                                   | 3b176ee2-fcf3-41a6-b658-361ffd19639e                                |
| image                                | CentOS-7-x86_64-GenericCloud (588e035d-2e1e-4720-94c4-8b000bf9d2ef) |
| key_name                             | nk                                                                  |
| metadata                             | {}                                                                  |
| name                                 | gb72-net-002-org-001                                                |
| os-extended-volumes:volumes_attached | [{"id": "16afe52c-31b0-4a3a-b718-aa1789df2852"}]                    |
| public-47 network                    | 10.29.105.13                                                        |
| security_groups                      | default                                                             |
| status                               | MIGRATING                                                           |
| tenant_id                            | 9d011b7c8d104af1b887e229cee436d2                                    |
| updated                              | 2016-05-13T17:07:48Z                                                |
| user_id                              | fa8b956c89304124967bb4bcea54124b                                    |
+--------------------------------------+---------------------------------------------------------------------+

O sabor gb72_vm é um que eu criei e se parece com isso:

[root@osc1-mgmt-001 tmp]# nova flavor-show gb72_vm
+----------------------------+--------------------------------------+
| Property                   | Value                                |
+----------------------------+--------------------------------------+
| OS-FLV-DISABLED:disabled   | False                                |
| OS-FLV-EXT-DATA:ephemeral  | 0                                    |
| disk                       | 20                                   |
| extra_specs                | {}                                   |
| id                         | 668ca3b4-a7c0-4309-a11e-4fb5377e4180 |
| name                       | gb72_vm                              |
| os-flavor-access:is_public | True                                 |
| ram                        | 72000                                |
| rxtx_factor                | 1.0                                  |
| swap                       | 16000                                |
| vcpus                      | 8                                    |
+----------------------------+--------------------------------------+

Depois que eu iniciei a instância, instalei stress e estou executando a ênfase na instância da seguinte forma:

[centos@gb72-net-002-org-001 stress-1.0.4]$ stress -c 6 -m 4 --vm-bytes 512M

Também estou executando top na instância e é isso que parece:

top - 17:17:02 up 21:15,  1 user,  load average: 10.11, 10.08, 10.06
Tasks: 149 total,  12 running, 137 sleeping,   0 stopped,   0 zombie
%Cpu(s): 62.0 us, 38.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 72323392 total, 70503632 free,  1344768 used,   474988 buff/cache
KiB Swap: 16383996 total, 16383996 free,        0 used. 70740048 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
10273 centos    20   0    7260     96      0 R  86.7  0.0   1008:21 stress
10276 centos    20   0    7260     96      0 R  84.7  0.0   1008:22 stress
10271 centos    20   0    7260     96      0 R  84.1  0.0   1008:00 stress
10275 centos    20   0    7260     96      0 R  82.1  0.0   1009:28 stress
10270 centos    20   0  531552 218716    176 R  80.7  0.3   1011:42 stress
10272 centos    20   0  531552 142940    176 R  80.4  0.2   1012:40 stress
10269 centos    20   0    7260     96      0 R  78.7  0.0   1008:38 stress
10274 centos    20   0  531552 333404    176 R  73.1  0.5   1012:32 stress
10267 centos    20   0    7260     96      0 R  70.4  0.0   1008:41 stress
10268 centos    20   0  531552  38452    176 R  65.8  0.1   1011:29 stress
    1 root      20   0  191352   6652   3908 S   0.0  0.0   0:06.00 systemd
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.02 kthreadd
    3 root      20   0       0      0      0 S   0.0  0.0   0:01.45 ksoftirqd/0
    5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
    6 root      20   0       0      0      0 S   0.0  0.0   0:00.12 kworker/u16:0
    7 root      rt   0       0      0      0 S   0.0  0.0   0:00.62 migration/0
    8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh
    9 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/0
   10 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/1
   11 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/2
   12 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/3
   13 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/4
   14 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/5
   15 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/6
   16 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/7
   17 root      20   0       0      0      0 R   0.0  0.0   0:02.42 rcu_sched
   18 root      20   0       0      0      0 S   0.0  0.0   0:00.44 rcuos/0
   19 root      20   0       0      0      0 S   0.0  0.0   0:00.29 rcuos/1
   20 root      20   0       0      0      0 S   0.0  0.0   0:00.32 rcuos/2

Eu emiti o comando ...

# nova live-migration gb72-net-002-org-001 osc6-net-001.example.com

... em 12 de maio 20:10:41 GMT 2016. Atualmente é Sex 13 de maio 17:13:46 GMT 2016 e a migração ao vivo ainda está acontecendo. Ele será concluído com sucesso assim que como eu mato "stress" na instância.

Em ambientes de produção, tenho instâncias que estão em execução por um motivo ou outro e eu gostaria de viver migrá-los sem causar interrupções de aplicativos matando as aplicações que estão causando alta carga.

Existe algum item de configuração que eu possa tweek ou algum truque virsh que eu possa usar para migrar a instância sem primeiro reduzir a carga na instância?

UPDATE: Qual versão do Qemu eu tenho?

Obrigado por uma excelente resposta, Michael. Eu estou tentando descobrir qual versão do qemu eu tenho:

# rpm -qa | grep qemu
ipxe-roms-qemu-20130517-8.gitc4bce43.el7_2.1.noarch
libvirt-daemon-driver-qemu-1.2.17-13.el7_2.3.x86_64
qemu-img-rhev-2.1.2-23.el7_1.4.x86_64
qemu-kvm-common-rhev-2.1.2-23.el7_1.4.x86_64
qemu-kvm-rhev-2.1.2-23.el7_1.4.x86_64
[root@osc1-net-002 ~]# virsh -v
1.2.17

Atualização II:

Eu só quero ter certeza de que estou emitindo o comando virsh corretamente:

No meu nó de computação, onde minha VM mora. Eu mostro que tenho uma boa versão do qemu:

[root@osc1-net-002 ~]# qemu-io --version
qemu-io version 2.1.2

Agora, faço um virsh list para obter o nome da instância da VM que quero migrar da seguinte forma:

[root@osc1-net-002 ~]# virsh list
 Id    Name                           State
----------------------------------------------------
 50    gb72-net-002-org-001           running

Portanto, com base nisso, eu executaria esse comando no meu servidor de computação, ocs1-net-002, para controlar gb72-net-002-org-002 :

[root@osc1-net-002 ~]# virsh qemu-monitor-command gb72-net-002-org-002 --hmp migrate_set_capability auto-converge on

Então, posso tentar realizar minhas migrações ao vivo da seguinte forma:

[root@osc1-mgmt-001 ~]# nova live-migration gb72-net-002-org-002 osc6-net-001.example.com

É para corrigir o conjunto de comandos a serem emitidos?

Atualização III. Michael voltou para mim e verificou que o comando virsh parece bem. Obrigado Michael!

Emitido a migração ao vivo, como mencionado acima, e estou vendo isso no /etc/nova/nova-compute.log on osc1-net-002 :

DEBUG nova.virt.libvirt.driver [-] [instance: bf616c8b-0054-47ee-a547-42c2a946be2e] Migration running for 2405 secs, memory 2% remaining; (bytes processed=2520487990540, remaining=1604055040, total=75515105280) _live_migration_monitor /usr/lib/python2.7/site-packages/nova/virt/libvirt/driver.py:5721

Algo que notei é que a migração ao vivo está em execução há 40 minutos. Além disso, o bytes processed=2525969442377 é maior que o total=75515105280 , o que me faz pensar que, se minha VM estiver sendo acelerada, ela não está sendo acelerada o suficiente.

UPDATE IV:

Eu consegui migrar com sucesso uma VM que estava passando por uma carga pesada. No servidor de computação que eu estava migrando, executei:

[root@osc1-net-002 ~]# virsh qemu-monitor-command gb72-net-002-org-001 -hmp stop
error: Timed out during operation: cannot acquire state change lock (held by remoteDispatchDomainMigratePerform3)
[root@osc1-net-002 ~]# virsh suspend gb72-net-002-org-001
Domain gb72-net-002-org-001 suspended

Não sei por que estou recebendo o erro, mas isso não parece importar.

Agora, verifiquei se a migração ao vivo foi concluída:

[root@osc1-net-002 ~]# nova list
+--------------------------------------+----------------------+--------+------------+-------------+-----------------------+
| ID                                   | Name                 | Status | Task State | Power State | Networks              |
+--------------------------------------+----------------------+--------+------------+-------------+-----------------------+
| de335b04-8632-48e3-b17c-d80ac2d02983 | gb72-net-002-org-001 | ACTIVE | -          | Running     | public-47=10.29.105.9 |
| 229d8775-3a3c-46a6-8f40-7f86ca99af88 | test-net-001-org     | ACTIVE | -          | Running     | public-47=10.29.105.4 |
| 6d2ddad3-3851-4495-bf14-b787fed2ad99 | test-net-001-org-2   | ACTIVE | -          | Running     | public-47=10.29.105.7 |
+--------------------------------------+----------------------+--------+------------+-------------+-----------------------+
[root@osc1-net-002 ~]# nova show gb72-net-002-org-001
+--------------------------------------+---------------------------------------------------------------------+
| Property                             | Value                                                               |
+--------------------------------------+---------------------------------------------------------------------+
| OS-DCF:diskConfig                    | MANUAL                                                              |
| OS-EXT-AZ:availability_zone          | nova                                                                |
| OS-EXT-SRV-ATTR:host                 | osc6-net-001.example.com                                          |
| OS-EXT-SRV-ATTR:hypervisor_hostname  | osc6-net-001.example.com                                          |
| OS-EXT-SRV-ATTR:instance_name        | gb72-net-002-org-001                                                |
| OS-EXT-STS:power_state               | 1                                                                   |
| OS-EXT-STS:task_state                | -                                                                   |
| OS-EXT-STS:vm_state                  | active                                                              |
...

A suspensão da VM não pareceu interferir em nenhum dos processos em execução na VM. Talvez eu apenas não parecesse strong o suficiente.

Em seguida, no servidor de cálculo de desdentificação, osc6-net-001.example.com, executei estes comandos:

[root@osc6-net-001 ~]# virsh qemu-monitor-command --hmp gb72-net-002-org-001 cont


[root@osc6-net-001 ~]# virsh resume gb72-net-002-org-001
Domain gb72-net-002-org-001 resumed
    
por Red Cricket 13.05.2016 / 19:53

1 resposta

3

A falha na migração devido a VMs muito ocupadas foi reconhecida como um problema. Infelizmente, enquanto o qemu fornece uma solução, ele não é exposto por meio da API libvirt e, portanto, está indisponível para o OpenStack.

A solução da Qemu é chamada de convergência automática . Isso significa que, se uma VM estiver tão ocupada que a migração está prevista para nunca ser concluída, a execução da VM será acelerada, de modo a permitir que a migração seja concluída.

A convergência automática está disponível a partir do qemu 1.6 em diante, o que deve estar presente na instalação do OpenStack Juno. Nesta versão, a quantidade de limitação é fixa. Desde o qemu 2.5 (que neste momento é completamente novo, e você ainda não o terá) o afogamento é dinâmico e, se a VM estiver ocupada, ela pode ser acelerada em qualquer lugar até 99% dinamicamente, mas apenas o necessário permitir que a migração termine.

Como esse comando do monitor não é exposto na API libvirt, o OpenStack não pode tirar vantagem disso. No momento, você terá que aplicar a convergência automática manualmente a uma VM em execução. Por exemplo, efetue login como root no nó de cálculo que está atualmente executando a VM e execute:

virsh qemu-monitor-command instance-000007e1 --hmp migrate_set_capability auto-converge on

que não deve produzir nada e retornar 0 se for bem-sucedido. Você pode então começar a migração.

No qemu 2.5, você pode ajustar o throttling dinâmico com os comandos de monitor migrate_set_parameter x-cpu-throttle-initial ## e migrate_set_parameter x-cpu-throttle-increment ## , que definem a porcentagem inicial de aceleração e o incremento de aceleração adicional a ser usado se a migração ainda não for concluída, respectivamente. p>

Espero que eles sejam eventualmente adicionados à API libvirt para que uma versão futura do OpenStack possa gerenciar isso diretamente.

    
por 14.05.2016 / 05:23