Launchpad Entry: heterogeneous-sgi-ultraviolet-support
Created: Brian Schott
Maintained: David Kang
Contributors: USC Information Sciences Institute
Summary
This blueprint proposes to add support for the SGI Ultra Violet (UV) shared memory machines as an alternative machine type in OpenStack. This blueprint is dependent on the schema changes described in the HeterogeneousInstanceTypes blueprint and the scheduler in HeterogeneousArchitectureScheduler.
The target release for this is Diablo. The USC-ISI team has a stable test branch and deployment at https://code.launchpad.net/~usc-isi/nova/hpc-testing.
The USC-ISI team has a functional prototype here:
https://code.launchpad.net/~usc-isi/nova/hpc-trunk (up-to-date)
https://code.launchpad.net/~usc-isi/nova/hpc-testing (stable)
This blueprint is related to the HeterogeneousInstanceTypes blueprint here:
We are also drafting blueprints for other machine types:
An etherpad for discussion of this blueprint is available at http://etherpad.openstack.org/heterogeneousultravioletsupport
Release Note
Nova has been extended to provide support for the SGI UV family of shared memory machines.
Rationale
See HeterogeneousInstanceTypes.
The goal is to allow openstack to launch virtual machines on SGI Altix UV machines. There are many user scenarios that involve subdividing this large SMP machine across multiple users with different configuration requirements. Even with a standard X86_64 virtual machine image taken from a stock openstack glance repository, an instance could be provisioned with 64 cores and 256GB of memory without modification.
User stories
Jackie has a Linux virtual machine image running on a blade server that runs out of memory. She sees an SGI UV is available. She chooses a uv1.8xlarge with 128GB of memory and 64 cores.
euca-run-instances -t uv1.8xlarge -k jackie -keypair emi-12345678
Assumptions
This blueprint is dependent on uv1.8xlarge being a selectable instance type and that the scheduler knows this instance must get routed to a SGI UV machine. We assume that cpu_arch, cpu_info, xpu_arch, xpu_info, xpus, net_arch, net_info, and net_mbps as attributes to instance_types, instances, and compute_nodes tables are provided. See HeterogeneousArchitectureScheduler.
Design
The UV machine is unique in that it supports X86_64 cpu_arch type and runs standard Linux binaries, but normally runs a largesmp kernel to enable more memory and more cores in a single system image. There are also special OpenMP, MPI, and other libraries that take advantage of the NUMAlink5 distributed memory fabric. You can manipulate the memory and processor locality/affinity to performance tune parallel applications.
We have several configuration approaches. Only the first needs to be successful for this project to be worthwhile.
- First, our approach is to allocating a virtual machine so that they are clustered by default. This will involve setting the memory and processor affinity for the kvm processes.
- Second, we want to see if we can expose the UV devices through the virtual machine and use the performance-optimized UV libraries inside the virtual machine. As an example, we want to take advantage of the NUMALink5 bandwidth inside a virtual machine.
Schema Changes
See HeterogeneousInstanceTypes.
We're proposing the following default values added to the instance_types table.
# Shared-memory (SGI UV)
uv1.small': dict(memory_mb=2048, vcpus=1, local_gb=20,
flavorid=200,
cpu_arch="x86_64",
cpu_info='{"feature":"NUMAlink5"}'),
'uv1.medium': dict(memory_mb=4096, vcpus=2, local_gb=40,
flavorid=201,
cpu_arch="x86_64",
cpu_info='{"feature":"NUMAlink5"}'),
'uv1.large': dict(memory_mb=8192, vcpus=4, local_gb=80,
flavorid=202,
cpu_arch="x86_64",
cpu_info='{"feature":"NUMAlink5"}'),
'uv1.xlarge': dict(memory_mb=16384, vcpus=8, local_gb=160,
flavorid=203,
cpu_arch="x86_64",
cpu_info='{"feature":"NUMAlink5"}'),
'uv1.2xlarge': dict(memory_mb=32768, vcpus=16, local_gb=320,
flavorid=204,
cpu_arch="x86_64",
cpu_info='{"feature":"NUMAlink5"}'),
'uv1.4xlarge': dict(memory_mb=65536, vcpus=32, local_gb=320,
flavorid=205,
cpu_arch="x86_64",
cpu_info='{"feature":"NUMAlink5"}'),
'uv1.8xlarge': dict(memory_mb=131072, vcpus=64, local_gb=500,
flavorid=206,
cpu_arch="x86_64",
cpu_info='{"feature":"NUMAlink5"}'),
'uv1.16xlarge': dict(memory_mb=262144, vcpus=128, local_gb=500,
flavorid=207,
cpu_arch="x86_64",
cpu_info='{"feature":"NUMAlink5"}'),
'uv1.32xlarge': dict(memory_mb=524288, vcpus=256, local_gb=1000,
flavorid=208,
cpu_arch="x86_64",
cpu_info='{"feature":"NUMAlink5"}'),
'uv1.64xlarge': dict(memory_mb=1048576, vcpus=512, local_gb=1000,
flavorid=209,
cpu_arch="x86_64",
cpu_info='{"feature":"NUMAlink5"}'),
'uv1.128xlarge': dict(memory_mb=2097152, vcpus=1024, local_gb=2000,
flavorid=209,
cpu_arch="x86_64",
cpu_info='{"feature":"NUMAlink5"}'),
'uv1.256xlarge': dict(memory_mb=4194304, vcpus=2048, local_gb=4000,
flavorid=209,
cpu_arch="x86_64",
cpu_info='{"feature":"NUMAlink5"}'),
Implementation
The USC-ISI team has a functional prototype: https://code.launchpad.net/~usc-isi/nova/hpc-trunk
UI Changes
The following will be available as new default instance types.
UV small
API name: uv1.small
- 2 GB RAM (2048 MB)
- 1 virtual core
- 20 GB of instance storage
UV medium
API name:uv1.medium
- 4 GB RAM (4096 MB)
- 2 virtual cores
- 40 GB of instance storage
UV large
API name: uv1.large
- 8 GB RAM (8192 MB)
- 4 virtual cores
- 80 GB of instance storage
UV xlarge
API name: uv1.xlarge
- 16 GB RAM (16384 MB)
- 8 virtual cores
- 160 GB of instance storage
UV 2xlarge
API name: uv1.2xlarge
- 32 GB RAM (32768 MB)
- 16 virtual cores
- 320 GB of instance storage
UV 4xlarge
API name: uv1.4xlarge
- 64 GB RAM (65536 MB)
- 32 virtual cores
- 320 GB of instance storage
UV 8xlarge
API name: uv1.8xlarge
- 128 GB RAM (131072 MB)
- 64 virtual cores
- 500 GB of instance storage
UV 16xlarge
API name: uv1.16xlarge
- 256 GB RAM (262144 MB)
- 128 virtual cores
- 500 GB of instance storage
UV 32xlarge
API name: uv1.32xlarge
- 512 GB RAM (524288 MB)
- 256 virtual cores
- 1000 GB of instance storage
UV 64xlarge
API name: uv1.64xlarge
- 1024 GB RAM (1048576 MB)
- 512 virtual cores
- 2000 GB of instance storage
UV 128xlarge
API name: uv1.32xlarge
- 2048 GB RAM (2097152 MB)
- 1024 virtual cores
- 2000 GB of instance storage
UV 256xlarge
API name: uv1.32xlarge
- 4096 GB RAM (4194304 MB)
- 2048 virtual cores
- 4000 GB of instance storage
Code Changes
- db/sqlalchemy/migrate_repo/versions/013_add_architecture_to_instance_types.py
- - add default instance types for SGI UV
Migration
Very little needs to change in terms of the way deployments will use this if we set sane defaults like "x86_64" as assumed today.
Test/Demo Plan
This need not be added or completed until the specification is nearing beta.
Unresolved issues
One of the challenges we have is that the flavorid field in the instance_types table isn't auto-increment. We've selected high numbers to avoid collisions, but the community should discuss how flavorid behaves and the best approach for adding future new instance types.
BoF agenda and discussion
Use this section to take notes during the BoF; if you keep it in the approved spec, use it for summarising what was discussed and note any options that were rejected.