Added allocation-ratio config opts

Nova supports setting allocation ratios at the nova-compute level from
Liberty onwards. Prior to this allocation ratios were set at the
nova-scheduler level.

Newton introduced the Placement API, and Ocata introduced the ability to
have compute resources (Core/RAM/Disk) precomputed before passing
candidates to the FilterScheduler [0]. Pike removed CoreFilter,
RAMFilter and DiskFilter scheduler filters.

From Pike onwards valid methods for settings these allocation ratios are via:
- A call to the Placement API [1].
- Config values to supplied to nova-compute (xxx_allocation_ratio).

Stein introduced initial_xxx_allocation_ratio in response to the runtime
behaviour of the ResourceTracker [2].

Currently, the precedence of resource ratio values are:
xxx_allocation_ratio > Placement API call > initial_xxx_allocation_ratio

That is a (compute) resource provider's allocation ratios will default
to initial_xxx_allocation_ratio which may be overridden at run time by a
call to the Placement API. If xxx_allocation_ratio is set it will
override all configurations for that provider.

When not otherwise configured, we set initial_xxx_allocation_ratio to
the values provided by ncc to maintain backwards compatibility. Where
initial_xxx_allocation_ratio is not available we set
xxx_allocation_ratio.

[0] https://specs.openstack.org/openstack/nova-specs/specs/ocata/implemented/resource-providers-scheduler-db-filters.html
[1] https://docs.openstack.org/api-ref/placement/#update-resource-provider-inventories
[2] https://specs.openstack.org/openstack/nova-specs/specs/stein/implemented/initial-allocation-ratios.html

Change-Id: Ifa314e9e23e0ae5d16113cd91a7507e61f9de704
Closes-Bug: #1677223
This commit is contained in:
Brett Milford 2020-04-07 11:00:37 +10:00
parent 6d1450d565
commit 43acdd4f80
13 changed files with 243 additions and 0 deletions

View File

@ -763,3 +763,72 @@ options:
description: |
Value of bluestore compression max blob size for solid state media on
pools requested by this charm.
initial-cpu-allocation-ratio:
type: float
default:
description: |
The initial value of per physical core -> virtual core ratio to use in
the Nova scheduler; this may be overriden at runtime by the placement API.
.
Increasing this value will increase instance density on compute nodes
at the expense of instance performance.
.
This option doesn't have any effect on clouds running
a release < Stein.
initial-ram-allocation-ratio:
type: float
default:
description: |
The initial value of physical ram -> virtual ram ratio to use in
the Nova scheduler; this may be overriden at runtime by the placement API.
.
Increasing this value will increase instance density on compute nodes
at the potential expense of instance performance.
.
NOTE: When in a hyper-converged architecture, make sure to make enough
room for infrastructure services running on your compute hosts by
adjusting this value.
.
This option doesn't have any effect on clouds running
a release < Stein.
initial-disk-allocation-ratio:
type: float
default:
description: |
The initial value of this disk allocation ratio. Increase the amount of
disk space that nova can overcommit to guests.
This may be overriden at runtime by the placement API.
.
Increasing this value will increase instance density on compute nodes
with an increased risk of hypervisor storage becoming full.
.
This option doesn't have any effect on clouds running
a release < Stein.
cpu-allocation-ratio:
type: float
default:
description: |
The per physical core -> virtual core ratio to use in the Nova scheduler.
.
Increasing this value will increase instance density on compute nodes
at the expense of instance performance.
ram-allocation-ratio:
type: float
default:
description: |
The physical ram -> virtual ram ratio to use in the Nova scheduler.
.
Increasing this value will increase instance density on compute nodes
at the potential expense of instance performance.
.
NOTE: When in a hyper-converged architecture, make sure to make enough
room for infrastructure services running on your compute hosts by
adjusting this value.
disk-allocation-ratio:
type: float
default:
description: |
Increase the amount of disk space that nova can overcommit to guests.
.
Increasing this value will increase instance density on compute nodes
with an increased risk of hypervisor storage becoming full.

View File

