Баг в libvirt 0.9.11+ на хост системах с процессорами AMD Magny Cours
Недавно натолкнулся на такой баг: обновил libvirt до 0.9.11 на одной из систем. После этого при перезагрузке виртуальной машины стала появляться такая ошибка:
$ virsh start guest
error: Failed to start domain guest
error: internal error cannot set CPU affinity on process 0: Invalid argument
Виртуальная машина запустилась после того как из конфига была удалено следующее:
-<vcpu placement='static' cpuset='19'>1</vcpu>
+<vcpu>1</vcpu>
После этого я сделал:
$ virsh vcpupin guest
VCPU: CPU Affinity
----------------------------------
0: 0-11
$ virsh vcpuinfo guest
VCPU: 0
CPU: N/A
State: N/A
CPU time N/A
CPU Affinity: yyyyyyyyyyyy
То есть libvirt видит только половину ядер. После небольшого исследования был найдет виновник: макрос VIR_NODEINFO_MAXCPUS(nodeinfo). Он возвращал всего 12 ядер, вместо 24.
А вот виновником этого уже является файл src/nodeinfo.c, а именно строки:
/* Parse core */
core = parse_core(cpu);
if (!CPU_ISSET(core, &core_mask)) {
CPU_SET(core, &core_mask);
nodeinfo->cores++;
}
/* Parse socket */
sock = parse_socket(cpu);
if (!CPU_ISSET(sock, &socket_mask)) {
CPU_SET(sock, &socket_mask);
nodeinfo->sockets++;
}
Судя по всему разработчики libvirt не учли на тот момент, что есть особенные процессоры AMD (Opteron например), у которых в одном корпусе может быть два процессора.
Баг исправляет коммит nodeinfo: Get the correct CPU number on AMD Magny Cours platform. Хотя он выглядит больше как некий хак.
Ждём 0.9.13, где этот патч будет в комплекте, а пока можно наложить ручками.
Я у себя вернулся обратно на 0.9.8, однако есть досадный баг, что после обновления виртуальные машины, которые были запущены (или перезагружены) - обнаруживаются libvirt как выключенные. Выполнение virsh qemu-attach не приводит к желаемому результату.
Если у вас остались вопросы, напишите мне письмо.