849faebf5a
Prevent using cyclictest and timerlat at the same time Resolves: RHEL-35507 Add a --no-load option Resolves: RHEL-50324 Switch to autosetup, which avoids the need to list every patch in the prep section Signed-off-by: Crystal Wood <crwood@redhat.com>
464 lines
19 KiB
Diff
464 lines
19 KiB
Diff
From 70d84e566ddef917373a5eb20acf9d7cbccb1f97 Mon Sep 17 00:00:00 2001
|
|
From: Crystal Wood <crwood@redhat.com>
|
|
Date: Thu, 20 Jun 2024 21:24:15 -0500
|
|
Subject: [PATCH 2/7] rteval: Remove MeasurementProfile
|
|
|
|
Now that the ModuleInfo() flags are gone, remove the remaining infrastructure
|
|
around measurement profiles.
|
|
|
|
Signed-off-by: Crystal Wood <crwood@redhat.com>
|
|
Signed-off-by: John Kacur <jkacur@redhat.com>
|
|
---
|
|
rteval/__init__.py | 25 ++----
|
|
rteval/modules/measurement/__init__.py | 117 ++++---------------------
|
|
rteval/rteval_histogram_raw.xsl | 24 ++---
|
|
rteval/rteval_text.xsl | 41 +++------
|
|
4 files changed, 54 insertions(+), 153 deletions(-)
|
|
|
|
diff --git a/rteval/__init__.py b/rteval/__init__.py
|
|
index 4a6883e28e5b..226d14f80f48 100644
|
|
--- a/rteval/__init__.py
|
|
+++ b/rteval/__init__.py
|
|
@@ -20,7 +20,7 @@ import time
|
|
from datetime import datetime
|
|
import sysconfig
|
|
from rteval.modules.loads import LoadModules
|
|
-from rteval.modules.measurement import MeasurementModules, MeasurementProfile
|
|
+from rteval.modules.measurement import MeasurementModules
|
|
from rteval.rtevalReport import rtevalReport
|
|
from rteval.Log import Log
|
|
from rteval import rtevalConfig
|
|
@@ -131,10 +131,8 @@ class RtEval(rtevalReport):
|
|
self._measuremods.Setup(params)
|
|
|
|
|
|
- def __RunMeasurementProfile(self, measure_profile):
|
|
+ def __RunMeasurement(self):
|
|
global earlystop
|
|
- if not isinstance(measure_profile, MeasurementProfile):
|
|
- raise Exception("measure_profile is not an MeasurementProfile object")
|
|
|
|
measure_start = None
|
|
try:
|
|
@@ -155,15 +153,14 @@ class RtEval(rtevalReport):
|
|
print(f" with {self._sysinfo.mem_get_numa_nodes()} numa nodes")
|
|
else:
|
|
print("")
|
|
- cpulist = self._measuremods._MeasurementModules__cfg.GetSection("measurement").cpulist
|
|
+ cpulist = self._measuremods._cfg.GetSection("measurement").cpulist
|
|
if cpulist:
|
|
print(f"started measurement threads on cores {cpulist}")
|
|
else:
|
|
print(f"started measurement threads on {onlinecpus} cores")
|
|
print(f"Run duration: {str(self.__rtevcfg.duration)} seconds")
|
|
|
|
- # start the cyclictest thread
|
|
- measure_profile.Start()
|
|
+ self._measuremods.Start()
|
|
|
|
# Unleash the loads and measurement threads
|
|
report_interval = int(self.__rtevcfg.report_interval)
|
|
@@ -172,7 +169,7 @@ class RtEval(rtevalReport):
|
|
nthreads = threading.active_count()
|
|
else:
|
|
nthreads = None
|
|
- measure_profile.Unleash()
|
|
+ self._measuremods.Unleash()
|
|
measure_start = datetime.now()
|
|
|
|
# wait for time to expire or thread to die
|
|
@@ -185,7 +182,7 @@ class RtEval(rtevalReport):
|
|
load_avg_checked = 5
|
|
while (currtime <= stoptime) and not stopsig.is_set():
|
|
stopsig.wait(min(stoptime - currtime, 60.0))
|
|
- if not measure_profile.isAlive():
|
|
+ if not self._measuremods.isAlive():
|
|
stoptime = currtime
|
|
earlystop = True
|
|
self.__logger.log(Log.WARN,
|
|
@@ -218,7 +215,7 @@ class RtEval(rtevalReport):
|
|
|
|
finally:
|
|
# stop measurement threads
|
|
- measure_profile.Stop()
|
|
+ self._measuremods.Stop()
|
|
|
|
# stop the loads
|
|
if self._loadmods:
|
|
@@ -227,7 +224,7 @@ class RtEval(rtevalReport):
|
|
print(f"stopping run at {time.asctime()}")
|
|
|
|
# wait for measurement modules to finish calculating stats
|
|
- measure_profile.WaitForCompletion()
|
|
+ self._measuremods.WaitForCompletion()
|
|
|
|
return measure_start
|
|
|
|
@@ -236,11 +233,7 @@ class RtEval(rtevalReport):
|
|
""" Run the full measurement suite with reports """
|
|
global earlystop
|
|
rtevalres = 0
|
|
- measure_start = None
|
|
- for meas_prf in self._measuremods:
|
|
- mstart = self.__RunMeasurementProfile(meas_prf)
|
|
- if measure_start is None:
|
|
- measure_start = mstart
|
|
+ measure_start = self.__RunMeasurement()
|
|
|
|
self._report(measure_start, self.__rtevcfg.xslt_report)
|
|
if self.__rtevcfg.sysreport:
|
|
diff --git a/rteval/modules/measurement/__init__.py b/rteval/modules/measurement/__init__.py
|
|
index 7b1d84ef554d..ecadd0885991 100644
|
|
--- a/rteval/modules/measurement/__init__.py
|
|
+++ b/rteval/modules/measurement/__init__.py
|
|
@@ -8,43 +8,14 @@ from rteval.modules import RtEvalModules, ModuleContainer
|
|
from rteval.systopology import parse_cpulist_from_config
|
|
import rteval.cpulist_utils as cpulist_utils
|
|
|
|
-class MeasurementProfile(RtEvalModules):
|
|
- """Keeps and controls all the measurement modules with the same measurement profile"""
|
|
-
|
|
- def __init__(self, config, modules_root, logger):
|
|
- self._module_type = "measurement"
|
|
- self._module_config = "measurement"
|
|
- self._report_tag = "Profile"
|
|
- RtEvalModules.__init__(self, config, modules_root, logger)
|
|
-
|
|
-
|
|
- def ImportModule(self, module):
|
|
- "Imports an exported module from a ModuleContainer() class"
|
|
- return self._ImportModule(module)
|
|
-
|
|
-
|
|
- def Setup(self, modname):
|
|
- "Instantiates and prepares a measurement module"
|
|
-
|
|
- modobj = self._InstantiateModule(modname, self._cfg.GetSection(modname))
|
|
- self._RegisterModuleObject(modname, modobj)
|
|
-
|
|
-
|
|
-class MeasurementModules:
|
|
- """Class which takes care of all measurement modules and groups them into
|
|
-measurement profiles, based on their characteristics"""
|
|
+class MeasurementModules(RtEvalModules):
|
|
+ """Module container for measurement modules"""
|
|
|
|
def __init__(self, config, logger):
|
|
- self.__cfg = config
|
|
- self.__logger = logger
|
|
- self.__measureprofiles = []
|
|
- self.__modules_root = "modules.measurement"
|
|
- self.__iter_item = None
|
|
-
|
|
- # Temporary module container, which is used to evalute measurement modules.
|
|
- # This will container will be destroyed after Setup() has been called
|
|
- self.__container = ModuleContainer(self.__modules_root, self.__logger)
|
|
- self.__LoadModules(self.__cfg.GetSection("measurement"))
|
|
+ self._module_type = "measurement"
|
|
+ self._report_tag = "Measurements"
|
|
+ RtEvalModules.__init__(self, config, "modules.measurement", logger)
|
|
+ self.__LoadModules(self._cfg.GetSection("measurement"))
|
|
|
|
|
|
def __LoadModules(self, modcfg):
|
|
@@ -54,37 +25,28 @@ measurement profiles, based on their characteristics"""
|
|
# hope to eventually have different kinds but module is only on
|
|
# for now (jcw)
|
|
if m[1].lower() == 'module':
|
|
- self.__container.LoadModule(m[0])
|
|
-
|
|
-
|
|
- def GetProfile(self):
|
|
- "Returns the appropriate MeasurementProfile object, based on the profile type"
|
|
-
|
|
- for p in self.__measureprofiles:
|
|
- return p
|
|
- return None
|
|
-
|
|
+ self._LoadModule(m[0])
|
|
|
|
def SetupModuleOptions(self, parser):
|
|
"Sets up all the measurement modules' parameters for the option parser"
|
|
- grparser = self.__container.SetupModuleOptions(parser, self.__cfg)
|
|
+ grparser = super().SetupModuleOptions(parser)
|
|
|
|
# Set up options specific for measurement module group
|
|
grparser.add_argument("--measurement-run-on-isolcpus",
|
|
dest="measurement___run_on_isolcpus",
|
|
action="store_true",
|
|
- default=self.__cfg.GetSection("measurement").setdefault("run-on-isolcpus", "false").lower()
|
|
+ default=self._cfg.GetSection("measurement").setdefault("run-on-isolcpus", "false").lower()
|
|
== "true",
|
|
help="Include isolated CPUs in default cpulist")
|
|
|
|
|
|
def Setup(self, modparams):
|
|
- "Loads all measurement modules and group them into different measurement profiles"
|
|
+ "Loads all measurement modules"
|
|
|
|
if not isinstance(modparams, dict):
|
|
raise TypeError("modparams attribute is not of a dictionary type")
|
|
|
|
- modcfg = self.__cfg.GetSection("measurement")
|
|
+ modcfg = self._cfg.GetSection("measurement")
|
|
cpulist = modcfg.cpulist
|
|
run_on_isolcpus = modcfg.run_on_isolcpus
|
|
if cpulist is None:
|
|
@@ -93,61 +55,20 @@ measurement profiles, based on their characteristics"""
|
|
|
|
for (modname, modtype) in modcfg:
|
|
if isinstance(modtype, str) and modtype.lower() == 'module': # Only 'module' will be supported (ds)
|
|
- self.__container.LoadModule(modname)
|
|
-
|
|
- # Get the correct measurement profile container for this module
|
|
- mp = self.GetProfile()
|
|
- if mp is None:
|
|
- # If not found, create a new measurement profile
|
|
- mp = MeasurementProfile(self.__cfg,
|
|
- self.__modules_root, self.__logger)
|
|
- self.__measureprofiles.append(mp)
|
|
-
|
|
- # Export the module imported here and transfer it to the
|
|
- # measurement profile
|
|
- mp.ImportModule(self.__container.ExportModule(modname))
|
|
+ self._cfg.AppendConfig(modname, modparams)
|
|
+ self._cfg.AppendConfig(modname, {'cpulist':cpulist})
|
|
+ self._cfg.AppendConfig(modname, {'run-on-isolcpus':run_on_isolcpus})
|
|
|
|
- # Setup this imported module inside the appropriate measurement profile
|
|
- self.__cfg.AppendConfig(modname, modparams)
|
|
- self.__cfg.AppendConfig(modname, {'cpulist':cpulist})
|
|
- self.__cfg.AppendConfig(modname, {'run-on-isolcpus':run_on_isolcpus})
|
|
- mp.Setup(modname)
|
|
-
|
|
- del self.__container
|
|
+ modobj = self._InstantiateModule(modname, self._cfg.GetSection(modname))
|
|
+ self._RegisterModuleObject(modname, modobj)
|
|
|
|
|
|
def MakeReport(self):
|
|
- "Generates an XML report for all measurement profiles"
|
|
+ rep_n = super().MakeReport()
|
|
|
|
- # Get the reports from all meaurement modules in all measurement profiles
|
|
- rep_n = libxml2.newNode("Measurements")
|
|
- cpulist = self.__cfg.GetSection("measurement").cpulist
|
|
- run_on_isolcpus = self.__cfg.GetSection("measurement").run_on_isolcpus
|
|
+ cpulist = self._cfg.GetSection("measurement").cpulist
|
|
+ run_on_isolcpus = self._cfg.GetSection("measurement").run_on_isolcpus
|
|
cpulist = parse_cpulist_from_config(cpulist, run_on_isolcpus)
|
|
rep_n.newProp("measurecpus", cpulist_utils.collapse_cpulist(cpulist))
|
|
|
|
- for mp in self.__measureprofiles:
|
|
- mprep_n = mp.MakeReport()
|
|
- if mprep_n:
|
|
- rep_n.addChild(mprep_n)
|
|
-
|
|
return rep_n
|
|
-
|
|
-
|
|
- def __iter__(self):
|
|
- "Initiates an iteration loop for MeasurementProfile objects"
|
|
-
|
|
- self.__iter_item = len(self.__measureprofiles)
|
|
- return self
|
|
-
|
|
-
|
|
- def __next__(self):
|
|
- """Internal Python iterating method, returns the next
|
|
-MeasurementProfile object to be processed"""
|
|
-
|
|
- if self.__iter_item == 0:
|
|
- self.__iter_item = None
|
|
- raise StopIteration
|
|
-
|
|
- self.__iter_item -= 1
|
|
- return self.__measureprofiles[self.__iter_item]
|
|
diff --git a/rteval/rteval_histogram_raw.xsl b/rteval/rteval_histogram_raw.xsl
|
|
index 00b2be34f305..35d8e8461f74 100644
|
|
--- a/rteval/rteval_histogram_raw.xsl
|
|
+++ b/rteval/rteval_histogram_raw.xsl
|
|
@@ -11,25 +11,25 @@
|
|
<xsl:text>core	index	value </xsl:text>
|
|
|
|
<!-- Extract overall system histogram data -->
|
|
- <xsl:apply-templates select="Measurements/Profile/cyclictest/system/histogram/bucket">
|
|
+ <xsl:apply-templates select="Measurements/cyclictest/system/histogram/bucket">
|
|
<xsl:with-param name="label" select="'system'"/>
|
|
- <xsl:sort select="Measurements/Profile/cyclictest/core/histogram/bucket/@index" data-type="number"/>
|
|
+ <xsl:sort select="Measurements/cyclictest/core/histogram/bucket/@index" data-type="number"/>
|
|
</xsl:apply-templates>
|
|
|
|
- <xsl:apply-templates select="Measurements/Profile/timerlat/system/histogram/bucket">
|
|
+ <xsl:apply-templates select="Measurements/timerlat/system/histogram/bucket">
|
|
<xsl:with-param name="label" select="'system'"/>
|
|
- <xsl:sort select="Measurements/Profile/timerlat/core/histogram/bucket/@index" data-type="number"/>
|
|
+ <xsl:sort select="Measurements/timerlat/core/histogram/bucket/@index" data-type="number"/>
|
|
</xsl:apply-templates>
|
|
|
|
<!-- Extract per cpu core histogram data -->
|
|
- <xsl:apply-templates select="Measurements/Profile/cyclictest/core/histogram/bucket">
|
|
- <xsl:sort select="Measurements/Profile/cyclictest/core/@id" data-type="number"/>
|
|
- <xsl:sort select="Measurements/Profile/cyclictest/core/histogram/bucket/@index" data-type="number"/>
|
|
+ <xsl:apply-templates select="Measurements/cyclictest/core/histogram/bucket">
|
|
+ <xsl:sort select="Measurements/cyclictest/core/@id" data-type="number"/>
|
|
+ <xsl:sort select="Measurements/cyclictest/core/histogram/bucket/@index" data-type="number"/>
|
|
</xsl:apply-templates>
|
|
|
|
- <xsl:apply-templates select="Measurements/Profile/timerlat/core/histogram/bucket">
|
|
- <xsl:sort select="Measurements/Profile/timerlat/core/@id" data-type="number"/>
|
|
- <xsl:sort select="Measurements/Profile/timerlat/core/histogram/bucket/@index" data-type="number"/>
|
|
+ <xsl:apply-templates select="Measurements/timerlat/core/histogram/bucket">
|
|
+ <xsl:sort select="Measurements/timerlat/core/@id" data-type="number"/>
|
|
+ <xsl:sort select="Measurements/timerlat/core/histogram/bucket/@index" data-type="number"/>
|
|
</xsl:apply-templates>
|
|
|
|
</xsl:template>
|
|
@@ -38,7 +38,7 @@
|
|
<!-- -->
|
|
|
|
<!-- Record formatting -->
|
|
- <xsl:template match="/rteval/Measurements/Profile/cyclictest/*/histogram/bucket">
|
|
+ <xsl:template match="/rteval/Measurements/cyclictest/*/histogram/bucket">
|
|
<xsl:param name="label"/>
|
|
<xsl:choose>
|
|
<!-- If we don't have a id tag in what should be a 'core' tag, use the given label -->
|
|
@@ -54,7 +54,7 @@
|
|
<xsl:text> </xsl:text>
|
|
</xsl:template>
|
|
|
|
- <xsl:template match="/rteval/Measurements/Profile/timerlat/*/histogram/bucket">
|
|
+ <xsl:template match="/rteval/Measurements/timerlat/*/histogram/bucket">
|
|
<xsl:param name="label"/>
|
|
<xsl:choose>
|
|
<!-- If we don't have a id tag in what should be a 'core' tag, use the given label -->
|
|
diff --git a/rteval/rteval_text.xsl b/rteval/rteval_text.xsl
|
|
index 7ca0ae3a4c66..b801679abcc5 100644
|
|
--- a/rteval/rteval_text.xsl
|
|
+++ b/rteval/rteval_text.xsl
|
|
@@ -154,8 +154,8 @@
|
|
<xsl:value-of select="SystemInfo/cmdlineInfo/cmdline"/>
|
|
<xsl:text> </xsl:text>
|
|
|
|
- <!-- Generate a summary report for all measurement profiles -->
|
|
- <xsl:apply-templates select="Measurements/Profile"/>
|
|
+ <!-- Generate a summary report for all measurement modules -->
|
|
+ <xsl:apply-templates select="Measurements"/>
|
|
<xsl:text> =================================================================== </xsl:text>
|
|
</xsl:template>
|
|
<!-- -->
|
|
@@ -178,21 +178,8 @@
|
|
</xsl:template>
|
|
|
|
|
|
- <xsl:template match="/rteval/Measurements/Profile">
|
|
- <xsl:text> Measurement profile </xsl:text>
|
|
- <xsl:value-of select="position()"/><xsl:text>: </xsl:text>
|
|
- <xsl:choose>
|
|
- <xsl:when test="@loads = '1'"><xsl:text>With loads, </xsl:text></xsl:when>
|
|
- <xsl:otherwise><xsl:text>Without loads, </xsl:text></xsl:otherwise>
|
|
- </xsl:choose>
|
|
- <xsl:choose>
|
|
- <xsl:when test="@parallel = '1'">
|
|
- <xsl:text>measurements in parallel</xsl:text>
|
|
- </xsl:when>
|
|
- <xsl:otherwise>
|
|
- <xsl:text>measurements serialised</xsl:text>
|
|
- </xsl:otherwise>
|
|
- </xsl:choose>
|
|
+ <xsl:template match="/rteval/Measurements">
|
|
+ <xsl:text> Measurements: </xsl:text>
|
|
<xsl:text> </xsl:text>
|
|
|
|
<!-- Format other sections of the report, if they are found -->
|
|
@@ -206,7 +193,7 @@
|
|
</xsl:template>
|
|
|
|
<!-- Format the cyclictest section of the report -->
|
|
- <xsl:template match="/rteval/Measurements/Profile/cyclictest">
|
|
+ <xsl:template match="/rteval/Measurements/cyclictest">
|
|
<xsl:text> Latency test </xsl:text>
|
|
|
|
<xsl:text> Started: </xsl:text>
|
|
@@ -238,7 +225,7 @@
|
|
|
|
|
|
<!-- Format the CPU core section in the cyclictest part -->
|
|
- <xsl:template match="/rteval/Measurements/Profile/cyclictest/core">
|
|
+ <xsl:template match="/rteval/Measurements/cyclictest/core">
|
|
<xsl:text> CPU core </xsl:text>
|
|
<xsl:value-of select="@id"/>
|
|
<xsl:text> Priority: </xsl:text>
|
|
@@ -251,7 +238,7 @@
|
|
|
|
|
|
<!-- Generic formatting of statistics information -->
|
|
- <xsl:template match="/rteval/Measurements/Profile/cyclictest/*/statistics">
|
|
+ <xsl:template match="/rteval/Measurements/cyclictest/*/statistics">
|
|
<xsl:text> Samples: </xsl:text>
|
|
<xsl:value-of select="samples"/>
|
|
<xsl:text> </xsl:text>
|
|
@@ -301,7 +288,7 @@
|
|
</xsl:template>
|
|
|
|
<!-- Format the timerlat section of the report -->
|
|
- <xsl:template match="/rteval/Measurements/Profile/timerlat">
|
|
+ <xsl:template match="/rteval/Measurements/timerlat">
|
|
<xsl:text> Latency test </xsl:text>
|
|
|
|
<xsl:text> Started: </xsl:text>
|
|
@@ -345,7 +332,7 @@
|
|
|
|
|
|
<!-- Format the CPU core section in the timerlat part -->
|
|
- <xsl:template match="/rteval/Measurements/Profile/timerlat/core">
|
|
+ <xsl:template match="/rteval/Measurements/timerlat/core">
|
|
<xsl:text> CPU core </xsl:text>
|
|
<xsl:value-of select="@id"/>
|
|
<xsl:text> Priority: </xsl:text>
|
|
@@ -358,7 +345,7 @@
|
|
|
|
|
|
<!-- Generic formatting of statistics information -->
|
|
- <xsl:template match="/rteval/Measurements/Profile/timerlat/*/statistics">
|
|
+ <xsl:template match="/rteval/Measurements/timerlat/*/statistics">
|
|
<xsl:text> Samples: </xsl:text>
|
|
<xsl:value-of select="samples"/>
|
|
<xsl:text> </xsl:text>
|
|
@@ -409,7 +396,7 @@
|
|
|
|
|
|
<!-- Format the hwlatdetect test section of the report -->
|
|
- <xsl:template match="/rteval/Measurements/Profile/hwlatdetect[@format='1.0' and not(@aborted)]">
|
|
+ <xsl:template match="/rteval/Measurements/hwlatdetect[@format='1.0' and not(@aborted)]">
|
|
<xsl:text> Hardware latency detector </xsl:text>
|
|
|
|
<xsl:text> Run duration: </xsl:text>
|
|
@@ -434,12 +421,12 @@
|
|
<xsl:apply-templates select="samples/sample"/>
|
|
</xsl:template>
|
|
|
|
- <xsl:template match="/rteval/Measurements/Profile/hwlatdetect[@format='1.0' and @aborted > 0]">
|
|
+ <xsl:template match="/rteval/Measurements/hwlatdetect[@format='1.0' and @aborted > 0]">
|
|
<xsl:text> Hardware latency detector </xsl:text>
|
|
<xsl:text> ** WARNING ** hwlatedect failed to run </xsl:text>
|
|
</xsl:template>
|
|
|
|
- <xsl:template match="/rteval/Measurements/Profile/hwlatdetect[@format='1.0']/samples/sample">
|
|
+ <xsl:template match="/rteval/Measurements/hwlatdetect[@format='1.0']/samples/sample">
|
|
<xsl:text> - @</xsl:text>
|
|
<xsl:value-of select="@timestamp"/>
|
|
<xsl:text> </xsl:text>
|
|
@@ -448,7 +435,7 @@
|
|
</xsl:template>
|
|
|
|
<!-- Format the cyclictest section of the report -->
|
|
- <xsl:template match="/rteval/Measurements/Profile/sysstat">
|
|
+ <xsl:template match="/rteval/Measurements/sysstat">
|
|
<xsl:text> sysstat measurements </xsl:text>
|
|
|
|
<xsl:text> Started: </xsl:text>
|
|
--
|
|
2.45.2
|
|
|