• M
    qemuProcessHook: Call virNuma*() only when needed · ea576ee5
    Michal Privoznik 提交于
    https://bugzilla.redhat.com/show_bug.cgi?id=1198645
    
    Once upon a time, there was a little domain. And the domain was pinned
    onto a NUMA node and hasn't fully allocated its memory:
    
      <memory unit='KiB'>2355200</memory>
      <currentMemory unit='KiB'>1048576</currentMemory>
    
      <numatune>
        <memory mode='strict' nodeset='0'/>
      </numatune>
    
    Oh little me, said the domain, what will I do with so little memory.
    If I only had a few megabytes more. But the old admin noticed the
    whimpering, barely audible to untrained human ear. And good admin he
    was, he gave the domain yet more memory. But the old NUMA topology
    witch forbade to allocate more memory on the node zero. So he
    decided to allocate it on a different node:
    
    virsh # numatune little_domain --nodeset 0-1
    
    virsh # setmem little_domain 2355200
    
    The little domain was happy. For a while. Until bad, sharp teeth
    shaped creature came. Every process in the system was afraid of him.
    The OOM Killer they called him. Oh no, he's after the little domain.
    There's no escape.
    
    Do you kids know why? Because when the little domain was born, her
    father, Libvirt, called numa_set_membind(). So even if the admin
    allowed her to allocate memory from other nodes in the cgroups, the
    membind() forbid it.
    
    So what's the lesson? Libvirt should rely on cgroups, whenever
    possible and use numa_set_membind() as the last ditch effort.
    Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
    ea576ee5
qemu_process.c 178.4 KB