у нас есть среда виртуализации с 4 виртуальными машинами (2 x linux, 1 x w2k3, 1 x win7). В хост-системе (Debian Jessie) top всегда показывает загрузку процессора 30-70% (или более) для процесса qemu гостевой системы win7, даже если диспетчер задач внутри гостевой системы имеет нулевую загрузку процессора.
top - 11:12:08 up 6 days, 1:47, 1 user, load average: 0,70, 0,62, 0,55
Tasks: 216 total, 2 running, 214 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5,0 us, 3,7 sy, 0,0 ni, 91,3 id, 0,0 wa, 0,0 hi, 0,0 si, 0,0 st
KiB Mem: 24776900 total, 21591188 used, 3185712 free, 122680 buffers
KiB Swap: 3905532 total, 60748 used, 3844784 free. 399364 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11138 libvirt+ 20 0 10,804g 8,243g 18536 R 70,1 34,9 2137:30 qemu-system-x86
12134 libvirt+ 20 0 7309216 6,046g 18792 S 3,7 25,6 139:13.88 qemu-system-x86
12055 libvirt+ 20 0 8900940 4,057g 18500 S 2,3 17,2 109:41.87 qemu-system-x86
12041 libvirt+ 20 0 2956240 1,388g 18292 S 2,0 5,9 61:38.55 qemu-system-x86
5569 root 20 0 1007924 23456 11012 S 1,0 0,1 1:16.86 libvirtd
Внутри гостя работает MSSQL 2008 R2 Express. Для этого устанавливается Traceflag -T8038 (согласно настройки производительности proxmox). Также планшетное устройство удаляется из конфигурации, а устройство с раздувом отключено внутри гостя (так как я не знаю, как отключить его в конфигурации виртуальной машины). Кроме того, он также запускает сервер Pervasive SQL 8 для запуска старой базы данных btrieve.
Странно то, что загрузка ЦП сверху падает до адекватного уровня (1-3%), если я полностью удалю все сетевые адаптеры из гостевой системы. Фактически в качестве сетевой карты я прошел через одну из физических сетевых адаптеров (Intel I350). Но поведение виртуализированных сетевых адаптеров такое же. Все это тестировалось без подключения клиентов.
Фактическая гостевая конфигурация:
<domain type='kvm'>
<name>win7</name>
<uuid>4b62c825-07ce-49b9-be8c-63f1f51ec28c</uuid>
<memory unit='KiB'>8388608</memory>
<currentMemory unit='KiB'>8388608</currentMemory>
<vcpu placement='static'>2</vcpu>
<os>
<type arch='x86_64' machine='pc-i440fx-2.1'>hvm</type>
</os>
<features>
<acpi/>
<apic/>
<hyperv>
<relaxed state='on'/>
<vapic state='on'/>
<spinlocks state='on' retries='8191'/>
</hyperv>
</features>
<cpu mode='host-model'>
<model fallback='allow'/>
<topology sockets='1' cores='2' threads='1'/>
</cpu>
<clock offset='localtime'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
<timer name='hypervclock' present='yes'/>
</clock>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<pm>
<suspend-to-mem enabled='no'/>
<suspend-to-disk enabled='no'/>
</pm>
<devices>
<emulator>/usr/bin/kvm</emulator>
<disk type='block' device='disk'>
<driver name='qemu' type='raw' cache='none' io='native'/>
<source dev='/dev/vg_vm/lv_win7Pro'/>
<target dev='vda' bus='virtio'/>
<boot order='1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<target dev='hdb' bus='ide'/>
<readonly/>
<address type='drive' controller='0' bus='0' target='0' unit='1'/>
</disk>
<controller type='usb' index='0' model='ich9-ehci1'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<master startport='0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci2'>
<master startport='2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci3'>
<master startport='4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pci-root'/>
<controller type='ide' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<controller type='virtio-serial' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</controller>
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<channel type='spicevmc'>
<target type='virtio' name='com.redhat.spice.0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
<input type='mouse' bus='ps2'/>
<input type='keyboard' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes'/>
<video>
<model type='qxl' ram='65536' vram='65536' heads='1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address domain='0x0000' bus='0x07' slot='0x00' function='0x1'/>
</source>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</hostdev>
<memballoon model='virtio'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</memballoon>
</devices>
</domain>
Какие-нибудь советы, что могло вызвать это и как улучшить?
Я нашел виновного. У нас есть сервер USB-over-IP (Longshine LCS-US204) в нашей среде. Клиентское программное обеспечение было установлено на этой конкретной виртуальной машине. После удаления клиентского программного обеспечения загрузка ЦП хоста упала до приемлемого уровня. Кажется, он все время искал связи. Удаление всех устройств virtio-serial принесло еще одно небольшое улучшение, теперь нагрузка на хост составляет около 2-3%, когда Windows простаивает. Спасибо за вашу помощь.
Раньше у меня была аналогичная проблема: прерывание IRQ в гостевой системе и высокая нагрузка на хост. Вы должны изолировать то, что в гостевой системе атакует ЦП. Основными кандидатами являются как экземпляр MSSQL, так и библиотека hal.dll.
Для отладки выполните следующие действия:
РЕДАКТИРОВАТЬ: Хорошо, похоже, что ни MSSQL, ни HAL не являются основной причиной загрузки вашего хоста. Переходим ко второй фазе отладки:
powertop
утилита для мониторинга активности процессора хоста. Здесь вы должны увидеть, какая программная процедура / прерывание обслуживается больше всего. Беги через 30 секунд и доложи сюда.