From 3d6391c372b5d9491ad21f316593d5df434f3d31 Mon Sep 17 00:00:00 2001 From: Giuseppe Lo Re Date: Mon, 17 Jun 2019 14:25:51 +0200 Subject: [PATCH 01/11] Update of ior_check Resumed work on reframe-ior tests. --- cscs-checks/system/io/ior_check.py | 331 +++++++++++++---------------- 1 file changed, 142 insertions(+), 189 deletions(-) diff --git a/cscs-checks/system/io/ior_check.py b/cscs-checks/system/io/ior_check.py index cd2b6aab87..1e7e583240 100644 --- a/cscs-checks/system/io/ior_check.py +++ b/cscs-checks/system/io/ior_check.py @@ -1,160 +1,160 @@ import os +import getpass import reframe as rfm import reframe.utility.sanity as sn - +fs = { + '/scratch/snx1600tds' : { + 'valid_systems' : ['dom:gpu'], + 'dom' : { + 'num_tasks' : 2, + # 1 task per node to avoid cache effects on read (other options + # like -C did produce the desired impact) + # 8 tasks are enough to get ~peak perf (write 5.4 GB/s, read 4.3 GB/s) + } + }, + '/scratch/snx1600' : { + 'valid_systems' : ['daint:gpu'], + 'daint' : { + 'num_tasks' : 1, #to validate + } + }, + '/scratch/snx3000tds' : { + 'valid_systems' : ['dom:gpu'], + 'dom' : { + 'num_tasks' : 2, #to validate + } + }, + '/scratch/snx3000' : { + 'valid_systems' : ['daint:gpu'], + 'daint' : { + 'num_tasks' : 1, #to validate + } + }, + '/users' : { + 'valid_systems' : ['daint:gpu', 'dom:gpu', 'fulen:normal'], + 'ior_block_size' : '8g', + 'daint' : { + 'num_tasks' : 1, #to validate + }, + 'dom' : { + 'num_tasks' : 1, #to validate + }, + #self.tags |= {'maintenance'} ??? + 'fulen' : { + 'num_tasks' : 1, + 'build_system_cc' : 'mpicc', + 'build_system_cxx' : 'mpic++', + 'valid_prog_environs' : ['PrgEnv-gnu'] + } + }, + '/scratch/shared/fulen' : { + 'valid_systems' : ['fulen:normal'], + 'ior_block_size' : '48g', + 'fulen' : { + 'num_tasks' : 8, + 'build_system_cc' : 'mpicc', + 'build_system_cxx' : 'mpic++', + 'valid_prog_environs' : ['PrgEnv-gnu'] + } + } +} + +#Setting some default values +for data in fs.values(): + if not 'ior_block_size' in data: + data['ior_block_size'] = '24g' + if not 'ior_access_type' in data: + data['ior_access_type'] = 'MPIIO' + if not 'reference' in data: + data['reference'] = { + 'read_bw': (1, -0.5, None), + 'write_bw': (1, -0.5, None) + } + class IorCheck(rfm.RegressionTest): - def __init__(self, fs_mount_point): + def __init__(self, fs_root_dir): super().__init__() - self.descr = 'IOR check (%s)' % fs_mount_point - self.tags = {'ops', fs_mount_point} - - if fs_mount_point == '/scratch/snx1600': - self.valid_systems = ['daint:gpu'] - self.num_tasks = 2400 - self.num_tasks_per_node = 12 - elif fs_mount_point == '/scratch/snx1600tds': - self.valid_systems = ['dom:gpu'] - self.num_tasks = 192 - self.num_tasks_per_node = 12 - elif fs_mount_point == '/scratch/snx2000': - self.valid_systems = ['dom:gpu'] - if self.current_system.name == 'dom': - self.num_tasks = 192 - self.num_tasks_per_node = 12 - else: - self.num_tasks = 1 - self.num_tasks_per_node = 1 - elif fs_mount_point == '/scratch/snx2000tds': - self.valid_systems = ['dom:gpu'] - if self.current_system.name == 'dom': - self.num_tasks = 192 - self.num_tasks_per_node = 12 - else: - self.num_tasks = 1 - self.num_tasks_per_node = 1 - elif fs_mount_point == '/scratch/snx3000': - self.valid_systems = ['daint:gpu'] - self.num_tasks = 720 - self.num_tasks_per_node = 12 - elif fs_mount_point == '/users': - self.valid_systems = ['daint:gpu', 'dom:gpu'] - self.num_tasks = 1 - self.num_tasks_per_node = 1 - self.tags |= {'maintenance'} - elif fs_mount_point == '/apps': - self.valid_systems = ['daint:gpu', 'dom:gpu'] + self.descr = 'IOR check (%s)' % fs_root_dir + self.tags = {'ops', fs_root_dir} + + self.fs_root_dir = fs_root_dir + self.username = getpass.getuser() + self.test_dir = os.path.join(self.fs_root_dir, self.username, '.ior') + self.test_file = os.path.join(self.test_dir, 'ior.dat') + + try: + os.mkdir(self.test_dir) + except OSError: + pass + + self.valid_systems = fs[fs_root_dir]['valid_systems'] + + try: + self.num_tasks = fs[fs_root_dir][self.current_system.name]['num_tasks'] + except KeyError: self.num_tasks = 1 + try: + self.num_tasks_per_node = fs[fs_root_dir][self.current_system.name]['num_tasks_per_node'] + except KeyError: self.num_tasks_per_node = 1 - - self.valid_prog_environs = ['PrgEnv-cray'] + + self.ior_block_size = fs[fs_root_dir]['ior_block_size'] + self.ior_access_type = fs[fs_root_dir]['ior_access_type'] + self.executable_opts = ['-B', '-F', '-C ', '-Q 1', '-t 4m', '-D 30', + '-b', self.ior_block_size, '-a', self.ior_access_type, + '-o', self.test_file] self.sourcesdir = os.path.join(self.current_system.resourcesdir, 'IOR') self.executable = os.path.join('src', 'C', 'IOR') self.build_system = 'Make' + + try: + self.valid_prog_environs = fs[fs_root_dir][self.current_system.name]['valid_prog_environs'] + except KeyError: + self.valid_prog_environs = ['PrgEnv-cray'] + + try: + self.build_system.cc = fs[fs_root_dir][self.current_system.name]['build_system_cc'] + except KeyError: + pass + try: + self.build_system.cxx = fs[fs_root_dir][self.current_system.name]['build_system_cxx'] + except KeyError: + pass + self.build_system.options = ['posix', 'mpiio'] self.build_system.max_concurrency = 1 self.num_gpus_per_node = 0 - self.fs_mount_point = fs_mount_point - self.fs_reference = { - '/scratch/snx1600': { - 'read_bw': (64326, -0.2, None), - 'write_bw': (151368, -0.2, None) - }, - '/scratch/snx1600tds': { - 'read_bw': (1, -0.5, None), - 'write_bw': (1, -0.5, None) - }, - '/scratch/snx2000': { - 'read_bw': (12310, -0.2, None), - 'write_bw': (11380, -0.2, None) - }, - '/scratch/snx2000tds': { - 'read_bw': (1, -0.5, None), - 'write_bw': (1, -0.5, None) - }, - '/scratch/snx3000': { - 'read_bw': (70753, -0.2, None), - 'write_bw': (83552, -0.2, None) - }, - '/apps': { - 'read_bw': (204, -1.0, None), - 'write_bw': (319, -1.0, None) - }, - '/users': { - 'read_bw': (83, -1.0, None), - 'write_bw': (304, -1.0, None) - }, - '/mnt/lnec': { - 'read_bw': (0, None, None), - 'write_bw': (0, None, None) - } - } + # Default umask is 0022, which generates file permissions -rw-r--r-- # we want -rw-rw-r-- so we set umask to 0002 os.umask(2) - self.time_limit = (0, 7, 0) + self.time_limit = (0, 5, 0) # Our references are based on fs types but regression needs reference # per system. self.reference = { - '*': self.fs_reference[self.fs_mount_point] + '*': fs[fs_root_dir]['reference'] } - self.maintainers = ['SO', 'MP'] - - -@rfm.parameterized_test(['/scratch/snx1600', 'MPIIO'], - ['/scratch/snx1600tds', 'MPIIO'], - ['/scratch/snx2000', 'MPIIO'], - ['/scratch/snx2000tds', 'MPIIO'], - ['/scratch/snx3000', 'MPIIO'], - ['/users', 'POSIX'], - ['/apps', 'POSIX']) -class IorReadCheck(IorCheck): - def __init__(self, fs_mount_point, ior_type): - super().__init__(fs_mount_point) - self.test_file = os.path.join(self.fs_mount_point, '.ior', 'read', - 'ior_write.dat') - if ior_type == 'MPIIO': - self.executable_opts = ['-r', '-a MPIIO', '-B', '-E', '-F', - '-t 64m', '-b 32g', '-D 300', '-k', - '-o', self.test_file] - elif ior_type == 'POSIX': - self.executable_opts = ['-r', '-a POSIX', '-B', '-E', '-F', - '-t 1m', '-b 100m', '-D 60', '-k', - '-o', self.test_file] - - self.sanity_patterns = sn.assert_found(r'^Max Read: ', self.stdout) - self.perf_patterns = { - 'read_bw': sn.extractsingle( - r'^Max Read:\s+(?P\S+) MiB/sec', self.stdout, - 'read_bw', float) - } - self.tags |= {'read'} + self.maintainers = ['SO', 'GLR'] + if self.current_system.name == 'dom': + self.tags = {'production'} -@rfm.parameterized_test(['/scratch/snx1600', 'MPIIO'], - ['/scratch/snx1600tds', 'MPIIO'], - ['/scratch/snx2000', 'MPIIO'], - ['/scratch/snx2000tds', 'MPIIO'], - ['/scratch/snx3000', 'MPIIO'], - ['/users', 'POSIX'], - ['/apps', 'POSIX']) +@rfm.parameterized_test( + ['/scratch/snx1600tds'], + ['/scratch/snx1600'], + ['/scratch/snx3000tds'], + ['/scratch/snx3000'], + ['/users'], + ['/scratch/shared/fulen'] +) class IorWriteCheck(IorCheck): - def __init__(self, fs_mount_point, ior_type): - super().__init__(fs_mount_point) - self.test_file = os.path.join(self.fs_mount_point, '.ior', 'write', - 'ior_write.dat') - if ior_type == 'MPIIO': - self.executable_opts = ['-w', '-a MPIIO', '-B', '-E', '-F', - '-t 64m', '-b 46g', '-D 300', - '-o', self.test_file] - elif ior_type == 'POSIX': - self.executable_opts = ['-w', '-a POSIX', '-B', '-E', '-F', - '-t 1m', '-b 100m', '-D 60' - '-o', self.test_file] - + def __init__(self, fs_root_dir): + super().__init__(fs_root_dir) + self.executable_opts.extend(['-w', '-k']) self.sanity_patterns = sn.assert_found(r'^Max Write: ', self.stdout) self.perf_patterns = { 'write_bw': sn.extractsingle( @@ -163,47 +163,18 @@ def __init__(self, fs_mount_point, ior_type): } self.tags |= {'write'} - -# FIXME: This test is obsolete; it is kept only for reference. -class IoMonchAcceptanceBase(IorCheck): - def __init__(self, fs_mount_point, ior_type, num_tasks): - super().__init__(fs_mount_point) - self.test_file = os.path.join(self.fs_mount_point, os.getenv('USER'), - 'ior_write.dat') - self.valid_systems = ['monch:compute'] - self.valid_prog_environs = ['PrgEnv-gnu'] - self.num_tasks = num_tasks - self.num_tasks_per_node = 20 - reference_by_num_tasks = { - 40: { - 'read_bw': (4343.66, -0.2, None), - 'write_bw': (3625.23, -0.2, None) - }, - 80: { - 'read_bw': (9208.83, -0.2, None), - 'write_bw': (6725.39, -0.2, None) - }, - 160: { - 'read_bw': (12365.53, -0.2, None), - 'write_bw': (8073.84, -0.2, None) - }, - } - self.reference = { - 'monch:compute': reference_by_num_tasks[self.num_tasks] - } - self.tags = {'monch_acceptance'} - - -# FIXME: This test is obsolete; it is kept only for reference. -@rfm.parameterized_test(*(['/mnt/lnec', 'MPIIO', num_tasks] - for num_tasks in [40, 80, 160])) -class IorReadScratchMonchAcceptanceCheck(IoMonchAcceptanceBase): - def __init__(self, fs_mount_point, ior_type, num_tasks): - super().__init__(fs_mount_point, ior_type, num_tasks) - if ior_type == 'MPIIO': - self.executable_opts = ['-r', '-a MPIIO', '-B', '-E', '-F', - '-t 16m', '-b 8g', '-D 10', '-k', - '-o', self.test_file] +@rfm.parameterized_test( + ['/scratch/snx1600tds'], + ['/scratch/snx1600'], + ['/scratch/snx3000tds'], + ['/scratch/snx3000'], + ['/users'], + ['/scratch/shared/fulen'] +) +class IorReadCheck(IorCheck): + def __init__(self, fs_root_dir): + super().__init__(fs_root_dir) + self.executable_opts.extend(['-r']) self.sanity_patterns = sn.assert_found(r'^Max Read: ', self.stdout) self.perf_patterns = { 'read_bw': sn.extractsingle( @@ -211,21 +182,3 @@ def __init__(self, fs_mount_point, ior_type, num_tasks): 'read_bw', float) } self.tags |= {'read'} - - -# FIXME: This test is obsolete; it is kept only for reference. -@rfm.parameterized_test(*(['/mnt/lnec', 'MPIIO', num_tasks] - for num_tasks in [40, 80, 160])) -class IorWriteScratchMonchAcceptanceCheck(IoMonchAcceptanceBase): - def __init__(self, fs_mount_point, ior_type, num_tasks): - super().__init__(fs_mount_point, ior_type, num_tasks) - if ior_type == 'MPIIO': - self.executable_opts = ['-w', '-a MPIIO', '-B', '-E', '-F', - '-t 16m', '-b 8g', '-o', self.test_file] - self.sanity_patterns = sn.assert_found(r'^Max Write: ', self.stdout) - self.perf_patterns = { - 'write_bw': sn.extractsingle( - r'^Max Write:\s+(?P\S+) MiB/sec', self.stdout, - 'write_bw', float) - } - self.tags |= {'write'} From 4a34b22e101493d070564e6f4ada23a60913699c Mon Sep 17 00:00:00 2001 From: Giuseppe Lo Re Date: Mon, 17 Jun 2019 15:06:34 +0200 Subject: [PATCH 02/11] Update on ior_check Started to apply coding convention rules. --- cscs-checks/system/io/ior_check.py | 79 +++++++++++++++--------------- 1 file changed, 39 insertions(+), 40 deletions(-) diff --git a/cscs-checks/system/io/ior_check.py b/cscs-checks/system/io/ior_check.py index 1e7e583240..7c4768bbf5 100644 --- a/cscs-checks/system/io/ior_check.py +++ b/cscs-checks/system/io/ior_check.py @@ -5,58 +5,57 @@ import reframe.utility.sanity as sn fs = { - '/scratch/snx1600tds' : { - 'valid_systems' : ['dom:gpu'], - 'dom' : { - 'num_tasks' : 2, - # 1 task per node to avoid cache effects on read (other options - # like -C did produce the desired impact) - # 8 tasks are enough to get ~peak perf (write 5.4 GB/s, read 4.3 GB/s) + '/scratch/snx1600tds': { + 'valid_systems': ['dom:gpu'], + 'dom': { + 'num_tasks': 2, + # 1 task per node to avoid cache effects on read (other options + # like -C did produce the desired impact) 8 tasks are enough + # to get ~peak perf (write 5.4 GB/s, read 4.3 GB/s) } }, - '/scratch/snx1600' : { - 'valid_systems' : ['daint:gpu'], - 'daint' : { - 'num_tasks' : 1, #to validate + '/scratch/snx1600': { + 'valid_systems': ['daint:gpu'], + 'daint': { + 'num_tasks': 1, #to validate } }, - '/scratch/snx3000tds' : { - 'valid_systems' : ['dom:gpu'], - 'dom' : { - 'num_tasks' : 2, #to validate + '/scratch/snx3000tds': { + 'valid_systems': ['dom:gpu'], + 'dom': { + 'num_tasks': 2, #to validate } }, - '/scratch/snx3000' : { - 'valid_systems' : ['daint:gpu'], - 'daint' : { - 'num_tasks' : 1, #to validate + '/scratch/snx3000': { + 'valid_systems': ['daint:gpu'], + 'daint': { + 'num_tasks': 1, #to validate } }, - '/users' : { - 'valid_systems' : ['daint:gpu', 'dom:gpu', 'fulen:normal'], - 'ior_block_size' : '8g', - 'daint' : { - 'num_tasks' : 1, #to validate + '/users': { + 'valid_systems': ['daint:gpu', 'dom:gpu', 'fulen:normal'], + 'ior_block_size': '8g', + 'daint': { + 'num_tasks': 1, #to validate }, - 'dom' : { - 'num_tasks' : 1, #to validate + 'dom': { + 'num_tasks': 1, #to validate }, - #self.tags |= {'maintenance'} ??? - 'fulen' : { - 'num_tasks' : 1, - 'build_system_cc' : 'mpicc', - 'build_system_cxx' : 'mpic++', - 'valid_prog_environs' : ['PrgEnv-gnu'] + 'fulen': { + 'num_tasks': 1, + 'build_system_cc': 'mpicc', + 'build_system_cxx': 'mpic++', + 'valid_prog_environs': ['PrgEnv-gnu'] } }, - '/scratch/shared/fulen' : { - 'valid_systems' : ['fulen:normal'], - 'ior_block_size' : '48g', - 'fulen' : { - 'num_tasks' : 8, - 'build_system_cc' : 'mpicc', - 'build_system_cxx' : 'mpic++', - 'valid_prog_environs' : ['PrgEnv-gnu'] + '/scratch/shared/fulen': { + 'valid_systems': ['fulen:normal'], + 'ior_block_size': '48g', + 'fulen': { + 'num_tasks': 8, + 'build_system_cc': 'mpicc', + 'build_system_cxx': 'mpic++', + 'valid_prog_environs': ['PrgEnv-gnu'] } } } From 121e992fb509caae4130fba2d7c4b0f55b2adb3f Mon Sep 17 00:00:00 2001 From: Giuseppe Lo Re Date: Mon, 17 Jun 2019 15:28:50 +0200 Subject: [PATCH 03/11] Update on ior_check Fixed a few coding violations. --- cscs-checks/system/io/ior_check.py | 102 +++++++++++++++-------------- 1 file changed, 54 insertions(+), 48 deletions(-) diff --git a/cscs-checks/system/io/ior_check.py b/cscs-checks/system/io/ior_check.py index 7c4768bbf5..75e836e497 100644 --- a/cscs-checks/system/io/ior_check.py +++ b/cscs-checks/system/io/ior_check.py @@ -8,7 +8,7 @@ '/scratch/snx1600tds': { 'valid_systems': ['dom:gpu'], 'dom': { - 'num_tasks': 2, + 'num_tasks': 2, # 1 task per node to avoid cache effects on read (other options # like -C did produce the desired impact) 8 tasks are enough # to get ~peak perf (write 5.4 GB/s, read 4.3 GB/s) @@ -17,32 +17,32 @@ '/scratch/snx1600': { 'valid_systems': ['daint:gpu'], 'daint': { - 'num_tasks': 1, #to validate + 'num_tasks': 1, # to validate } }, '/scratch/snx3000tds': { 'valid_systems': ['dom:gpu'], 'dom': { - 'num_tasks': 2, #to validate + 'num_tasks': 2, # to validate } }, '/scratch/snx3000': { 'valid_systems': ['daint:gpu'], 'daint': { - 'num_tasks': 1, #to validate + 'num_tasks': 1, # to validate } }, '/users': { 'valid_systems': ['daint:gpu', 'dom:gpu', 'fulen:normal'], 'ior_block_size': '8g', 'daint': { - 'num_tasks': 1, #to validate + 'num_tasks': 1, # to validate }, 'dom': { - 'num_tasks': 1, #to validate + 'num_tasks': 1, # to validate }, 'fulen': { - 'num_tasks': 1, + 'num_tasks': 1, 'build_system_cc': 'mpicc', 'build_system_cxx': 'mpic++', 'valid_prog_environs': ['PrgEnv-gnu'] @@ -52,7 +52,7 @@ 'valid_systems': ['fulen:normal'], 'ior_block_size': '48g', 'fulen': { - 'num_tasks': 8, + 'num_tasks': 8, 'build_system_cc': 'mpicc', 'build_system_cxx': 'mpic++', 'valid_prog_environs': ['PrgEnv-gnu'] @@ -60,73 +60,78 @@ } } -#Setting some default values +# Setting some default values for data in fs.values(): - if not 'ior_block_size' in data: + if 'ior_block_size' not in data: data['ior_block_size'] = '24g' - if not 'ior_access_type' in data: + if 'ior_access_type' not in data: data['ior_access_type'] = 'MPIIO' - if not 'reference' in data: + if 'reference' not in data: data['reference'] = { 'read_bw': (1, -0.5, None), 'write_bw': (1, -0.5, None) } - + + class IorCheck(rfm.RegressionTest): - def __init__(self, fs_root_dir): + def __init__(self, base_dir): super().__init__() - self.descr = 'IOR check (%s)' % fs_root_dir - self.tags = {'ops', fs_root_dir} - - self.fs_root_dir = fs_root_dir + self.descr = 'IOR check (%s)' % base_dir + self.tags = {'ops', base_dir} + + self.base_dir = base_dir self.username = getpass.getuser() - self.test_dir = os.path.join(self.fs_root_dir, self.username, '.ior') + self.test_dir = os.path.join(self.base_dir, self.username, '.ior') self.test_file = os.path.join(self.test_dir, 'ior.dat') try: os.mkdir(self.test_dir) except OSError: pass - - self.valid_systems = fs[fs_root_dir]['valid_systems'] - + + self.valid_systems = fs[base_dir]['valid_systems'] + + cur_sys = self.current_system.name + try: - self.num_tasks = fs[fs_root_dir][self.current_system.name]['num_tasks'] + self.num_tasks = fs[base_dir][cur_sys]['num_tasks'] except KeyError: self.num_tasks = 1 try: - self.num_tasks_per_node = fs[fs_root_dir][self.current_system.name]['num_tasks_per_node'] + tasks_per_node = fs[base_dir][cur_sys]['num_tasks_per_node'] + self.num_tasks_per_node = tasks_per_node except KeyError: self.num_tasks_per_node = 1 - - self.ior_block_size = fs[fs_root_dir]['ior_block_size'] - self.ior_access_type = fs[fs_root_dir]['ior_access_type'] + + self.ior_block_size = fs[base_dir]['ior_block_size'] + self.ior_access_type = fs[base_dir]['ior_access_type'] self.executable_opts = ['-B', '-F', '-C ', '-Q 1', '-t 4m', '-D 30', - '-b', self.ior_block_size, '-a', self.ior_access_type, + '-b', self.ior_block_size, + '-a', self.ior_access_type, '-o', self.test_file] self.sourcesdir = os.path.join(self.current_system.resourcesdir, 'IOR') self.executable = os.path.join('src', 'C', 'IOR') self.build_system = 'Make' try: - self.valid_prog_environs = fs[fs_root_dir][self.current_system.name]['valid_prog_environs'] + prog_env = fs[base_dir][cur_sys]['valid_prog_environs'] + self.valid_prog_environs = prog_env except KeyError: self.valid_prog_environs = ['PrgEnv-cray'] - + try: - self.build_system.cc = fs[fs_root_dir][self.current_system.name]['build_system_cc'] + self.build_system.cc = fs[base_dir][cur_sys]['build_system_cc'] except KeyError: pass try: - self.build_system.cxx = fs[fs_root_dir][self.current_system.name]['build_system_cxx'] + self.build_system.cxx = fs[base_dir][cur_sys]['build_system_cxx'] except KeyError: pass - + self.build_system.options = ['posix', 'mpiio'] self.build_system.max_concurrency = 1 self.num_gpus_per_node = 0 - # Default umask is 0022, which generates file permissions -rw-r--r-- # we want -rw-rw-r-- so we set umask to 0002 os.umask(2) @@ -134,13 +139,14 @@ def __init__(self, fs_root_dir): # Our references are based on fs types but regression needs reference # per system. self.reference = { - '*': fs[fs_root_dir]['reference'] + '*': fs[base_dir]['reference'] } self.maintainers = ['SO', 'GLR'] if self.current_system.name == 'dom': - self.tags = {'production'} + self.tags = {'production'} + @rfm.parameterized_test( ['/scratch/snx1600tds'], @@ -151,8 +157,8 @@ def __init__(self, fs_root_dir): ['/scratch/shared/fulen'] ) class IorWriteCheck(IorCheck): - def __init__(self, fs_root_dir): - super().__init__(fs_root_dir) + def __init__(self, base_dir): + super().__init__(base_dir) self.executable_opts.extend(['-w', '-k']) self.sanity_patterns = sn.assert_found(r'^Max Write: ', self.stdout) self.perf_patterns = { @@ -162,17 +168,17 @@ def __init__(self, fs_root_dir): } self.tags |= {'write'} -@rfm.parameterized_test( - ['/scratch/snx1600tds'], - ['/scratch/snx1600'], - ['/scratch/snx3000tds'], - ['/scratch/snx3000'], - ['/users'], - ['/scratch/shared/fulen'] -) + +@rfm.parameterized_test(['/scratch/snx1600tds'], + ['/scratch/snx1600'], + ['/scratch/snx3000tds'], + ['/scratch/snx3000'], + ['/users'], + ['/scratch/shared/fulen'] + ) class IorReadCheck(IorCheck): - def __init__(self, fs_root_dir): - super().__init__(fs_root_dir) + def __init__(self, base_dir): + super().__init__(base_dir) self.executable_opts.extend(['-r']) self.sanity_patterns = sn.assert_found(r'^Max Read: ', self.stdout) self.perf_patterns = { From b2da2a346013bbab4d0cef3f5b4bfc620ec19bc8 Mon Sep 17 00:00:00 2001 From: Giuseppe Lo Re Date: Tue, 25 Jun 2019 14:21:10 -0700 Subject: [PATCH 04/11] Update on ior_check few comment/style fixes --- cscs-checks/system/io/ior_check.py | 152 ++++++++++++++--------------- 1 file changed, 75 insertions(+), 77 deletions(-) diff --git a/cscs-checks/system/io/ior_check.py b/cscs-checks/system/io/ior_check.py index 75e836e497..dc3634eed9 100644 --- a/cscs-checks/system/io/ior_check.py +++ b/cscs-checks/system/io/ior_check.py @@ -4,74 +4,6 @@ import reframe as rfm import reframe.utility.sanity as sn -fs = { - '/scratch/snx1600tds': { - 'valid_systems': ['dom:gpu'], - 'dom': { - 'num_tasks': 2, - # 1 task per node to avoid cache effects on read (other options - # like -C did produce the desired impact) 8 tasks are enough - # to get ~peak perf (write 5.4 GB/s, read 4.3 GB/s) - } - }, - '/scratch/snx1600': { - 'valid_systems': ['daint:gpu'], - 'daint': { - 'num_tasks': 1, # to validate - } - }, - '/scratch/snx3000tds': { - 'valid_systems': ['dom:gpu'], - 'dom': { - 'num_tasks': 2, # to validate - } - }, - '/scratch/snx3000': { - 'valid_systems': ['daint:gpu'], - 'daint': { - 'num_tasks': 1, # to validate - } - }, - '/users': { - 'valid_systems': ['daint:gpu', 'dom:gpu', 'fulen:normal'], - 'ior_block_size': '8g', - 'daint': { - 'num_tasks': 1, # to validate - }, - 'dom': { - 'num_tasks': 1, # to validate - }, - 'fulen': { - 'num_tasks': 1, - 'build_system_cc': 'mpicc', - 'build_system_cxx': 'mpic++', - 'valid_prog_environs': ['PrgEnv-gnu'] - } - }, - '/scratch/shared/fulen': { - 'valid_systems': ['fulen:normal'], - 'ior_block_size': '48g', - 'fulen': { - 'num_tasks': 8, - 'build_system_cc': 'mpicc', - 'build_system_cxx': 'mpic++', - 'valid_prog_environs': ['PrgEnv-gnu'] - } - } -} - -# Setting some default values -for data in fs.values(): - if 'ior_block_size' not in data: - data['ior_block_size'] = '24g' - if 'ior_access_type' not in data: - data['ior_access_type'] = 'MPIIO' - if 'reference' not in data: - data['reference'] = { - 'read_bw': (1, -0.5, None), - 'write_bw': (1, -0.5, None) - } - class IorCheck(rfm.RegressionTest): def __init__(self, base_dir): @@ -89,22 +21,88 @@ def __init__(self, base_dir): except OSError: pass - self.valid_systems = fs[base_dir]['valid_systems'] + self.fs = { + '/scratch/snx1600tds': { + 'valid_systems': ['dom:gpu'], + 'dom': { + 'num_tasks': 2, + # We will be using 1 task per node to avoid cache + # effects on read. The option "-C" could be used + # with many tasks per node. 8 tasks are enough + # to get ~peak perf (write 5.4 GB/s, read 4.3 GB/s) + } + }, + '/scratch/snx1600': { + 'valid_systems': ['daint:gpu'], + 'daint': { + 'num_tasks': 1, # to validate + } + }, + '/scratch/snx3000tds': { + 'valid_systems': ['dom:gpu'], + 'dom': { + 'num_tasks': 2, # to validate + } + }, + '/scratch/snx3000': { + 'valid_systems': ['daint:gpu'], + 'daint': { + 'num_tasks': 1, # to validate + } + }, + '/users': { + 'valid_systems': ['daint:gpu', 'dom:gpu', 'fulen:normal'], + 'ior_block_size': '8g', + 'daint': { + 'num_tasks': 1, # to validate + }, + 'dom': { + 'num_tasks': 1, # to validate + }, + 'fulen': { + 'num_tasks': 1, + 'build_system_cc': 'mpicc', + 'build_system_cxx': 'mpic++', + 'valid_prog_environs': ['PrgEnv-gnu'] + } + }, + '/scratch/shared/fulen': { + 'valid_systems': ['fulen:normal'], + 'ior_block_size': '48g', + 'fulen': { + 'num_tasks': 8, + 'build_system_cc': 'mpicc', + 'build_system_cxx': 'mpic++', + 'valid_prog_environs': ['PrgEnv-gnu'] + } + } + } + + # Setting some default values + for data in self.fs.values(): + data.setdefault('ior_block_size', '24g') + data.setdefault('ior_access_type', 'MPIIO') + data.setdefault('reference', + {'read_bw': (1, -0.5, None), + 'write_bw': (1, -0.5, None) + }) + + self.valid_systems = self.fs[base_dir]['valid_systems'] cur_sys = self.current_system.name try: - self.num_tasks = fs[base_dir][cur_sys]['num_tasks'] + self.num_tasks = self.fs[base_dir][cur_sys]['num_tasks'] except KeyError: self.num_tasks = 1 try: - tasks_per_node = fs[base_dir][cur_sys]['num_tasks_per_node'] + tasks_per_node = self.fs[base_dir][cur_sys]['num_tasks_per_node'] self.num_tasks_per_node = tasks_per_node except KeyError: self.num_tasks_per_node = 1 - self.ior_block_size = fs[base_dir]['ior_block_size'] - self.ior_access_type = fs[base_dir]['ior_access_type'] + self.ior_block_size = self.fs[base_dir]['ior_block_size'] + self.ior_access_type = self.fs[base_dir]['ior_access_type'] self.executable_opts = ['-B', '-F', '-C ', '-Q 1', '-t 4m', '-D 30', '-b', self.ior_block_size, '-a', self.ior_access_type, @@ -114,17 +112,17 @@ def __init__(self, base_dir): self.build_system = 'Make' try: - prog_env = fs[base_dir][cur_sys]['valid_prog_environs'] + prog_env = self.fs[base_dir][cur_sys]['valid_prog_environs'] self.valid_prog_environs = prog_env except KeyError: self.valid_prog_environs = ['PrgEnv-cray'] try: - self.build_system.cc = fs[base_dir][cur_sys]['build_system_cc'] + self.build_system.cc = self.fs[base_dir][cur_sys]['build_system_cc'] except KeyError: pass try: - self.build_system.cxx = fs[base_dir][cur_sys]['build_system_cxx'] + self.build_system.cxx = self.fs[base_dir][cur_sys]['build_system_cxx'] except KeyError: pass @@ -139,7 +137,7 @@ def __init__(self, base_dir): # Our references are based on fs types but regression needs reference # per system. self.reference = { - '*': fs[base_dir]['reference'] + '*': self.fs[base_dir]['reference'] } self.maintainers = ['SO', 'GLR'] From 61d55a65d60ae8da216acfa4836a702ae6fbd397 Mon Sep 17 00:00:00 2001 From: Giuseppe Lo Re Date: Tue, 25 Jun 2019 14:38:39 -0700 Subject: [PATCH 05/11] moved test_dir creation inside self.pre_run --- cscs-checks/system/io/ior_check.py | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/cscs-checks/system/io/ior_check.py b/cscs-checks/system/io/ior_check.py index dc3634eed9..c3c8892379 100644 --- a/cscs-checks/system/io/ior_check.py +++ b/cscs-checks/system/io/ior_check.py @@ -14,13 +14,9 @@ def __init__(self, base_dir): self.base_dir = base_dir self.username = getpass.getuser() self.test_dir = os.path.join(self.base_dir, self.username, '.ior') + self.pre_run = ['mkdir -p ' + self.test_dir] self.test_file = os.path.join(self.test_dir, 'ior.dat') - try: - os.mkdir(self.test_dir) - except OSError: - pass - self.fs = { '/scratch/snx1600tds': { 'valid_systems': ['dom:gpu'], @@ -146,14 +142,13 @@ def __init__(self, base_dir): self.tags = {'production'} -@rfm.parameterized_test( - ['/scratch/snx1600tds'], - ['/scratch/snx1600'], - ['/scratch/snx3000tds'], - ['/scratch/snx3000'], - ['/users'], - ['/scratch/shared/fulen'] -) +@rfm.parameterized_test(['/scratch/snx1600tds'], + ['/scratch/snx1600'], + ['/scratch/snx3000tds'], + ['/scratch/snx3000'], + ['/users'], + ['/scratch/shared/fulen'] + ) class IorWriteCheck(IorCheck): def __init__(self, base_dir): super().__init__(base_dir) From 094bdeb8b4a96e44f0111cd1c7998145ad7ff652 Mon Sep 17 00:00:00 2001 From: GiuseppeLoRe Date: Tue, 25 Jun 2019 14:41:48 -0700 Subject: [PATCH 06/11] Update cscs-checks/system/io/ior_check.py Co-Authored-By: Vasileios Karakasis --- cscs-checks/system/io/ior_check.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cscs-checks/system/io/ior_check.py b/cscs-checks/system/io/ior_check.py index c3c8892379..9c289d55d9 100644 --- a/cscs-checks/system/io/ior_check.py +++ b/cscs-checks/system/io/ior_check.py @@ -172,7 +172,7 @@ def __init__(self, base_dir): class IorReadCheck(IorCheck): def __init__(self, base_dir): super().__init__(base_dir) - self.executable_opts.extend(['-r']) + self.executable_opts += ['-r'] self.sanity_patterns = sn.assert_found(r'^Max Read: ', self.stdout) self.perf_patterns = { 'read_bw': sn.extractsingle( From 59c0161652c656198824ed284ae6a7ce91e46df9 Mon Sep 17 00:00:00 2001 From: Giuseppe Lo Re Date: Tue, 25 Jun 2019 15:40:58 -0700 Subject: [PATCH 07/11] Update on ior_check Removed Fulen specifics as they should be fixed in the fulen settings. --- cscs-checks/system/io/ior_check.py | 63 +++++++++++------------------- 1 file changed, 22 insertions(+), 41 deletions(-) diff --git a/cscs-checks/system/io/ior_check.py b/cscs-checks/system/io/ior_check.py index 9c289d55d9..08a75c13c2 100644 --- a/cscs-checks/system/io/ior_check.py +++ b/cscs-checks/system/io/ior_check.py @@ -1,4 +1,5 @@ import os +import sys import getpass import reframe as rfm @@ -30,35 +31,26 @@ def __init__(self, base_dir): }, '/scratch/snx1600': { 'valid_systems': ['daint:gpu'], - 'daint': { - 'num_tasks': 1, # to validate - } + 'daint': {} }, '/scratch/snx3000tds': { 'valid_systems': ['dom:gpu'], 'dom': { - 'num_tasks': 2, # to validate + 'num_tasks': 4, } }, '/scratch/snx3000': { 'valid_systems': ['daint:gpu'], - 'daint': { - 'num_tasks': 1, # to validate - } + 'daint': {} }, '/users': { 'valid_systems': ['daint:gpu', 'dom:gpu', 'fulen:normal'], 'ior_block_size': '8g', - 'daint': { - 'num_tasks': 1, # to validate - }, - 'dom': { - 'num_tasks': 1, # to validate - }, + 'daint': {}, + 'dom': {}, 'fulen': { - 'num_tasks': 1, - 'build_system_cc': 'mpicc', - 'build_system_cxx': 'mpic++', + #'build_system_cc': 'mpicc', + #'build_system_cxx': 'mpic++', 'valid_prog_environs': ['PrgEnv-gnu'] } }, @@ -67,8 +59,8 @@ def __init__(self, base_dir): 'ior_block_size': '48g', 'fulen': { 'num_tasks': 8, - 'build_system_cc': 'mpicc', - 'build_system_cxx': 'mpic++', + #'build_system_cc': 'mpicc', + #'build_system_cxx': 'mpic++', 'valid_prog_environs': ['PrgEnv-gnu'] } } @@ -87,15 +79,16 @@ def __init__(self, base_dir): cur_sys = self.current_system.name - try: - self.num_tasks = self.fs[base_dir][cur_sys]['num_tasks'] - except KeyError: - self.num_tasks = 1 - try: - tasks_per_node = self.fs[base_dir][cur_sys]['num_tasks_per_node'] - self.num_tasks_per_node = tasks_per_node - except KeyError: - self.num_tasks_per_node = 1 + # Check whether cur_sys is present in the fs dict + if cur_sys not in self.fs: + exit_msg = '%s is not present in the self.fs ' % cur_sys + exit_msg += 'confguration dict. Aborting.' + print(exit_msg) + sys.exit(1) + + self.num_tasks = fs[base_dir][cur_sys].get('num_tasks', 1) + tasks_per_node = fs[base_dir][cur_sys].get('num_tasks_per_node', 1) + self.num_tasks_per_node = tasks_per_node self.ior_block_size = self.fs[base_dir]['ior_block_size'] self.ior_access_type = self.fs[base_dir]['ior_access_type'] @@ -107,20 +100,8 @@ def __init__(self, base_dir): self.executable = os.path.join('src', 'C', 'IOR') self.build_system = 'Make' - try: - prog_env = self.fs[base_dir][cur_sys]['valid_prog_environs'] - self.valid_prog_environs = prog_env - except KeyError: - self.valid_prog_environs = ['PrgEnv-cray'] - - try: - self.build_system.cc = self.fs[base_dir][cur_sys]['build_system_cc'] - except KeyError: - pass - try: - self.build_system.cxx = self.fs[base_dir][cur_sys]['build_system_cxx'] - except KeyError: - pass + penv = fs[base_dir][cur_sys].get('valid_prog_environs', ['PrgEnv-cray']) + self.num_tasks = penv self.build_system.options = ['posix', 'mpiio'] self.build_system.max_concurrency = 1 From 2a1d35b6525392fb83322a529aa998b48b6ad49e Mon Sep 17 00:00:00 2001 From: Giuseppe Lo Re Date: Wed, 26 Jun 2019 20:46:07 +0200 Subject: [PATCH 08/11] Fixed code handling the case where the test is run on a unknown system --- cscs-checks/system/io/ior_check.py | 34 ++++++++++++------------------ 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/cscs-checks/system/io/ior_check.py b/cscs-checks/system/io/ior_check.py index 08a75c13c2..b07656062a 100644 --- a/cscs-checks/system/io/ior_check.py +++ b/cscs-checks/system/io/ior_check.py @@ -23,8 +23,8 @@ def __init__(self, base_dir): 'valid_systems': ['dom:gpu'], 'dom': { 'num_tasks': 2, - # We will be using 1 task per node to avoid cache - # effects on read. The option "-C" could be used + # We will be using 1 task per node to avoid cache + # effects on read. The option "-C" could be used # with many tasks per node. 8 tasks are enough # to get ~peak perf (write 5.4 GB/s, read 4.3 GB/s) } @@ -49,8 +49,6 @@ def __init__(self, base_dir): 'daint': {}, 'dom': {}, 'fulen': { - #'build_system_cc': 'mpicc', - #'build_system_cxx': 'mpic++', 'valid_prog_environs': ['PrgEnv-gnu'] } }, @@ -59,8 +57,6 @@ def __init__(self, base_dir): 'ior_block_size': '48g', 'fulen': { 'num_tasks': 8, - #'build_system_cc': 'mpicc', - #'build_system_cxx': 'mpic++', 'valid_prog_environs': ['PrgEnv-gnu'] } } @@ -70,25 +66,20 @@ def __init__(self, base_dir): for data in self.fs.values(): data.setdefault('ior_block_size', '24g') data.setdefault('ior_access_type', 'MPIIO') - data.setdefault('reference', + data.setdefault('reference', {'read_bw': (1, -0.5, None), 'write_bw': (1, -0.5, None) }) - - self.valid_systems = self.fs[base_dir]['valid_systems'] + data.setdefault('dummy', {}) # entry for unknown systems cur_sys = self.current_system.name + if cur_sys not in self.fs[base_dir]: + cur_sys = 'dummy' - # Check whether cur_sys is present in the fs dict - if cur_sys not in self.fs: - exit_msg = '%s is not present in the self.fs ' % cur_sys - exit_msg += 'confguration dict. Aborting.' - print(exit_msg) - sys.exit(1) - - self.num_tasks = fs[base_dir][cur_sys].get('num_tasks', 1) - tasks_per_node = fs[base_dir][cur_sys].get('num_tasks_per_node', 1) - self.num_tasks_per_node = tasks_per_node + self.valid_systems = self.fs[base_dir]['valid_systems'] + self.num_tasks = self.fs[base_dir][cur_sys].get('num_tasks', 1) + tpn = self.fs[base_dir][cur_sys].get('num_tasks_per_node', 1) + self.num_tasks_per_node = tpn self.ior_block_size = self.fs[base_dir]['ior_block_size'] self.ior_access_type = self.fs[base_dir]['ior_access_type'] @@ -100,8 +91,9 @@ def __init__(self, base_dir): self.executable = os.path.join('src', 'C', 'IOR') self.build_system = 'Make' - penv = fs[base_dir][cur_sys].get('valid_prog_environs', ['PrgEnv-cray']) - self.num_tasks = penv + vpe = 'valid_prog_environs' + penv = self.fs[base_dir][cur_sys].get(vpe, ['PrgEnv-cray']) + self.valid_prog_environs = penv self.build_system.options = ['posix', 'mpiio'] self.build_system.max_concurrency = 1 From 37f11e58b2cfbc1ca22c91e61b6049c9f2f3714c Mon Sep 17 00:00:00 2001 From: GiuseppeLoRe Date: Wed, 26 Jun 2019 14:29:33 -0700 Subject: [PATCH 09/11] Update ior_check.py replaced "list.extend" with "list +=" operator. --- cscs-checks/system/io/ior_check.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cscs-checks/system/io/ior_check.py b/cscs-checks/system/io/ior_check.py index b07656062a..a0ccdff568 100644 --- a/cscs-checks/system/io/ior_check.py +++ b/cscs-checks/system/io/ior_check.py @@ -125,7 +125,7 @@ def __init__(self, base_dir): class IorWriteCheck(IorCheck): def __init__(self, base_dir): super().__init__(base_dir) - self.executable_opts.extend(['-w', '-k']) + self.executable_opts += ['-w', '-k'] self.sanity_patterns = sn.assert_found(r'^Max Write: ', self.stdout) self.perf_patterns = { 'write_bw': sn.extractsingle( From e60791b4544a4a78a5d1ee74e52a4923e8b95fe2 Mon Sep 17 00:00:00 2001 From: Giuseppe Lo Re Date: Tue, 2 Jul 2019 21:58:57 +0200 Subject: [PATCH 10/11] removed unused module, fixed perf reference limits and unit --- cscs-checks/system/io/ior_check.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/cscs-checks/system/io/ior_check.py b/cscs-checks/system/io/ior_check.py index a0ccdff568..92d8bd3677 100644 --- a/cscs-checks/system/io/ior_check.py +++ b/cscs-checks/system/io/ior_check.py @@ -1,5 +1,4 @@ import os -import sys import getpass import reframe as rfm @@ -67,8 +66,8 @@ def __init__(self, base_dir): data.setdefault('ior_block_size', '24g') data.setdefault('ior_access_type', 'MPIIO') data.setdefault('reference', - {'read_bw': (1, -0.5, None), - 'write_bw': (1, -0.5, None) + {'read_bw': (0, None, None, 'Bytes/s'), + 'write_bw': (0, None, None, 'Bytes/s') }) data.setdefault('dummy', {}) # entry for unknown systems @@ -132,6 +131,8 @@ def __init__(self, base_dir): r'^Max Write:\s+(?P\S+) MiB/sec', self.stdout, 'write_bw', float) } + # Convert from MiB/s to bytes/s + self.perf_patterns['write_bw'] *= pow(2, 20) self.tags |= {'write'} @@ -152,4 +153,6 @@ def __init__(self, base_dir): r'^Max Read:\s+(?P\S+) MiB/sec', self.stdout, 'read_bw', float) } + # Convert from MiB/s to bytes/s + self.perf_patterns['read_bw'] *= pow(2, 20) self.tags |= {'read'} From 94e771b3df118e744255bc20c45383e0c17a25e3 Mon Sep 17 00:00:00 2001 From: Vasileios Karakasis Date: Wed, 3 Jul 2019 12:03:09 +0200 Subject: [PATCH 11/11] Reset reported b/w values back to MiB/s Also - Fixed coding style issues --- cscs-checks/system/io/ior_check.py | 38 ++++++++++++++---------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/cscs-checks/system/io/ior_check.py b/cscs-checks/system/io/ior_check.py index 92d8bd3677..4abdda5d9d 100644 --- a/cscs-checks/system/io/ior_check.py +++ b/cscs-checks/system/io/ior_check.py @@ -16,7 +16,6 @@ def __init__(self, base_dir): self.test_dir = os.path.join(self.base_dir, self.username, '.ior') self.pre_run = ['mkdir -p ' + self.test_dir] self.test_file = os.path.join(self.test_dir, 'ior.dat') - self.fs = { '/scratch/snx1600tds': { 'valid_systems': ['dom:gpu'], @@ -26,22 +25,22 @@ def __init__(self, base_dir): # effects on read. The option "-C" could be used # with many tasks per node. 8 tasks are enough # to get ~peak perf (write 5.4 GB/s, read 4.3 GB/s) - } - }, + } + }, '/scratch/snx1600': { 'valid_systems': ['daint:gpu'], 'daint': {} - }, + }, '/scratch/snx3000tds': { 'valid_systems': ['dom:gpu'], 'dom': { 'num_tasks': 4, - } - }, + } + }, '/scratch/snx3000': { 'valid_systems': ['daint:gpu'], 'daint': {} - }, + }, '/users': { 'valid_systems': ['daint:gpu', 'dom:gpu', 'fulen:normal'], 'ior_block_size': '8g', @@ -49,26 +48,29 @@ def __init__(self, base_dir): 'dom': {}, 'fulen': { 'valid_prog_environs': ['PrgEnv-gnu'] - } - }, + } + }, '/scratch/shared/fulen': { 'valid_systems': ['fulen:normal'], 'ior_block_size': '48g', 'fulen': { 'num_tasks': 8, 'valid_prog_environs': ['PrgEnv-gnu'] - } } } + } # Setting some default values for data in self.fs.values(): data.setdefault('ior_block_size', '24g') data.setdefault('ior_access_type', 'MPIIO') - data.setdefault('reference', - {'read_bw': (0, None, None, 'Bytes/s'), - 'write_bw': (0, None, None, 'Bytes/s') - }) + data.setdefault( + 'reference', + { + 'read_bw': (0, None, None, 'MiB/s'), + 'write_bw': (0, None, None, 'MiB/s') + } + ) data.setdefault('dummy', {}) # entry for unknown systems cur_sys = self.current_system.name @@ -119,8 +121,7 @@ def __init__(self, base_dir): ['/scratch/snx3000tds'], ['/scratch/snx3000'], ['/users'], - ['/scratch/shared/fulen'] - ) + ['/scratch/shared/fulen']) class IorWriteCheck(IorCheck): def __init__(self, base_dir): super().__init__(base_dir) @@ -132,7 +133,6 @@ def __init__(self, base_dir): 'write_bw', float) } # Convert from MiB/s to bytes/s - self.perf_patterns['write_bw'] *= pow(2, 20) self.tags |= {'write'} @@ -141,8 +141,7 @@ def __init__(self, base_dir): ['/scratch/snx3000tds'], ['/scratch/snx3000'], ['/users'], - ['/scratch/shared/fulen'] - ) + ['/scratch/shared/fulen']) class IorReadCheck(IorCheck): def __init__(self, base_dir): super().__init__(base_dir) @@ -154,5 +153,4 @@ def __init__(self, base_dir): 'read_bw', float) } # Convert from MiB/s to bytes/s - self.perf_patterns['read_bw'] *= pow(2, 20) self.tags |= {'read'}