Add guide about using Rally on Heat gates
This patch adds detailed description of using Rally job for performance testing Heat patches. Change-Id: I81f2239c4823a37f775f5290ee393e27d73b6b78
This commit is contained in:
parent
b24215a492
commit
3ea105f4dd
246
doc/source/developing_guides/rally_on_gates.rst
Normal file
246
doc/source/developing_guides/rally_on_gates.rst
Normal file
@ -0,0 +1,246 @@
|
|||||||
|
..
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
not use this file except in compliance with the License. You may obtain
|
||||||
|
a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
License for the specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
|
||||||
|
.. _rally_gates:
|
||||||
|
|
||||||
|
=========================
|
||||||
|
Using Rally on Heat gates
|
||||||
|
=========================
|
||||||
|
Heat gate allows to use Rally for performance testing for each particular
|
||||||
|
patch. This functionality can be used for checking patch on performance
|
||||||
|
regressions and also for detecting any floating bugs for common scenarios.
|
||||||
|
|
||||||
|
How to run Rally for particular patch
|
||||||
|
-------------------------------------
|
||||||
|
As was mentioned above Heat allows to execute Rally scenarios as a gate job
|
||||||
|
for particular patch. It can be done by posting comment with text
|
||||||
|
``check experimental`` for patch on review. It will run bunch of jobs, one of
|
||||||
|
which has name ``gate-rally-dsvm-fakevirt-heat``.
|
||||||
|
|
||||||
|
List of scenarios, which will be executed, is presented in file
|
||||||
|
``heat-fakevirt.yaml``. Default version of this file is available here:
|
||||||
|
https://github.com/openstack/heat/blob/master/rally-scenarios/heat-fakevirt.yaml
|
||||||
|
|
||||||
|
Obviously performance analysis make sense, when it can be compared with some
|
||||||
|
another performance data. So two different approaches can be used for it:
|
||||||
|
- Comparison of one part of code with some custom changes
|
||||||
|
(see :ref:`check_performance_or_detect_regression`)
|
||||||
|
- Comparison of two different code parts
|
||||||
|
(see :ref:`compare_output_API_performance`)
|
||||||
|
|
||||||
|
Examples of using Rally
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
Previously two main approaches of using Rally job for Heat were highlighted.
|
||||||
|
Corresponding examples will be described in this part of documentation.
|
||||||
|
|
||||||
|
However need to note, that there are a lot of other ways how to use Rally job
|
||||||
|
for Heat performance. For example, this job can be launched periodically
|
||||||
|
(twice in week) for random patches and these results will be compared between
|
||||||
|
each other. It allows to see, that Heat has not any performance regressions.
|
||||||
|
|
||||||
|
.. _check_performance_or_detect_regression:
|
||||||
|
|
||||||
|
Check performance or how to detect regression
|
||||||
|
+++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
|
||||||
|
The easiest way of using Rally is to execute already existing scenarios.
|
||||||
|
One of the examples is presented in patch
|
||||||
|
https://review.openstack.org/#/c/279450/ . In this patch was executed scenario
|
||||||
|
already existing in Rally ``HeatStacks.create_and_delete_stack``.
|
||||||
|
During executing this scenario Rally creates and then, when stack is created,
|
||||||
|
delete Heat stack. All existing scenarios can be found here:
|
||||||
|
https://github.com/openstack/rally/blob/master/rally/plugins/openstack/scenarios/heat/stacks.py
|
||||||
|
|
||||||
|
Mentioned scenario uses Heat template as a parameter for task. The template
|
||||||
|
path should be mentioned for argument ``template_path``. It can be one of Heat
|
||||||
|
templates presented in Rally repository
|
||||||
|
(https://github.com/openstack/rally/tree/master/samples/tasks/scenarios/heat/templates)
|
||||||
|
or new one, like it was done for mentioned patch. New added template should be
|
||||||
|
placed in ``rally-scenarios/extra/`` directory.
|
||||||
|
|
||||||
|
Also it's possible to specify other fields for each Rally task, like ``sla``
|
||||||
|
or ``context``. More information about other configuration setting is
|
||||||
|
available by link https://rally.readthedocs.org/en/latest/tutorial.html
|
||||||
|
|
||||||
|
Mentioned patch was proposed for confirmation caching mechanism of Heat
|
||||||
|
template validation process
|
||||||
|
(see https://specs.openstack.org/openstack/heat-specs/specs/liberty/constraint-validation-cache.html).
|
||||||
|
So it contains some changes in OS::Heat::TestResource resource, which allows
|
||||||
|
to demonstrate mentioned caching feature improvements.
|
||||||
|
|
||||||
|
Initially test was run against current devstack installation, where caching
|
||||||
|
is disabled (e.g. Patch Set 7). The follow results were gotten:
|
||||||
|
|
||||||
|
+------------------+----------+----------+----------+--------+------+
|
||||||
|
|Action | Min (sec)| Max (sec)| Avg (sec)| Success| Count|
|
||||||
|
+------------------+----------+----------+----------+--------+------+
|
||||||
|
|heat.create_stack | 38.223 | 48.085 | 42.971 | 100.0% | 10 |
|
||||||
|
+------------------+----------+----------+----------+--------+------+
|
||||||
|
|heat.delete_stack | 11.755 | 18.155 | 14.085 | 100.0% | 10 |
|
||||||
|
+------------------+----------+----------+----------+--------+------+
|
||||||
|
|total | 50.188 | 65.361 | 57.057 | 100.0% | 10 |
|
||||||
|
+------------------+----------+----------+----------+--------+------+
|
||||||
|
|
||||||
|
In the next patch set (Patch Set 8) was updated by adding Depends-On reference
|
||||||
|
to commit message. It let to execute the same test with patch for devstack,
|
||||||
|
which turns on caching (https://review.openstack.org/#/c/279400/).
|
||||||
|
The results for this case were:
|
||||||
|
|
||||||
|
+------------------+----------+----------+----------+--------+------+
|
||||||
|
|Action | Min (sec)| Max (sec)| Avg (sec)| Success| Count|
|
||||||
|
+------------------+----------+----------+----------+--------+------+
|
||||||
|
|heat.create_stack | 11.863 | 16.074 | 14.174 | 100.0% | 10 |
|
||||||
|
+------------------+----------+----------+----------+--------+------+
|
||||||
|
|heat.delete_stack | 9.144 | 11.663 | 10.595 | 100.0% | 10 |
|
||||||
|
+------------------+----------+----------+----------+--------+------+
|
||||||
|
|total | 21.557 | 27.18 | 24.77 | 100.0% | 10 |
|
||||||
|
+------------------+----------+----------+----------+--------+------+
|
||||||
|
|
||||||
|
Comparison average values for create_stack action in the first and the second
|
||||||
|
executions shows, that with enabled caching create_stack works faster in 3
|
||||||
|
times. It is a tangible improvement for create_stack operation.
|
||||||
|
Need to note, that in described test delay for each constraint validation
|
||||||
|
request takes 0.3 sec. as specified in ``constraint_prop_secs`` property of
|
||||||
|
TestResource. It may be more, than real time delay, but it allows to confirm,
|
||||||
|
that caching works correct.
|
||||||
|
|
||||||
|
Also this approach may be used for detecting regressions. In this case workflow
|
||||||
|
may be presented as follow list of steps:
|
||||||
|
- add to task list (``heat-fakevirt.yaml``) existing or new tasks.
|
||||||
|
- wait a result of this execution.
|
||||||
|
- upload patchset with changes (new feature) and launch the same test again.
|
||||||
|
- compare performance results.
|
||||||
|
|
||||||
|
.. _compare_output_API_performance:
|
||||||
|
|
||||||
|
Compare output API performance
|
||||||
|
++++++++++++++++++++++++++++++
|
||||||
|
|
||||||
|
Another example of using Rally job is writing custom Rally scenarios in Heat
|
||||||
|
repository. There is an example of this is presented on review:
|
||||||
|
https://review.openstack.org/#/c/270225/
|
||||||
|
|
||||||
|
It's similar on the first examnple, but requires more Rally specific coding.
|
||||||
|
New tasks in ``heat-fakevirt.yaml`` use undefined in Rally repository
|
||||||
|
scenarios:
|
||||||
|
|
||||||
|
- CustomHeatBenchmark.create_stack_and_show_output_new
|
||||||
|
- CustomHeatBenchmark.create_stack_and_show_output_old
|
||||||
|
- CustomHeatBenchmark.create_stack_and_list_output_new
|
||||||
|
- CustomHeatBenchmark.create_stack_and_list_output_old
|
||||||
|
|
||||||
|
All these scenarios are defined in the same patch and placed in
|
||||||
|
``rally-scenarios/plugins/`` directory.
|
||||||
|
|
||||||
|
The aim of these scenarios and tasks is to demonstrate differences between
|
||||||
|
new and old API calls. Heat client has a two commands for operating stack
|
||||||
|
outputs: ``heat output-list`` and ``heat output-show <output-id>``.
|
||||||
|
Previously there are no special API calls for getting this information from
|
||||||
|
server and this data was obtained from whole Heat Stack object.
|
||||||
|
This was changed after implementation new API for outputs:
|
||||||
|
https://specs.openstack.org/openstack/heat-specs/specs/mitaka/api-calls-for-output.html
|
||||||
|
|
||||||
|
As described in the mentioned specification outputs can be obtained via special
|
||||||
|
requests to Heat API. According to this changes code in Heat client was updated
|
||||||
|
to use new API, if it's available.
|
||||||
|
|
||||||
|
The initial problem for this change was performance issue, which can be
|
||||||
|
formulated as: execution command ``heat output-show <output-id>`` with old
|
||||||
|
approach required resolving all outputs in Heat Stack, before getting only
|
||||||
|
one output specified by user.
|
||||||
|
|
||||||
|
The same issue was and with ``heat output-list``, which required to resolve all
|
||||||
|
outputs only for providing list of output keys without resolved values.
|
||||||
|
|
||||||
|
Two scenarios with suffix ``*_new`` use new output API. These scenarios
|
||||||
|
are not presented in Rally yet, because it's new API.
|
||||||
|
Another two scenarios with suffix ``*_old`` are based on the old approach of
|
||||||
|
getting outputs. This code was partially replaced by new API, so it's not
|
||||||
|
possible to use it on fresh devstack. As result this custom code was written
|
||||||
|
as two custom scenarios.
|
||||||
|
|
||||||
|
All these scenarios were added to task list and executed in the same time.
|
||||||
|
Results of execution are shown below:
|
||||||
|
|
||||||
|
create_stack_and_show_output_old
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|Action | Min (sec)| Max (sec)| Avg (sec)| Success| Count|
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|heat.create_stack | 13.559 | 14.298 | 13.899 | 100.0% | 5 |
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|heat.show_output_old | 5.214 | 5.297 | 5.252 | 100.0% | 5 |
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|heat.delete_stack | 5.445 | 6.962 | 6.008 | 100.0% | 5 |
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|total | 24.243 | 26.146 | 25.159 | 100.0% | 5 |
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|
||||||
|
create_stack_and_show_output_new
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|Action | Min (sec)| Max (sec)| Avg (sec)| Success| Count|
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|heat.create_stack | 13.719 | 14.286 | 13.935 | 100.0% | 5 |
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|heat.show_output_new | 0.699 | 0.835 | 0.762 | 100.0% | 5 |
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|heat.delete_stack | 5.398 | 6.457 | 5.636 | 100.0% | 5 |
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|total | 19.873 | 21.21 | 20.334 | 100.0% | 5 |
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|
||||||
|
Average value for execution ``output-show`` for old approach obviously more,
|
||||||
|
then for new API. It happens, because new API resolve only one specified
|
||||||
|
output.
|
||||||
|
|
||||||
|
Same results are for ``output-list``:
|
||||||
|
|
||||||
|
create_stack_and_list_output_old
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|Action | Min (sec)| Max (sec)| Avg (sec)| Success| Count|
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|heat.create_stack | 13.861 | 14.573 | 14.141 | 100.0% | 5 |
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|heat.list_output_old | 5.247 | 5.339 | 5.281 | 100.0% | 5 |
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|heat.delete_stack | 6.727 | 6.845 | 6.776 | 100.0% | 5 |
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|total | 25.886 | 26.696 | 26.199 | 100.0% | 5 |
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|
||||||
|
create_stack_and_list_output_new
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|Action | Min (sec)| Max (sec)| Avg (sec)| Success| Count|
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|heat.create_stack | 13.902 | 21.117 | 16.729 | 100.0% | 5 |
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|heat.list_output_new | 0.147 | 0.363 | 0.213 | 100.0% | 5 |
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|heat.delete_stack | 6.616 | 8.202 | 7.022 | 100.0% | 5 |
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|total | 20.838 | 27.908 | 23.964 | 100.0% | 5 |
|
||||||
|
+---------------------+----------+----------+----------+--------+------+
|
||||||
|
|
||||||
|
It's also expected, because for getting list of output names is not necessary
|
||||||
|
resolved values, how it is done in new API.
|
||||||
|
|
||||||
|
All mentioned results clearly show performance changes and allow to confirm,
|
||||||
|
that new approach works correctly.
|
@ -77,6 +77,7 @@ Developing Heat
|
|||||||
developing_guides/schedulerhints
|
developing_guides/schedulerhints
|
||||||
developing_guides/gmr
|
developing_guides/gmr
|
||||||
developing_guides/supportstatus
|
developing_guides/supportstatus
|
||||||
|
developing_guides/rally_on_gates
|
||||||
|
|
||||||
API Documentation
|
API Documentation
|
||||||
========================
|
========================
|
||||||
|
Loading…
Reference in New Issue
Block a user