Назад | Перейти на главную страницу

OpenStack Juno Live-Migration никогда не завершается для экземпляров с высокой нагрузкой и размером> 64 ГБ

Я сталкивался с ситуациями, когда живые миграции никогда не завершались или не выходили из строя.

Вот как мне удалось воспроизвести проблему.

Вот экземпляр, который я переношу:

[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                                    |
+--------------------------------------+---------------------------------------------------------------------+

Вкус gb72_vm я создал и выглядит так:

[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                                    |
+----------------------------+--------------------------------------+

После запуска экземпляра я установил stress и я испытываю нагрузку на экземпляр следующим образом:

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

Я тоже бегу top на экземпляре и вот как это выглядит:

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

Я отдал команду ...

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

... 12 мая, 20:10:41 по Гринвичу 2016 г. Сейчас пятница, 13 мая, 17:13:46 по Гринвичу 2016 года, и живая миграция все еще продолжается. Он завершится успешно, как только я убью "стресс" на экземпляре.

В производственных средах у меня есть экземпляры, которые по той или иной причине перегреваются, и я хотел бы мигрировать их в реальном времени, не вызывая сбоев приложений, убивая те приложения, которые вызывают высокую нагрузку.

Есть ли какой-то элемент конфигурации, который я могу настроить, или какой-то трюк с virsh, который я могу использовать для миграции экземпляра без предварительного снижения нагрузки на экземпляр?

ОБНОВЛЕНИЕ: Какая у меня версия Qemu?

Спасибо за отличный ответ, Майкл. Я пытаюсь понять, какая у меня версия qemu:

# 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

Обновление II:

Я просто хочу убедиться, что выдаю virsh команда правильно:

На моем вычислительном узле, где живет моя виртуальная машина. Показываю, что у меня хорошая версия qemu:

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

Теперь я делаю virsh list чтобы получить имя экземпляра виртуальной машины, на которой я хочу жить, выполните миграцию следующим образом:

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

Исходя из этого, я бы выполнил эту команду на своем вычислительном сервере, ocs1-net-002, чтобы ограничить 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

Затем я могу попытаться выполнить свои живые миграции следующим образом:

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

Это правильный набор команд для выдачи?

Обновление III. Майкл вернулся ко мне и подтвердил, что virsh команда выглядит нормально. Спасибо, Майкл!

У меня возникла проблема с живой миграцией, как я упоминал выше, и я вижу это в /etc/nova/nova-compute.log на 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

Я заметил, что живая миграция длится 40 минут. Так же bytes processed=2525969442377 больше, чем total=75515105280 что заставляет меня думать, что если моя виртуальная машина регулируется, она недостаточно регулируется.

ОБНОВЛЕНИЕ IV:

Мне удалось успешно перенести в реальном времени виртуальную машину, которая испытывала большую нагрузку. На вычислительном сервере, с которого я мигрировал, я выполнил:

[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

Я не уверен, почему я получаю сообщение об ошибке, но это не имеет значения.

Теперь я проверил, завершилась ли живая миграция:

[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                                                              |
...

Приостановка работы виртуальной машины, похоже, не помешала ни одному из процессов, запущенных на виртуальной машине. Может, я просто недостаточно внимательно посмотрел.

Затем на конечном вычислительном сервере osc6-net-001.example.com я выполнил следующие команды:

[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

Неудачная миграция из-за слишком загруженных виртуальных машин была признана проблемой. К сожалению, хотя qemu предоставляет решение, оно не предоставляется через libvirt API и поэтому недоступно для OpenStack.

Решение Qemu называется автосходимостью. Это означает, что, если виртуальная машина настолько занята, что прогнозируется, что миграция никогда не завершится, выполнение виртуальной машины будет ограничено, чтобы, возможно, позволить завершиться миграции.

Автосогласование доступно начиная с версии qemu 1.6, которая должна присутствовать в вашей установке OpenStack Juno. В этой версии количество троттлинга фиксировано. Начиная с qemu 2.5 (который на данный момент является совершенно новым, и у вас его еще не будет), регулирование является динамическим, и если виртуальная машина занята, его можно регулировать в любом месте до 99% динамически, но только настолько, насколько необходимо для позвольте миграции завершиться.

Поскольку эта команда монитора не отображается в API libvirt, OpenStack не может ею воспользоваться. На данный момент вам придется вручную применить автоматическую конвергенцию к работающей виртуальной машине. Например, войдите как root на вычислительный узел, на котором в настоящее время работает виртуальная машина, и выполните:

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

который ничего не должен выводить и возвращать 0 в случае успеха. Затем вы можете начать миграцию.

В qemu 2.5 вы можете настроить динамическое регулирование с помощью команд монитора migrate_set_parameter x-cpu-throttle-initial ## и migrate_set_parameter x-cpu-throttle-increment ## которые устанавливают начальный процент регулирования и приращение дополнительного регулирования, которое будет использоваться, если миграция по-прежнему не будет завершена, соответственно.

Надеюсь, они в конечном итоге будут добавлены в API libvirt, чтобы будущая версия OpenStack могла управлять этим напрямую.