From 70d84e566ddef917373a5eb20acf9d7cbccb1f97 Mon Sep 17 00:00:00 2001 From: Crystal Wood 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 Signed-off-by: John Kacur --- 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 @@ core index value - + - + - + - + - - - + + + - - - + + + @@ -38,7 +38,7 @@ - + @@ -54,7 +54,7 @@ - + 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 @@ - - + + =================================================================== @@ -178,21 +178,8 @@ - - Measurement profile - : - - With loads, - Without loads, - - - - measurements in parallel - - - measurements serialised - - + + Measurements: @@ -206,7 +193,7 @@ - + Latency test Started: @@ -238,7 +225,7 @@ - + CPU core Priority: @@ -251,7 +238,7 @@ - + Samples: @@ -301,7 +288,7 @@ - + Latency test Started: @@ -345,7 +332,7 @@ - + CPU core Priority: @@ -358,7 +345,7 @@ - + Samples: @@ -409,7 +396,7 @@ - + Hardware latency detector Run duration: @@ -434,12 +421,12 @@ - + Hardware latency detector ** WARNING ** hwlatedect failed to run - + - @ @@ -448,7 +435,7 @@ - + sysstat measurements Started: -- 2.45.2