From 1cdfec0e2e8caa12ff5cd65d3f5451a4e59d26f5 Mon Sep 17 00:00:00 2001 From: JingLu5 Date: Wed, 8 Mar 2017 03:28:27 +0000 Subject: Add CPU pinning support for node context JIRA: YARDSTICK-573 Since the yardstick framework now has supported an improved node type context, this patch adds support for VM vcpu pinning ability in the node type context. It provides several scripts that can be used to configurate the controller and compute nodes. Change-Id: If2c6e7b1b85ff78b9d2a5997bf03bdc6877aaf74 Signed-off-by: JingLu5 (cherry picked from commit f138b480ea4c9954d107555d7a46ec3d4375653f) --- ansible/ansible.cfg | 2 + ansible/cpu_pin_setup.yaml | 23 ++++++++ ansible/cpu_pin_teardown.yaml | 23 ++++++++ ansible/inventory.ini | 8 +++ ansible/roles/cpu_pin_local_setup/tasks/main.yaml | 63 ++++++++++++++++++++++ .../roles/cpu_pin_local_teardowm/tasks/main.yaml | 50 +++++++++++++++++ ansible/roles/restart_nova_compute/tasks/main.yaml | 14 +++++ .../roles/restart_nova_scheduler/tasks/main.yaml | 14 +++++ .../tasks/main.yaml | 15 ++++++ .../tasks/main.yaml | 15 ++++++ .../scheduler_default_filters_setup/vars/main.yaml | 1 + ansible/roles/vcpu_pin_set_reset/tasks/main.yaml | 21 ++++++++ ansible/roles/vcpu_pin_set_setup/tasks/main.yaml | 21 ++++++++ ansible/roles/vcpu_pin_set_setup/vars/main.yaml | 2 + tests/unit/benchmark/contexts/test_node.py | 20 +++---- yardstick/benchmark/contexts/node.py | 37 ++++++++++--- 16 files changed, 309 insertions(+), 20 deletions(-) create mode 100644 ansible/ansible.cfg create mode 100644 ansible/cpu_pin_setup.yaml create mode 100644 ansible/cpu_pin_teardown.yaml create mode 100644 ansible/inventory.ini create mode 100644 ansible/roles/cpu_pin_local_setup/tasks/main.yaml create mode 100644 ansible/roles/cpu_pin_local_teardowm/tasks/main.yaml create mode 100644 ansible/roles/restart_nova_compute/tasks/main.yaml create mode 100644 ansible/roles/restart_nova_scheduler/tasks/main.yaml create mode 100644 ansible/roles/scheduler_default_filters_reset/tasks/main.yaml create mode 100644 ansible/roles/scheduler_default_filters_setup/tasks/main.yaml create mode 100644 ansible/roles/scheduler_default_filters_setup/vars/main.yaml create mode 100644 ansible/roles/vcpu_pin_set_reset/tasks/main.yaml create mode 100644 ansible/roles/vcpu_pin_set_setup/tasks/main.yaml create mode 100644 ansible/roles/vcpu_pin_set_setup/vars/main.yaml diff --git a/ansible/ansible.cfg b/ansible/ansible.cfg new file mode 100644 index 000000000..14c806515 --- /dev/null +++ b/ansible/ansible.cfg @@ -0,0 +1,2 @@ +[defaults] +host_key_checking = False diff --git a/ansible/cpu_pin_setup.yaml b/ansible/cpu_pin_setup.yaml new file mode 100644 index 000000000..2a3fb5b3f --- /dev/null +++ b/ansible/cpu_pin_setup.yaml @@ -0,0 +1,23 @@ +--- +############################################################################## +# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +- hosts: localhost + roles: + - cpu_pin_local_setup + +- hosts: controller + roles: + - scheduler_default_filters_setup + - restart_nova_scheduler + +- hosts: compute + roles: + - vcpu_pin_set_setup + - restart_nova_compute diff --git a/ansible/cpu_pin_teardown.yaml b/ansible/cpu_pin_teardown.yaml new file mode 100644 index 000000000..7647eebdb --- /dev/null +++ b/ansible/cpu_pin_teardown.yaml @@ -0,0 +1,23 @@ +--- +############################################################################## +# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +- hosts: compute + roles: + - vcpu_pin_set_reset + - restart_nova_compute + +- hosts: controller + roles: + - scheduler_default_filters_reset + - restart_nova_scheduler + +- hosts: localhost + roles: + - cpu_pin_local_teardown diff --git a/ansible/inventory.ini b/ansible/inventory.ini new file mode 100644 index 000000000..440e625bd --- /dev/null +++ b/ansible/inventory.ini @@ -0,0 +1,8 @@ +[controller] +host1 ansible_host=10.1.0.50 ansible_user=root ansible_ssh_pass=root +host2 ansible_host=10.1.0.51 ansible_user=root ansible_ssh_pass=root +host3 ansible_host=10.1.0.52 ansible_user=root ansible_ssh_pass=root + +[compute] +host4 ansible_host=10.1.0.53 ansible_user=root ansible_ssh_pass=root +host5 ansible_host=10.1.0.54 ansible_user=root ansible_ssh_pass=root diff --git a/ansible/roles/cpu_pin_local_setup/tasks/main.yaml b/ansible/roles/cpu_pin_local_setup/tasks/main.yaml new file mode 100644 index 000000000..c25b801be --- /dev/null +++ b/ansible/roles/cpu_pin_local_setup/tasks/main.yaml @@ -0,0 +1,63 @@ +--- +############################################################################## +# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +- name: get nova-compute host + shell: + source /etc/yardstick/openstack.creds; + openstack availability zone list --long | grep nova-compute | sort | awk '{print $7}'; + args: + executable: /bin/bash + register: compute_nodes + +- name: get existing flavor list + shell: + source /etc/yardstick/openstack.creds; + openstack flavor list | grep "True" | cut -f 2 -d ' '; + args: + executable: /bin/bash + register: flavors + +- name: create pinned-cpu and regular host aggregate + shell: + source /etc/yardstick/openstack.creds; + openstack aggregate create pinned-cpu; + openstack aggregate create regular; + nova aggregate-set-metadata pinned-cpu pinned=true; + nova aggregate-set-metadata regular pinned=false; + nova aggregate-add-host pinned-cpu {{ compute_nodes.stdout_lines[0] }}; + nova aggregate-add-host regular {{ compute_nodes.stdout_lines[1] }}; + args: + executable: /bin/bash + +- name: set flavor default property + shell: + source /etc/yardstick/openstack.creds; + openstack flavor set --property aggregate_instance_extra_specs:pinned=false {{item}}; + args: + executable: /bin/bash + with_items: + - '{{ flavors.stdout_lines }}' + +- name: create flavor yardstick-pinned-flavor + os_nova_flavor: + cloud: opnfv + state: present + name: yardstick-pinned-flavor + ram: 512 + vcpus: 3 + disk: 3 + +- name: set yardstick-pinned-flavor property + shell: + source /etc/yardstick/openstack.creds; + openstack flavor set --property hw:cpu_policy=dedicated yardstick-pinned-flavor; + openstack flavor set --property aggregate_instance_extra_specs:pinned=true yardstick-pinned-flavor; + args: + executable: /bin/bash diff --git a/ansible/roles/cpu_pin_local_teardowm/tasks/main.yaml b/ansible/roles/cpu_pin_local_teardowm/tasks/main.yaml new file mode 100644 index 000000000..29475421d --- /dev/null +++ b/ansible/roles/cpu_pin_local_teardowm/tasks/main.yaml @@ -0,0 +1,50 @@ +--- +############################################################################## +# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +- name: get nova-compute host + shell: + source /etc/yardstick/openstack.creds; + openstack availability zone list --long | grep nova-compute | sort | awk '{print $7}'; + args: + executable: /bin/bash + register: compute_nodes + +- name: delete flavor yardstick-pinned-flavor + os_nova_flavor: + cloud: opnfv + state: absent + name: yardstick-pinned-flavor + +- name: get flavor list + shell: + source /etc/yardstick/openstack.creds; + openstack flavor list | grep "True" | cut -f 2 -d ' '; + args: + executable: /bin/bash + register: flavors + +- name: unset flavor default property + shell: + source /etc/yardstick/openstack.creds; + openstack flavor unset --property aggregate_instance_extra_specs:pinned {{item}}; + args: + executable: /bin/bash + with_items: + - '{{ flavors.stdout_lines }}' + +- name: delete pinned-cpu and regular host aggregate + shell: + source /etc/yardstick/openstack.creds; + nova aggregate-remove-host pinned-cpu {{ compute_nodes.stdout_lines[0] }}; + nova aggregate-remove-host regular {{ compute_nodes.stdout_lines[1] }}; + openstack aggregate delete pinned-cpu; + openstack aggregate delete regular; + args: + executable: /bin/bash diff --git a/ansible/roles/restart_nova_compute/tasks/main.yaml b/ansible/roles/restart_nova_compute/tasks/main.yaml new file mode 100644 index 000000000..77c2d4dca --- /dev/null +++ b/ansible/roles/restart_nova_compute/tasks/main.yaml @@ -0,0 +1,14 @@ +--- +############################################################################## +# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +- name: restart nova compute service + service: + name: nova-compute + state: restarted diff --git a/ansible/roles/restart_nova_scheduler/tasks/main.yaml b/ansible/roles/restart_nova_scheduler/tasks/main.yaml new file mode 100644 index 000000000..543e946c3 --- /dev/null +++ b/ansible/roles/restart_nova_scheduler/tasks/main.yaml @@ -0,0 +1,14 @@ +--- +############################################################################## +# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +- name: restart nova scheduler service + service: + name: nova-scheduler + state: restarted diff --git a/ansible/roles/scheduler_default_filters_reset/tasks/main.yaml b/ansible/roles/scheduler_default_filters_reset/tasks/main.yaml new file mode 100644 index 000000000..21e0efcfd --- /dev/null +++ b/ansible/roles/scheduler_default_filters_reset/tasks/main.yaml @@ -0,0 +1,15 @@ +--- +############################################################################## +# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +- name: reset scheduler default filters + lineinfile: + dest: /etc/nova/nova.conf + state: absent + regexp: 'scheduler_default_filters' diff --git a/ansible/roles/scheduler_default_filters_setup/tasks/main.yaml b/ansible/roles/scheduler_default_filters_setup/tasks/main.yaml new file mode 100644 index 000000000..5429ca91b --- /dev/null +++ b/ansible/roles/scheduler_default_filters_setup/tasks/main.yaml @@ -0,0 +1,15 @@ +--- +############################################################################## +# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +- name: add scheduler_default_filters for cpu pinning + lineinfile: + dest: /etc/nova/nova.conf + insertafter: 'DEFAULT' + line: 'scheduler_default_filters={{cpu_pin_filters}}' diff --git a/ansible/roles/scheduler_default_filters_setup/vars/main.yaml b/ansible/roles/scheduler_default_filters_setup/vars/main.yaml new file mode 100644 index 000000000..47b944470 --- /dev/null +++ b/ansible/roles/scheduler_default_filters_setup/vars/main.yaml @@ -0,0 +1 @@ +cpu_pin_filters: NUMATopologyFilter,AggregateInstanceExtraSpecsFilter diff --git a/ansible/roles/vcpu_pin_set_reset/tasks/main.yaml b/ansible/roles/vcpu_pin_set_reset/tasks/main.yaml new file mode 100644 index 000000000..f862c3c8f --- /dev/null +++ b/ansible/roles/vcpu_pin_set_reset/tasks/main.yaml @@ -0,0 +1,21 @@ +--- +############################################################################## +# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +- name: remove vcpu pin set + lineinfile: + dest: /etc/nova/nova.conf + state: absent + regexp: 'vcpu_pin_set' + +- name: remove memory reserved for host + lineinfile: + dest: /etc/nova/nova.conf + state: absent + regexp: 'reserved_host_memory_mb' diff --git a/ansible/roles/vcpu_pin_set_setup/tasks/main.yaml b/ansible/roles/vcpu_pin_set_setup/tasks/main.yaml new file mode 100644 index 000000000..2a456ab9a --- /dev/null +++ b/ansible/roles/vcpu_pin_set_setup/tasks/main.yaml @@ -0,0 +1,21 @@ +--- +############################################################################## +# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +- name: set memory reserved for host + lineinfile: + dest: /etc/nova/nova.conf + insertafter: 'DEFAULT' + line: 'reserved_host_memory_mb={{host_memory}}' + +- name: set vcpu pin set + lineinfile: + dest: /etc/nova/nova.conf + insertafter: 'DEFAULT' + line: 'vcpu_pin_set={{cpu_set}} diff --git a/ansible/roles/vcpu_pin_set_setup/vars/main.yaml b/ansible/roles/vcpu_pin_set_setup/vars/main.yaml new file mode 100644 index 000000000..e5d407b44 --- /dev/null +++ b/ansible/roles/vcpu_pin_set_setup/vars/main.yaml @@ -0,0 +1,2 @@ +cpu_set: 0,2,4,6,8,10,12,14,16 +host_memory: 512 diff --git a/tests/unit/benchmark/contexts/test_node.py b/tests/unit/benchmark/contexts/test_node.py index 53a8ffa93..4b35ca421 100644 --- a/tests/unit/benchmark/contexts/test_node.py +++ b/tests/unit/benchmark/contexts/test_node.py @@ -127,27 +127,23 @@ class NodeContextTestCase(unittest.TestCase): prefix = 'yardstick.benchmark.contexts.node' - @mock.patch('{}.NodeContext._execute_script'.format(prefix)) - def test_deploy(self, execute_script_mock): + @mock.patch('{}.NodeContext._dispatch_script'.format(prefix)) + def test_deploy(self, dispatch_script_mock): obj = node.NodeContext() obj.env = { - 'setup': [ - {'node5': {}} - ] + 'type': 'script' } obj.deploy() - self.assertTrue(execute_script_mock.called) + self.assertTrue(dispatch_script_mock.called) - @mock.patch('{}.NodeContext._execute_script'.format(prefix)) - def test_undeploy(self, execute_script_mock): + @mock.patch('{}.NodeContext._dispatch_script'.format(prefix)) + def test_undeploy(self, dispatch_script_mock): obj = node.NodeContext() obj.env = { - 'teardown': [ - {'node5': {}} - ] + 'type': 'script' } obj.undeploy() - self.assertTrue(execute_script_mock.called) + self.assertTrue(dispatch_script_mock.called) @mock.patch('{}.ssh.SSH._put_file_shell'.format(prefix)) @mock.patch('{}.ssh.SSH.execute'.format(prefix)) diff --git a/yardstick/benchmark/contexts/node.py b/yardstick/benchmark/contexts/node.py index f8c38cb1c..8bf915609 100644 --- a/yardstick/benchmark/contexts/node.py +++ b/yardstick/benchmark/contexts/node.py @@ -78,18 +78,39 @@ class NodeContext(Context): LOG.debug("Env: %r", self.env) def deploy(self): - setups = self.env.get('setup', []) - for setup in setups: - for host, info in setup.items(): - self._execute_script(host, info) + config_type = self.env.get('type', '') + if config_type == 'ansible': + self._dispatch_ansible('setup') + elif config_type == 'script': + self._dispatch_script('setup') def undeploy(self): - teardowns = self.env.get('teardown', []) - for teardown in teardowns: - for host, info in teardown.items(): + config_type = self.env.get('type', '') + if config_type == 'ansible': + self._dispatch_ansible('teardown') + elif config_type == 'script': + self._dispatch_script('teardown') + super(NodeContext, self).undeploy() + + def _dispatch_script(self, key): + steps = self.env.get(key, []) + for step in steps: + for host, info in step.items(): self._execute_script(host, info) - super(NodeContext, self).undeploy() + def _dispatch_ansible(self, key): + try: + step = self.env[key] + except KeyError: + pass + else: + self._do_ansible_job(step) + + def _do_ansible_job(self, path): + cmd = 'ansible-playbook -i inventory.ini %s' % path + base = '/home/opnfv/repos/yardstick/ansible' + p = subprocess.Popen(cmd, shell=True, cwd=base) + p.communicate() def _get_server(self, attr_name): """lookup server info by name from context -- cgit 1.2.3-korg