From dbf67eb6d58ba5a2c8f1bfe8ee23815c6f082904 Mon Sep 17 00:00:00 2001 From: Mohsen Rezaei Estabragh <mohsen.rezaei.estabragh@cern.ch> Date: Fri, 13 Mar 2020 18:14:17 +0100 Subject: [PATCH 1/3] elementary modifications, baselines --- Tools/PyJobTransforms/python/trfExe.py | 7 +++++++ Tools/PyJobTransforms/python/trfReports.py | 1 + Tools/PyJobTransforms/python/trfUtils.py | 4 ++++ Tools/PyJobTransforms/test/test_trfReports.py | 5 +++++ 4 files changed, 17 insertions(+) diff --git a/Tools/PyJobTransforms/python/trfExe.py b/Tools/PyJobTransforms/python/trfExe.py index cfb198bfe41a..d4e4ee6aa0e3 100755 --- a/Tools/PyJobTransforms/python/trfExe.py +++ b/Tools/PyJobTransforms/python/trfExe.py @@ -381,6 +381,13 @@ class transformExecutor(object): def memStats(self): return self._memStats + @property + def memEval(self): + if self._memStats: + return calcMemExcess(self._memStats) + else: + return None + @property def postExeCpuTime(self): if self._exeStop and self._valStart: diff --git a/Tools/PyJobTransforms/python/trfReports.py b/Tools/PyJobTransforms/python/trfReports.py index 63e009b90dee..eb4036bd303f 100644 --- a/Tools/PyJobTransforms/python/trfReports.py +++ b/Tools/PyJobTransforms/python/trfReports.py @@ -656,6 +656,7 @@ def exeResourceReport(exe, report): if exe.memStats: exeResource['memory'] = exe.memStats + exeResource['MaxVMEM'] = exe.memEval if exe.eventCount: exeResource['nevents'] = exe.eventCount if exe.athenaMP: diff --git a/Tools/PyJobTransforms/python/trfUtils.py b/Tools/PyJobTransforms/python/trfUtils.py index 230ba083f46d..f27834cedd38 100644 --- a/Tools/PyJobTransforms/python/trfUtils.py +++ b/Tools/PyJobTransforms/python/trfUtils.py @@ -1296,3 +1296,7 @@ def bind_port(host, port): ret=1 s.close() return ret + +def calcMemExcess(memStat): + maxVmem = memStat['Max']['maxVMEM'] + return Vmem diff --git a/Tools/PyJobTransforms/test/test_trfReports.py b/Tools/PyJobTransforms/test/test_trfReports.py index d709c2dd5ad6..201461dc933e 100755 --- a/Tools/PyJobTransforms/test/test_trfReports.py +++ b/Tools/PyJobTransforms/test/test_trfReports.py @@ -44,6 +44,9 @@ class trfFileReportUnitTests(unittest.TestCase): self.myMultiFile = trfArgClasses.argFile(['file1', 'file2', 'file3'], name = 'inputTEST_MULTIFile', io = 'input', guid = {'file1': '05ACBDD0-5F5F-4E2E-974A-BBF4F4FE6F0B', 'file2': '1368D295-27C6-4A92-8187-704C2A6A5864', 'file3': 'F5BA4602-6CA7-4111-B3C7-CB06486B30D9'}) self.myMultiFileReport = trfFileReport(self.myMultiFile) + self.mytrfReport = trfReport() # trfArgClasses.argFile(['file1'], name = 'inputTEST_SINGLEFile', io = 'input', guid = {'file1': '05ACBDD0-5F5F-4E2E-974A-BBF4F4FE6F0B'}) ##??? should be contain of all keys??? + self.myJobReport = trfJobReport(self.mytrfReport) + def tearDown(self): for f in 'file1', 'file2', 'file3': try: @@ -66,6 +69,8 @@ class trfFileReportUnitTests(unittest.TestCase): self.assertEqual(self.myMultiFileReport.python(type = 'full'), {'argName': 'inputTEST_MULTIFile', 'subFiles': [{'file_guid': '05ACBDD0-5F5F-4E2E-974A-BBF4F4FE6F0B', 'name': 'file1', 'file_size': 20}, {'file_guid': '1368D295-27C6-4A92-8187-704C2A6A5864', 'name': 'file2', 'file_size': 13}, {'file_guid': 'F5BA4602-6CA7-4111-B3C7-CB06486B30D9', 'name': 'file3', 'file_size': 174}], 'type': None, 'dataset': None}) self.assertEqual(self.myMultiFileReport.python(type = 'name'), {'subFiles': [{'file_guid': '05ACBDD0-5F5F-4E2E-974A-BBF4F4FE6F0B', 'name': 'file1'}, {'file_guid': '1368D295-27C6-4A92-8187-704C2A6A5864', 'name': 'file2'}, {'file_guid': 'F5BA4602-6CA7-4111-B3C7-CB06486B30D9', 'name': 'file3'}], 'nentries': 'UNDEFINED', 'dataset': None}) + def test_JobReportPython(self): + self.assertEqual(self.myJobReport.python(),{} ) class machineReportUnitTests(unittest.TestCase): # Following tests don't test content, just that the generation of the objects happens correctly -- GitLab From 6870e2e2c38bf99aaee6906e217f092adab5642c Mon Sep 17 00:00:00 2001 From: Mohsen Rezaei Estabragh <mohsen.rezaei.estabragh@cern.ch> Date: Thu, 25 Jun 2020 08:39:00 +0200 Subject: [PATCH 2/3] reading full mem file and reporting first line of this file to jobReport --- Tools/PyJobTransforms/python/trfExe.py | 20 +++++++++++++++++--- Tools/PyJobTransforms/python/trfReports.py | 9 ++++++++- Tools/PyJobTransforms/python/trfUtils.py | 13 +++++++++++-- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/Tools/PyJobTransforms/python/trfExe.py b/Tools/PyJobTransforms/python/trfExe.py index d4e4ee6aa0e3..247b3a4bf804 100755 --- a/Tools/PyJobTransforms/python/trfExe.py +++ b/Tools/PyJobTransforms/python/trfExe.py @@ -38,7 +38,7 @@ msg = logging.getLogger(__name__) from PyJobTransforms.trfJobOptions import JobOptionsTemplate from PyJobTransforms.trfUtils import asetupReport, unpackDBRelease, setupDBRelease, cvmfsDBReleaseCheck, forceToAlphaNum -from PyJobTransforms.trfUtils import ValgrindCommand, isInteractiveEnv, calcCpuTime, calcWallTime +from PyJobTransforms.trfUtils import ValgrindCommand, isInteractiveEnv, calcCpuTime, calcWallTime, calcMemExcess, calcMemFull from PyJobTransforms.trfUtils import bind_port from PyJobTransforms.trfExitCodes import trfExit from PyJobTransforms.trfLogger import stdLogLevels @@ -184,6 +184,7 @@ class transformExecutor(object): self._exeStart = self._exeStop = None self._valStart = self._valStop = None self._memStats = {} + self._memFullStats = '' self._eventCount = None self._athenaMP = None self._athenaMT = None @@ -388,6 +389,13 @@ class transformExecutor(object): else: return None + @property + def memFullEval(self): + if self._memFullStats: + return calcMemFull(self._memFullStats) + else: + return 'cant read full mem file' + @property def postExeCpuTime(self): if self._exeStop and self._valStart: @@ -724,6 +732,7 @@ class scriptExecutor(transformExecutor): if self._memMonitor: try: self._memSummaryFile = 'prmon.summary.' + self._name + '.json' + self._memFullFile = 'prmon.full.' + self._name memMonitorCommand = ['prmon', '--pid', str(p.pid), '--filename', 'prmon.full.' + self._name, '--json-summary', self._memSummaryFile, '--interval', '30'] mem_proc = subprocess.Popen(memMonitorCommand, shell = False, close_fds=True, **encargs) @@ -771,7 +780,13 @@ class scriptExecutor(transformExecutor): msg.warning('Failed to load JSON memory summmary file {0}: {1}'.format(self._memSummaryFile, e)) self._memMonitor = False self._memStats = {} - + try: + self._memFullStats = open(self._memFullFile) + except Exception as e: + msg.warning('Failed to load JSON memory full file {0}: {1}'.format(self._memFullFile, e)) + self._memMonitor = False + self._memFullStats = 'could not open mem.full file!!' + def validate(self): if self._valStart is None: @@ -812,7 +827,6 @@ class scriptExecutor(transformExecutor): msg.debug('valStop time is {0}'.format(self._valStop)) - class athenaExecutor(scriptExecutor): _exitMessageLimit = 200 # Maximum error message length to report in the exitMsg _defaultIgnorePatternFile = ['atlas_error_mask.db'] diff --git a/Tools/PyJobTransforms/python/trfReports.py b/Tools/PyJobTransforms/python/trfReports.py index eb4036bd303f..b86f1b499903 100644 --- a/Tools/PyJobTransforms/python/trfReports.py +++ b/Tools/PyJobTransforms/python/trfReports.py @@ -656,7 +656,14 @@ def exeResourceReport(exe, report): if exe.memStats: exeResource['memory'] = exe.memStats - exeResource['MaxVMEM'] = exe.memEval + if exe.memEval: + exeResource['MaxVMEM'] = exe.memEval + else: + exeResource['MaxVMEM'] = 'at least report this' + if exe.memFullEval: + exeResource['FullMem'] = exe.memFullEval + else: + exeResource['FullMem'] = 'at least report this' if exe.eventCount: exeResource['nevents'] = exe.eventCount if exe.athenaMP: diff --git a/Tools/PyJobTransforms/python/trfUtils.py b/Tools/PyJobTransforms/python/trfUtils.py index f27834cedd38..63cf5c79c4c0 100644 --- a/Tools/PyJobTransforms/python/trfUtils.py +++ b/Tools/PyJobTransforms/python/trfUtils.py @@ -1298,5 +1298,14 @@ def bind_port(host, port): return ret def calcMemExcess(memStat): - maxVmem = memStat['Max']['maxVMEM'] - return Vmem + maxVmem = memStat['Max']['vmem'] + reportSum = 'couldnt get it' + reportSum = maxVmem + return reportSum + +def calcMemFull(memFullStats): + reportFull = 'in utiles: can not read lines!!' + for line in memFullStats: + reportFull = line + break + return reportFull -- GitLab From 92ecf89f8d74409aa756b478f1db7757ae0de690 Mon Sep 17 00:00:00 2001 From: Mohsen Rezaei Estabragh <mohsen.rezaei.estabragh@cern.ch> Date: Thu, 2 Jul 2020 09:37:28 +0200 Subject: [PATCH 3/3] removing redundancies --- Tools/PyJobTransforms/python/trfExe.py | 11 ++--------- Tools/PyJobTransforms/python/trfReports.py | 4 ---- Tools/PyJobTransforms/python/trfUtils.py | 6 ------ Tools/PyJobTransforms/test/test_trfReports.py | 5 ----- 4 files changed, 2 insertions(+), 24 deletions(-) diff --git a/Tools/PyJobTransforms/python/trfExe.py b/Tools/PyJobTransforms/python/trfExe.py index 247b3a4bf804..4852574ab83d 100755 --- a/Tools/PyJobTransforms/python/trfExe.py +++ b/Tools/PyJobTransforms/python/trfExe.py @@ -38,7 +38,7 @@ msg = logging.getLogger(__name__) from PyJobTransforms.trfJobOptions import JobOptionsTemplate from PyJobTransforms.trfUtils import asetupReport, unpackDBRelease, setupDBRelease, cvmfsDBReleaseCheck, forceToAlphaNum -from PyJobTransforms.trfUtils import ValgrindCommand, isInteractiveEnv, calcCpuTime, calcWallTime, calcMemExcess, calcMemFull +from PyJobTransforms.trfUtils import ValgrindCommand, isInteractiveEnv, calcCpuTime, calcWallTime, calcMemFull from PyJobTransforms.trfUtils import bind_port from PyJobTransforms.trfExitCodes import trfExit from PyJobTransforms.trfLogger import stdLogLevels @@ -382,13 +382,6 @@ class transformExecutor(object): def memStats(self): return self._memStats - @property - def memEval(self): - if self._memStats: - return calcMemExcess(self._memStats) - else: - return None - @property def memFullEval(self): if self._memFullStats: @@ -787,7 +780,6 @@ class scriptExecutor(transformExecutor): self._memMonitor = False self._memFullStats = 'could not open mem.full file!!' - def validate(self): if self._valStart is None: self._valStart = os.times() @@ -827,6 +819,7 @@ class scriptExecutor(transformExecutor): msg.debug('valStop time is {0}'.format(self._valStop)) + class athenaExecutor(scriptExecutor): _exitMessageLimit = 200 # Maximum error message length to report in the exitMsg _defaultIgnorePatternFile = ['atlas_error_mask.db'] diff --git a/Tools/PyJobTransforms/python/trfReports.py b/Tools/PyJobTransforms/python/trfReports.py index b86f1b499903..9d7fdee6c110 100644 --- a/Tools/PyJobTransforms/python/trfReports.py +++ b/Tools/PyJobTransforms/python/trfReports.py @@ -656,10 +656,6 @@ def exeResourceReport(exe, report): if exe.memStats: exeResource['memory'] = exe.memStats - if exe.memEval: - exeResource['MaxVMEM'] = exe.memEval - else: - exeResource['MaxVMEM'] = 'at least report this' if exe.memFullEval: exeResource['FullMem'] = exe.memFullEval else: diff --git a/Tools/PyJobTransforms/python/trfUtils.py b/Tools/PyJobTransforms/python/trfUtils.py index 63cf5c79c4c0..43918b56ed8b 100644 --- a/Tools/PyJobTransforms/python/trfUtils.py +++ b/Tools/PyJobTransforms/python/trfUtils.py @@ -1297,12 +1297,6 @@ def bind_port(host, port): s.close() return ret -def calcMemExcess(memStat): - maxVmem = memStat['Max']['vmem'] - reportSum = 'couldnt get it' - reportSum = maxVmem - return reportSum - def calcMemFull(memFullStats): reportFull = 'in utiles: can not read lines!!' for line in memFullStats: diff --git a/Tools/PyJobTransforms/test/test_trfReports.py b/Tools/PyJobTransforms/test/test_trfReports.py index 201461dc933e..d709c2dd5ad6 100755 --- a/Tools/PyJobTransforms/test/test_trfReports.py +++ b/Tools/PyJobTransforms/test/test_trfReports.py @@ -44,9 +44,6 @@ class trfFileReportUnitTests(unittest.TestCase): self.myMultiFile = trfArgClasses.argFile(['file1', 'file2', 'file3'], name = 'inputTEST_MULTIFile', io = 'input', guid = {'file1': '05ACBDD0-5F5F-4E2E-974A-BBF4F4FE6F0B', 'file2': '1368D295-27C6-4A92-8187-704C2A6A5864', 'file3': 'F5BA4602-6CA7-4111-B3C7-CB06486B30D9'}) self.myMultiFileReport = trfFileReport(self.myMultiFile) - self.mytrfReport = trfReport() # trfArgClasses.argFile(['file1'], name = 'inputTEST_SINGLEFile', io = 'input', guid = {'file1': '05ACBDD0-5F5F-4E2E-974A-BBF4F4FE6F0B'}) ##??? should be contain of all keys??? - self.myJobReport = trfJobReport(self.mytrfReport) - def tearDown(self): for f in 'file1', 'file2', 'file3': try: @@ -69,8 +66,6 @@ class trfFileReportUnitTests(unittest.TestCase): self.assertEqual(self.myMultiFileReport.python(type = 'full'), {'argName': 'inputTEST_MULTIFile', 'subFiles': [{'file_guid': '05ACBDD0-5F5F-4E2E-974A-BBF4F4FE6F0B', 'name': 'file1', 'file_size': 20}, {'file_guid': '1368D295-27C6-4A92-8187-704C2A6A5864', 'name': 'file2', 'file_size': 13}, {'file_guid': 'F5BA4602-6CA7-4111-B3C7-CB06486B30D9', 'name': 'file3', 'file_size': 174}], 'type': None, 'dataset': None}) self.assertEqual(self.myMultiFileReport.python(type = 'name'), {'subFiles': [{'file_guid': '05ACBDD0-5F5F-4E2E-974A-BBF4F4FE6F0B', 'name': 'file1'}, {'file_guid': '1368D295-27C6-4A92-8187-704C2A6A5864', 'name': 'file2'}, {'file_guid': 'F5BA4602-6CA7-4111-B3C7-CB06486B30D9', 'name': 'file3'}], 'nentries': 'UNDEFINED', 'dataset': None}) - def test_JobReportPython(self): - self.assertEqual(self.myJobReport.python(),{} ) class machineReportUnitTests(unittest.TestCase): # Following tests don't test content, just that the generation of the objects happens correctly -- GitLab