Am Mittwoch, 11. September 2013, 11:27:30 schrieb Daniel P. Berrange:
On Wed, Sep 11, 2013 at 10:47:08AM +0200, David Weber wrote:
> Am Freitag, 6. September 2013, 12:10:04 schrieb Daniel P. Berrange:
> > On Tue, Aug 27, 2013 at 09:09:25AM +0200, David Weber wrote:
> > > Hi,
> > >
> > > we try to use vcpu pinning on a 2 socket server with Intel Xeon E5620
> > > cpus, HT enabled and 2*6*16GiB Ram but experience problems if we try
> > > to
> > > start a guest on the second socket:
> > > error: Failed to start domain test
> > > error: internal error: process exited while connecting to monitor:
> > > kvm_init_vcpu failed: Cannot allocate memory
>
> # virsh freecell 0
> 0: 86071624 KiB
>
> # virsh freecell 1
> 1: 75258628 KiB
>
> # virsh edit test
> <domain type='kvm'>
>
> <name>test</name>
> <uuid>08cdc389-78bf-450c-89f4-b4728edabdbf</uuid>
> <memory unit='KiB'>1048576</memory>
> <currentMemory unit='KiB'>1048576</currentMemory>
> <vcpu placement='static' cpuset='4-7'>1</vcpu>
> <numatune>
>
> <memory mode='strict' nodeset='1'/>
>
> </numatune>
> <os>
>
> <type arch='x86_64'
machine='pc-i440fx-1.5'>hvm</type>
> <boot dev='hd'/>
>
> </os>
> <features>
>
> <acpi/>
> <apic/>
> <pae/>
>
> </features>
> <clock offset='utc'/>
> <on_poweroff>destroy</on_poweroff>
> <on_reboot>restart</on_reboot>
> <on_crash>restart</on_crash>
> <devices>
>
> <emulator>/usr/bin/qemu-kvm</emulator>
> <controller type='usb' index='0'>
>
> <address type='pci' domain='0x0000' bus='0x00'
slot='0x01'
>
> 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>
> <input type='mouse' bus='ps2'/>
> <graphics type='vnc' port='-1' autoport='yes'/>
> <video>
>
> <model type='cirrus' vram='9216' heads='1'/>
> <address type='pci' domain='0x0000' bus='0x00'
slot='0x02'
>
> function='0x0'/>
>
> </video>
> <memballoon model='virtio'>
>
> <address type='pci' domain='0x0000' bus='0x00'
slot='0x03'
>
> function='0x0'/>
>
> </memballoon>
>
> </devices>
>
> </domain>
>
> # virsh start test
>
> error: Failed to start domain test
> error: internal error: process exited while connecting to monitor:
> kvm_init_vcpu failed: Cannot allocate memory
>
> Allocating memory on this node with numactl works fine
> # numactl --cpubind=1 --membind=1 -- dd if=/dev/zero of=/dev/null bs=2G
> count=1
> 0+1 records in
> 0+1 records out
> 2147479552 bytes (2.1 GB) copied, 0.60816 s, 3.5 GB/s
Hmm, this makes no sense at all to me. Your configuration looks totally
valid and you have plenty of memory in both nodes.
After reading a bit more about cgroups, I now think I know whats going on.
Lets assume we have a 2 node dualcore system and start a guest named 'test'
without cpu or memory pinning.
* libvirt creates a controller under cpuset/machine/test.libvirt-qemu:
cpuset/machine/test.libvirt-qemu/cpuset.cpus -> 0-3
cpuset/machine/test.libvirt-qemu/cpuset.mems -> 0-1
* libvirt creates a controller for every vcpu:
cpuset/machine/test.libvirt-qemu/vcpu*/cpuset.cpus -> 0-3
cpuset/machine/test.libvirt-qemu/vcpu*/cpuset.mems -> 0-1
* libvirt creates a controller for qemu:
cpuset/machine/test.libvirt-qemu/emulator/cpuset.cpus -> 0-3
cpuset/machine/test.libvirt-qemu/emulator/cpuset.mems -> 0-1
Now we want to pin the guest to the second node
virsh # numatune test --nodeset 1
error: Unable to change numa parameters
error: Unable to write to '/sys/fs/cgroup/cpuset/machine/Ubuntu.libvirt-
qemu/cpuset.mems': Device or resource busy
What happens is that Libvirt tries to set cpuset/machine/test.libvirt-
qemu/cpuset.mems to 1 but this is not possible because
cpuset/machine/test.libvirt-qemu/vcpu*/cpuset.mems and
cpuset/machine/test.libvirt-qemu/emulator/cpuset.mems still contain 0-1.
Libvirt has to change these values before!
If I do this manually, numatune runs fine:
# echo 1 > vcpu0/cpuset.mems
# echo 1 > emulator/cpuset.mems
# virsh numatune test --nodeset 1
Cheers,
David
Daniel