@ -905,3 +905,43 @@ class NeutronPluginSubordinateConfigContext(context.SubordinateConfigContext):
:rtype: bool
"""
return 'sections' in ctxt.keys()
class NovaComputePlacementContext(context.OSContextGenerator):
def __call__(self):
ctxt = {}
cmp_os_release = CompareOpenStackReleases(os_release('nova-common'))
ctxt['initial_cpu_allocation_ratio'] =\
config('initial-cpu-allocation-ratio')
ctxt['initial_ram_allocation_ratio'] =\
config('initial-ram-allocation-ratio')
ctxt['initial_disk_allocation_ratio'] =\
config('initial-disk-allocation-ratio')
ctxt['cpu_allocation_ratio'] = config('cpu-allocation-ratio')
ctxt['ram_allocation_ratio'] = config('ram-allocation-ratio')
ctxt['disk_allocation_ratio'] = config('disk-allocation-ratio')
if cmp_os_release >= 'stein':
for ratio_config in ['initial_cpu_allocation_ratio',
'initial_ram_allocation_ratio',
'initial_disk_allocation_ratio']:
if ctxt[ratio_config] is None:
for rid in relation_ids('cloud-compute'):
for unit in related_units(rid):
rel = {'rid': rid, 'unit': unit}
ctxt[ratio_config] = relation_get(ratio_config,
**rel)
else:
for ratio_config in ['cpu_allocation_ratio',
'ram_allocation_ratio',
'disk_allocation_ratio']:
if ctxt[ratio_config] is None:
for rid in relation_ids('cloud-compute'):
for unit in related_units(rid):
rel = {'rid': rid, 'unit': unit}
ctxt[ratio_config] = relation_get(ratio_config,
**rel)
return ctxt

View File

@ -110,6 +110,7 @@ from nova_compute_context import (
SerialConsoleContext,
NovaComputeAvailabilityZoneContext,
NeutronPluginSubordinateConfigContext,
NovaComputePlacementContext,
)
import charmhelpers.contrib.openstack.vaultlocker as vaultlocker
@ -233,6 +234,7 @@ BASE_RESOURCE_MAP = {
context.VolumeAPIContext('nova-common'),
SerialConsoleContext(),
NovaComputeAvailabilityZoneContext(),
NovaComputePlacementContext(),
context.WorkerConfigContext(),
vaultlocker.VaultKVContext(
vaultlocker.VAULTLOCKER_BACKEND),

View File

@ -134,6 +134,16 @@ resume_guests_state_on_host_boot = {{ resume_guests_state_on_host_boot }}
metadata_workers = {{ workers }}
{% if cpu_allocation_ratio -%}
cpu_allocation_ratio = {{ cpu_allocation_ratio }}
{% endif -%}
{% if ram_allocation_ratio -%}
ram_allocation_ratio = {{ ram_allocation_ratio }}
{% endif -%}
{% if disk_allocation_ratio -%}
disk_allocation_ratio = {{ disk_allocation_ratio }}
{% endif -%}
{% if network_manager == 'neutron' and network_manager_config -%}
[neutron]
url = {{ network_manager_config.neutron_url }}

View File

@ -122,6 +122,16 @@ resume_guests_state_on_host_boot = {{ resume_guests_state_on_host_boot }}
metadata_workers = {{ workers }}
{% if cpu_allocation_ratio -%}
cpu_allocation_ratio = {{ cpu_allocation_ratio }}
{% endif -%}
{% if ram_allocation_ratio -%}
ram_allocation_ratio = {{ ram_allocation_ratio }}
{% endif -%}
{% if disk_allocation_ratio -%}
disk_allocation_ratio = {{ disk_allocation_ratio }}
{% endif -%}
[vnc]
{% if console_vnc_type -%}
enabled = True

View File

@ -127,6 +127,16 @@ resume_guests_state_on_host_boot = {{ resume_guests_state_on_host_boot }}
metadata_workers = {{ workers }}
{% if cpu_allocation_ratio -%}
cpu_allocation_ratio = {{ cpu_allocation_ratio }}
{% endif -%}
{% if ram_allocation_ratio -%}
ram_allocation_ratio = {{ ram_allocation_ratio }}
{% endif -%}
{% if disk_allocation_ratio -%}
disk_allocation_ratio = {{ disk_allocation_ratio }}
{% endif -%}
[vnc]
{% if console_vnc_type -%}
enabled = True

View File

@ -130,6 +130,16 @@ resume_guests_state_on_host_boot = {{ resume_guests_state_on_host_boot }}
metadata_workers = {{ workers }}
{% if cpu_allocation_ratio -%}
cpu_allocation_ratio = {{ cpu_allocation_ratio }}
{% endif -%}
{% if ram_allocation_ratio -%}
ram_allocation_ratio = {{ ram_allocation_ratio }}
{% endif -%}
{% if disk_allocation_ratio -%}
disk_allocation_ratio = {{ disk_allocation_ratio }}
{% endif -%}
[vnc]
{% if console_vnc_type -%}
enabled = True

View File

@ -116,6 +116,16 @@ resume_guests_state_on_host_boot = {{ resume_guests_state_on_host_boot }}
metadata_workers = {{ workers }}
{% if cpu_allocation_ratio -%}
cpu_allocation_ratio = {{ cpu_allocation_ratio }}
{% endif -%}
{% if ram_allocation_ratio -%}
ram_allocation_ratio = {{ ram_allocation_ratio }}
{% endif -%}
{% if disk_allocation_ratio -%}
disk_allocation_ratio = {{ disk_allocation_ratio }}
{% endif -%}
[vnc]
{% if console_vnc_type -%}
enabled = True

View File

@ -122,6 +122,16 @@ resume_guests_state_on_host_boot = {{ resume_guests_state_on_host_boot }}
metadata_workers = {{ workers }}
{% if cpu_allocation_ratio -%}
cpu_allocation_ratio = {{ cpu_allocation_ratio }}
{% endif -%}
{% if ram_allocation_ratio -%}
ram_allocation_ratio = {{ ram_allocation_ratio }}
{% endif -%}
{% if disk_allocation_ratio -%}
disk_allocation_ratio = {{ disk_allocation_ratio }}
{% endif -%}
[vnc]
{% if console_vnc_type -%}
enabled = True

View File

@ -122,6 +122,16 @@ resume_guests_state_on_host_boot = {{ resume_guests_state_on_host_boot }}
metadata_workers = {{ workers }}
{% if cpu_allocation_ratio -%}
cpu_allocation_ratio = {{ cpu_allocation_ratio }}
{% endif -%}
{% if ram_allocation_ratio -%}
ram_allocation_ratio = {{ ram_allocation_ratio }}
{% endif -%}
{% if disk_allocation_ratio -%}
disk_allocation_ratio = {{ disk_allocation_ratio }}
{% endif -%}
[vnc]
{% if console_vnc_type -%}
enabled = True

View File

@ -126,6 +126,25 @@ resume_guests_state_on_host_boot = {{ resume_guests_state_on_host_boot }}
metadata_workers = {{ workers }}
{% if initial_cpu_allocation_ratio -%}
initial_cpu_allocation_ratio = {{ initial_cpu_allocation_ratio }}
{% endif -%}
{% if initial_ram_allocation_ratio -%}
initial_ram_allocation_ratio = {{ initial_ram_allocation_ratio }}
{% endif -%}
{% if initial_disk_allocation_ratio -%}
initial_disk_allocation_ratio = {{ initial_disk_allocation_ratio }}
{% endif -%}
{% if cpu_allocation_ratio -%}
cpu_allocation_ratio = {{ cpu_allocation_ratio }}
{% endif -%}
{% if ram_allocation_ratio -%}
ram_allocation_ratio = {{ ram_allocation_ratio }}
{% endif -%}
{% if disk_allocation_ratio -%}
disk_allocation_ratio = {{ disk_allocation_ratio }}
{% endif -%}
[vnc]
{% if console_vnc_type -%}
enabled = True

View File

@ -154,6 +154,25 @@ resume_guests_state_on_host_boot = {{ resume_guests_state_on_host_boot }}
metadata_workers = {{ workers }}
{% if initial_cpu_allocation_ratio -%}
initial_cpu_allocation_ratio = {{ initial_cpu_allocation_ratio }}
{% endif -%}
{% if initial_ram_allocation_ratio -%}
initial_ram_allocation_ratio = {{ initial_ram_allocation_ratio }}
{% endif -%}
{% if initial_disk_allocation_ratio -%}
initial_disk_allocation_ratio = {{ initial_disk_allocation_ratio }}
{% endif -%}
{% if cpu_allocation_ratio -%}
cpu_allocation_ratio = {{ cpu_allocation_ratio }}
{% endif -%}
{% if ram_allocation_ratio -%}
ram_allocation_ratio = {{ ram_allocation_ratio }}
{% endif -%}
{% if disk_allocation_ratio -%}
disk_allocation_ratio = {{ disk_allocation_ratio }}
{% endif -%}
[pci]
{% if pci_passthrough_whitelist -%}
passthrough_whitelist = {{ pci_passthrough_whitelist }}

View File

@ -1079,3 +1079,27 @@ class NeutronPluginSubordinateConfigContextTest(CharmTestCase):
config_file='/etc/nova.conf')
self.assertFalse(ctxt.context_complete({}))
self.assertTrue(ctxt.context_complete({'sections': {}}))
class NovaComputePlacementContextTest(CharmTestCase):
def setUp(self):
super(NovaComputePlacementContextTest, self).setUp(context, TO_PATCH)
self.config.side_effect = self.test_config.get
self.os_release.return_value = 'train'
self.maxDiff = None
def test_allocation_ratio(self):
self.test_config.set('cpu-allocation-ratio', 64)
self.test_config.set('ram-allocation-ratio', 32.3)
self.test_config.set('disk-allocation-ratio', 16)
ctxt = context.NovaComputePlacementContext()
self.assertEqual(
{'cpu_allocation_ratio': 64,
'ram_allocation_ratio': 32.3,
'disk_allocation_ratio': 16,
'initial_cpu_allocation_ratio': None,
'initial_ram_allocation_ratio': None,
'initial_disk_allocation_ratio': None}, ctxt())