[Pure Storage] Enhance reported performance characteristics

Change reported performance characteristics to report an average value
over the last 30 seconds, rather than a point in time. This will ensure
that load balance scheduling better caters for anomalous peaks and troughs.

Deprecate the ``queue_depth`` characteristic and replace with more granular
IO queueing performance data.

Change-Id: I18dc6c8490a8d5771f70310f9ff3f4127e7596e5
This commit is contained in:
Simon Dodsley 2024-11-20 14:03:47 -05:00
parent 41a07d63bf
commit d7f532ee3c
4 changed files with 41 additions and 3 deletions

View File

@ -625,7 +625,10 @@ PERF_INFO = {
'write_bytes_per_sec': 2827943, 'write_bytes_per_sec': 2827943,
'time': '2015-12-17T21:50:55Z', 'time': '2015-12-17T21:50:55Z',
'usec_per_read_op': 192, 'usec_per_read_op': 192,
'queue_depth': 4, 'queue_depth': 4, # Deprecated - to be removed in 2026.1 cycle
'queue_usec_per_mirrored_write_op': 1,
'queue_usec_per_read_op': 2,
'queue_usec_per_write_op': 3,
} }
PERF_INFO_RAW = [PERF_INFO] PERF_INFO_RAW = [PERF_INFO]
@ -5114,6 +5117,11 @@ class PureVolumeUpdateStatsTestCase(PureBaseSharedDriverTestCase):
'usec_per_read_op': PERF_INFO['usec_per_read_op'], 'usec_per_read_op': PERF_INFO['usec_per_read_op'],
'usec_per_write_op': PERF_INFO['usec_per_write_op'], 'usec_per_write_op': PERF_INFO['usec_per_write_op'],
'queue_depth': PERF_INFO['queue_depth'], 'queue_depth': PERF_INFO['queue_depth'],
'queue_usec_per_mirrored_write_op': PERF_INFO[
'queue_usec_per_mirrored_write_op'
],
'queue_usec_per_read_op': PERF_INFO['queue_usec_per_read_op'],
'queue_usec_per_write_op': PERF_INFO['queue_usec_per_write_op'],
'replication_capability': 'sync', 'replication_capability': 'sync',
'replication_enabled': False, 'replication_enabled': False,
'replication_type': [], 'replication_type': [],

View File

@ -21,6 +21,7 @@ import functools
import ipaddress import ipaddress
import math import math
import re import re
import time
import uuid import uuid
import distro import distro
@ -1071,7 +1072,11 @@ class PureBaseVolumeDriver(san.SanDriver):
"""Set self._stats with relevant information.""" """Set self._stats with relevant information."""
current_array = self._get_current_array() current_array = self._get_current_array()
space_info = list(current_array.get_arrays_space().items)[0] space_info = list(current_array.get_arrays_space().items)[0]
perf_info = list(current_array.get_arrays_performance().items)[0] perf_info = list(current_array.get_arrays_performance(
end_time=int(time.time()) * 1000,
start_time=(int(time.time()) * 1000) - 30000,
resolution=30000
).items)[0]
hosts = list(current_array.get_hosts().items) hosts = list(current_array.get_hosts().items)
volumes = list(current_array.get_volumes().items) volumes = list(current_array.get_volumes().items)
snaps = list(current_array.get_volume_snapshots().items) snaps = list(current_array.get_volume_snapshots().items)
@ -1135,7 +1140,14 @@ class PureBaseVolumeDriver(san.SanDriver):
# Latency # Latency
data['usec_per_read_op'] = perf_info.usec_per_read_op data['usec_per_read_op'] = perf_info.usec_per_read_op
data['usec_per_write_op'] = perf_info.usec_per_write_op data['usec_per_write_op'] = perf_info.usec_per_write_op
# TODO: Queue depth - deprecated - remove in 2026.1 cycle
data['queue_depth'] = getattr(perf_info, 'queue_depth', 0) data['queue_depth'] = getattr(perf_info, 'queue_depth', 0)
# Detailed I/O queuieing information
data['queue_usec_per_mirrored_write_op'] = (
perf_info.queue_usec_per_mirrored_write_op)
data['queue_usec_per_read_op'] = perf_info.queue_usec_per_read_op
data['queue_usec_per_write_op'] = perf_info.queue_usec_per_write_op
# Replication # Replication
data["replication_capability"] = self._get_replication_capability() data["replication_capability"] = self._get_replication_capability()

View File

@ -361,6 +361,9 @@ A large number of metrics are reported by the volume driver which can be useful
in implementing more control over volume placement in multi-backend in implementing more control over volume placement in multi-backend
environments using the driver filter and weighter methods. environments using the driver filter and weighter methods.
Performance metrics are provided based on an average over the previous
30 seconds.
Metrics reported include, but are not limited to: Metrics reported include, but are not limited to:
.. code-block:: text .. code-block:: text
@ -378,7 +381,9 @@ Metrics reported include, but are not limited to:
output_per_sec output_per_sec
usec_per_read_op usec_per_read_op
usec_per_read_op usec_per_read_op
queue_depth queue_usec_per_mirrored_write_op
queue_usec_per_read_op
queue_usec_per_write_op
replication_type replication_type
.. note:: .. note::

View File

@ -0,0 +1,13 @@
---
features:
- |
Pure Storage: Added additional IO queueing performance characteristics
``queue_usec_per_mirrored_write_op``, ``queue_usec_per_read_op`` and
``queue_usec_per_write_op``, to array statistics used by the scheduler.
- |
Pure Storage: Changed performance metrics to report average over the previous
30 seconds, rather than using point-in-time information.
deprecations:
- |
Pure Storage: Deprecation of ``queue_depth`` performance characteristic
return by array statistics. This will be fully removed in the 2026.1 release.