ironic/doc/source/admin/hardware-burn-in.rst
Arne Wiebalck 26a6b4ed00 [doc] Add documentation on SMART test after disk burn-in
Add documentation for 'agent_burnin_fio_disk_smart_test' option
for disk burn-in.

Story: #2007523
Task: #43383

Change-Id: I686acddeb353839b045d5c0ad944114cb938f414
2022-11-16 13:35:35 +01:00

247 lines
8.3 KiB
ReStructuredText

.. _hardware-burn-in:
================
Hardware Burn-in
================
Overview
========
Workflows to onboard new hardware often include a stress-testing step to
provoke early failures and to avoid that these load-triggered issues only
occur when the nodes have already moved to production. These ``burn-in``
tests typically include CPU, memory, disk, and network. With the Xena
release, Ironic supports such tests as part of the cleaning framework.
The burn-in steps rely on standard tools such as
`stress-ng <https://wiki.ubuntu.com/Kernel/Reference/stress-ng>`_ for CPU
and memory, or `fio <https://fio.readthedocs.io/en/latest/>`_ for disk and
network. The burn-in cleaning steps are part of the generic hardware manager
in the Ironic Python Agent (IPA) and therefore the agent ramdisk does not
need to be bundled with a specific
:ironic-python-agent-doc:`IPA hardware manager
<admin/hardware_managers.html>` to have them available.
Each burn-in step accepts (or in the case of network: needs) some basic
configuration options, mostly to limit the duration of the test and to
specify the amount of resources to be used. The options are set on a node's
``driver-info`` and prefixed with ``agent_burnin_``. The options available
for the individual tests will be outlined below.
CPU burn-in
===========
The options, following a `agent_burnin_` + stress-ng stressor (`cpu`) +
stress-ng option schema, are:
* ``agent_burnin_cpu_timeout`` (default: 24 hours)
* ``agent_burnin_cpu_cpu`` (default: 0, meaning all CPUs)
to limit the overall runtime and to pick the number of CPUs to stress.
For instance, in order to limit the time of the CPU burn-in to 10 minutes
do:
.. code-block:: console
baremetal node set --driver-info agent_burnin_cpu_timeout=600 \
$NODE_NAME_OR_UUID
Then launch the test with:
.. code-block:: console
baremetal node clean --clean-steps '[{"step": "burnin_cpu", \
"interface": "deploy"}]' $NODE_NAME_OR_UUID
Memory burn-in
==============
The options, following a `agent_burnin_` + stress-ng stressor (`vm`) +
stress-ng option schema, are:
* ``agent_burnin_vm_timeout`` (default: 24 hours)
* ``agent_burnin_vm_vm-bytes`` (default: 98%)
to limit the overall runtime and to set the fraction of RAM to stress.
For instance, in order to limit the time of the memory burn-in to 1 hour
and the amount of RAM to be used to 75% run:
.. code-block:: console
baremetal node set --driver-info agent_burnin_vm_timeout=3600 \
$NODE_NAME_OR_UUID
baremetal node set --driver-info agent_burnin_vm_vm-bytes=75% \
$NODE_NAME_OR_UUID
Then launch the test with:
.. code-block:: console
baremetal node clean --clean-steps '[{"step": "burnin_memory", \
"interface": "deploy"}]' $NODE_NAME_OR_UUID
Disk burn-in
============
The options, following a `agent_burnin_` + fio stressor (`fio_disk`) +
fio option schema, are:
* agent_burnin_fio_disk_runtime (default: 0, meaning no time limit)
* agent_burnin_fio_disk_loops (default: 4)
to set the time limit and the number of iterations when going
over the disks.
For instance, in order to limit the number of loops to 2 set:
.. code-block:: console
baremetal node set --driver-info agent_burnin_fio_disk_loops=2 \
$NODE_NAME_OR_UUID
Then launch the test with:
.. code-block:: console
baremetal node clean --clean-steps '[{"step": "burnin_disk", \
"interface": "deploy"}]' $NODE_NAME_OR_UUID
In order to launch a parallel SMART self test on all devices after the
disk burn-in (which will fail the step if any of the tests fail), set:
.. code-block:: console
baremetal node set --driver-info agent_burnin_fio_disk_smart_test=True \
$NODE_NAME_OR_UUID
Network burn-in
===============
Burning in the network needs a little more config, since we need a pair
of nodes to perform the test. This pairing can be done either in a static
way, i.e. pairs are defined upfront, or dynamically via a distributed
coordination backend which orchestrates the pair matching. While the
static approach is more predictable in terms of which nodes test each
other, the dynamic approach avoids nodes being blocked in case there
are issues with servers and simply pairs all available nodes.
Static network burn-in configuration
------------------------------------
To define pairs of nodes statically, each node can be assigned a
``agent_burnin_fio_network_config`` JSON which requires a ``role`` field
(values: ``reader``, ``writer``) and a ``partner`` field (value is the
hostname of the other node to test), like:
.. code-block:: console
baremetal node set --driver-info agent_burnin_fio_network_config= \
'{"role": "writer", "partner": "$HOST2"}' $NODE_NAME_OR_UUID1
baremetal node set --driver-info agent_burnin_fio_network_config= \
'{"role": "reader", "partner": "$HOST1"}' $NODE_NAME_OR_UUID2
Dynamic network burn-in configuration
-------------------------------------
In order to use dynamic pair matching, a coordination backend is used
via `tooz <https://docs.openstack.org/tooz/latest/>`_. The corresponding
backend URL then needs to be added to the node, e.g. for a Zookeeper
backend it would look similar to:
.. code-block:: console
baremetal node set --driver-info \
agent_burnin_fio_network_pairing_backend_url= \
'zookeeper://zk1.xyz.com:2181,zk2.xyz.com:2181,zk3.xyz.com:2181' \
$NODE_NAME_OR_UUID1
baremetal node set --driver-info \
agent_burnin_fio_network_pairing_backend_url= \
'zookeeper://zk1.xyz.com:2181,zk2.xyz.com:2181,zk3.xyz.com:2181' \
$NODE_NAME_OR_UUID2
...
baremetal node set --driver-info \
agent_burnin_fio_network_pairing_backend_url= \
'zookeeper://zk1.xyz.com:2181,zk2.xyz.com:2181,zk3.xyz.com:2181' \
$NODE_NAME_OR_UUIDN
Different deliveries or network ports can be separated by creating
different rooms on the backend with:
.. code-block:: console
baremetal node set --driver-info \
agent_burnin_fio_network_pairing_group_name=$DELIVERY $NODE_NAME_OR_UUID
This allows to control which nodes (or interfaces) connect with which other
nodes (or interfaces).
Launching network burn-in
-------------------------
In addition and similar to the other tests, there is a runtime option
to be set (only on the writer):
.. code-block:: console
baremetal node set --driver-info agent_burnin_fio_network_runtime=600 \
$NODE_NAME_OR_UUID
The actual network burn-in can then be launched with:
.. code-block:: console
baremetal node clean --clean-steps '[{"step": "burnin_network",\
"interface": "deploy"}]' $NODE_NAME_OR_UUID1
baremetal node clean --clean-steps '[{"step": "burnin_network",\
"interface": "deploy"}]' $NODE_NAME_OR_UUID2
Both nodes will wait for the other node to show up and block while waiting.
If the partner does not show up, the cleaning timeout will step in.
Logging
=======
Since most of the burn-in steps are also providing information about the
performance of the stressed components, keeping this information for
verification or acceptance purposes may be desirable. By default, the
output of the burn-in tools goes to the journal of the Ironic Python
Agent and is therefore sent back as an archive to the conductor. In order
to consume the output of the burn-in steps more easily, or even in real-time,
the nodes can be configured to store the output of the individual steps to
files in the ramdisk (from where they can be picked up by a logging pipeline).
The configuration of the outpout file is done via one of
``agent_burnin_cpu_outputfile``, ``agent_burnin_vm_outputfile``,
``agent_burnin_fio_disk_outputfile``, and
``agent_burnin_fio_network_outputfile`` parameters which need to be added
to a node like:
.. code-block:: console
baremetal node set --driver-info agent_burnin_cpu_outputfile=\
'/var/log/burnin.cpu' $NODE_NAME_OR_UUID
Additional Information
======================
All tests can be aborted at any moment with
.. code-block:: console
baremetal node abort $NODE_NAME_OR_UUID
One can also launch multiple tests which will be run in sequence, e.g.:
.. code-block:: console
baremetal node clean --clean-steps '[{"step": "burnin_cpu",\
"interface": "deploy"}, {"step": "burnin_memory",\
"interface": "deploy"}]' $NODE_NAME_OR_UUID
If desired, configuring ``fast-track`` may be helpful here as it allows
to keep the node up between consecutive calls of ``baremetal node clean``.