Now that the ModuleInfo() flags are gone, remove the remaining infrastructure around measurement profiles. Signed-off-by: Crystal Wood <crwood@xxxxxxxxxx> --- 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 2f03bda0bb55..1297b12f77e6 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> @@ -333,7 +320,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> @@ -346,7 +333,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> @@ -397,7 +384,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> @@ -422,12 +409,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> @@ -436,7 +423,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.1