← Back to team overview

yahoo-eng-team team mailing list archive

[Bug 1550269] Re: 'hw:cpu_thread_policy=require' does not function correctly if NUMATopologyFilter is disabled

 

Reviewed:  https://review.openstack.org/285232
Committed: https://git.openstack.org/cgit/openstack/nova/commit/?id=ad0047e97b2847412ee28bad6a3bfb48395add35
Submitter: Jenkins
Branch:    master

commit ad0047e97b2847412ee28bad6a3bfb48395add35
Author: Stephen Finucane <stephen.finucane@xxxxxxxxx>
Date:   Fri Feb 26 10:55:55 2016 +0000

    virt/hardware: Check for threads when "required"
    
    The 'require' case "requires" the presence of hardware threads on a
    host. At present, this check is done using the NUMATopology filter.
    Unfortunately, this means that if this filter is disabled then
    instances can be scheduled on invalid hosts. Resolve this by adding a
    new check to be run when hosts are actually scheduling.
    
    Change-Id: Ia9e4784e02ca9ce7a3d81c962b95bee100f6db42
    Closes-bug: #1550269


** Changed in: nova
       Status: In Progress => Fix Released

-- 
You received this bug notification because you are a member of Yahoo!
Engineering Team, which is subscribed to OpenStack Compute (nova).
https://bugs.launchpad.net/bugs/1550269

Title:
  'hw:cpu_thread_policy=require' does not function correctly if
  NUMATopologyFilter is disabled

Status in OpenStack Compute (nova):
  Fix Released

Bug description:
  The 'require' policy is supposed to restrict instances to hosts that
  support hardware threads, e.g. HyperThreading. However, this filtering
  is done as part of the NUMATopologyFilter. If this filter is disabled,
  the host boots just fine. This should not be the case and needs to be
  fixed. Findings below.

  ---

  Testing was conducted on a single-node, Fedora 23-based (4.3.5-300.fc23.x86_64)
  OpenStack instance (built with devstack). The system is a dual-socket, ten core,
  HT-enabled system (2 sockets * 10 cores * 2 threads = 40 "pCPUs".
  0-9,20-29 = node0, 10-19,30-39 = node1).

  Commit '8bafc9' of Nova was used.

  # Steps

  ## Create flavors

      $ openstack flavor create pinned.require \
          --id 102 --ram 2048 --disk 0 --vcpus 4
      $ openstack flavor set pinned.require \
          --property "hw:cpu_policy=dedicated" \
          --property "hw:cpu_thread_policy=require"

  ## Validate a HT-enabled node

  The 'require' case is a stricter version of the `prefer` case, in that it
  should fail if we have HyperThreading disabled, do not have enough free
  sibling sets, or have no HyperThreading support at all. However, since we're
  not hitting any of these conditions on this host, things should function just
  like they do for the `prefer` case. Therefore, the guest should see a two
  sockets with one core per socket and two threads per core.

      $ openstack server create --flavor=pinned.require \
          --image=cirros-0.3.4-x86_64-uec --wait test1

      $ sudo virsh list
       Id    Name                           State
      ----------------------------------------------------
       2     instance-00000002              running

      $ sudo virsh dumpxml 2
      <domain type='kvm' id='2'>
        <name>instance-00000002</name>
        ...
        <vcpu placement='static'>4</vcpu>
        <cputune>
          <shares>4096</shares>
          <vcpupin vcpu='0' cpuset='1'/>
          <vcpupin vcpu='1' cpuset='21'/>
          <vcpupin vcpu='2' cpuset='0'/>
          <vcpupin vcpu='3' cpuset='20'/>
          <emulatorpin cpuset='0-1,20-21'/>
        </cputune>
        <numatune>
          <memory mode='strict' nodeset='0'/>
          <memnode cellid='0' mode='strict' nodeset='0'/>
        </numatune>
        ...
        <cpu>
          <topology sockets='2' cores='1' threads='2'/>
          <numa>
            <cell id='0' cpus='0-3' memory='2097152' unit='KiB'/>
          </numa>
        </cpu>
        ...
      </domain>

      $ openstack server delete test1

  No issues here.

  ## Validate a HT-disabled node

  This policy "requires" HyperThreading or similar on the host, so it shouldn't
  work here.

      $ openstack server create --flavor=pinned.require \
          --image=cirros-0.3.4-x86_64-uec --wait test1

      $ sudo virsh list
       Id    Name                           State
      ----------------------------------------------------
       2     instance-00000002              running

      $ sudo virsh dumpxml 2
      <domain type='kvm' id='2'>
        <name>instance-00000002</name>
        ...
        <vcpu placement='static'>4</vcpu>
        <cputune>
          <shares>4096</shares>
          <vcpupin vcpu='0' cpuset='0'/>
          <vcpupin vcpu='1' cpuset='1'/>
          <vcpupin vcpu='2' cpuset='2'/>
          <vcpupin vcpu='3' cpuset='3'/>
          <emulatorpin cpuset='0-3'/>
        </cputune>
        <numatune>
          <memory mode='strict' nodeset='0'/>
          <memnode cellid='0' mode='strict' nodeset='0'/>
        </numatune>
        ...
        <cpu>
          <topology sockets='2' cores='1' threads='2'/>
          <numa>
            <cell id='0' cpus='0-3' memory='2097152' unit='KiB'/>
          </numa>
        </cpu>
        ...
      </domain>

      $ openstack server delete test1

  This is a problem, but we do not currently have the filter activated:

      $ cat /etc/nova/nova.conf | grep scheduler_default_filters
      scheduler_default_filters = RetryFilter,AvailabilityZoneFilter,RamFilter,\
      DiskFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,\
      ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter,SameHostFilter,\
      DifferentHostFilter

  Let's activate this:

      $ cat /etc/nova/nova.conf | grep scheduler_default_filters
      scheduler_default_filters = RetryFilter,AvailabilityZoneFilter,RamFilter,\
      DiskFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,\
      ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter,SameHostFilter,\
      DifferentHostFilter,NUMATopologyFilter

  And try again:

      $ openstack server create --flavor=pinned.require \
          --image=cirros-0.3.4-x86_64-uec --wait test1
      Error creating server: test1

      Error creating server

  That's more like it, but it shouldn't be necessary.

To manage notifications about this bug go to:
https://bugs.launchpad.net/nova/+bug/1550269/+subscriptions


References