1 #@ MODIF test_temps_ops Macro DATE 05/09/2008 AUTEUR COURTOIS M.COURTOIS
2 # -*- coding: iso-8859-1 -*-
3 # CONFIGURATION MANAGEMENT OF EDF VERSION
4 # ======================================================================
5 # COPYRIGHT (C) 1991 - 2008 EDF R&D WWW.CODE-ASTER.ORG
6 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
7 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
8 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
9 # (AT YOUR OPTION) ANY LATER VERSION.
11 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
12 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
13 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
14 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
16 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
17 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
18 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
19 # ======================================================================
20 # RESPONSABLE COURTOIS M.COURTOIS
23 for m in clpaster clp50a8 claut626 clau5aaa aster
25 echo "------ $m : `ssh $m hostid` -------"
26 ssh $m cat /proc/cpuinfo > $m.cpuinfo
27 ssh $m python -c '"import os ; print os.uname()[-1]"'
28 grep 'cpu MHz' $m.cpuinfo | head -1
29 grep -i bogomips $m.cpuinfo | head -1
38 #-------------------------------------------------------------------------------
41 !--------------------------------------------------------------------------------------------------!
42 ! Commande ! Ordre ! Reference ! Mesure ! Difference ! Tolerance ! Diagnostic !
43 !--------------------------------------------------------------------------------------------------!"""
44 tab_line = """ ! %(cmde)-22s ! %(nume)6d ! %(refe)10.2f ! %(vale)10.2f ! %(diff)10.2f ! %(prec)10.2f ! %(diag)4s !"""
45 tab_footer = """ !--------------------------------------------------------------------------------------------------!
48 #-------------------------------------------------------------------------------
50 """Retourne l'identifiant utilisé pour la mesure des performances.
51 Soit on le trouve dans le fichier config.txt de la version utilisée,
52 soit on le détermine à partir de : "kernel name - hardware name"
57 machine = conf['ID_PERF'][0]
58 compiler = os.path.basename(conf['F77'][0].split()[0])
61 machine = '%s-%s-%s' %(os.uname()[0], os.uname()[4], compiler)
64 #-------------------------------------------------------------------------------
66 """Retourne 'value' si c'est une liste, sinon le singleton [value,]."""
67 if type(value) not in (list, tuple):
71 #-------------------------------------------------------------------------------
72 def test_temps_ops(self, RESU, INFO, **args):
74 Macro TEST_TEMPS permettant de vérifier le temps passé dans les commandes.
78 from Utilitai.Utmess import UTMESS, MessageLog
79 from Utilitai.System import ExecCommand
81 # On importe les definitions des commandes a utiliser dans la macro
82 # Le nom de la variable doit etre obligatoirement le nom de la commande
83 DETRUIRE = self.get_cmd('DETRUIRE')
84 CREA_TABLE = self.get_cmd('CREA_TABLE')
85 TEST_TABLE = self.get_cmd('TEST_TABLE')
87 #----------------------------------------------
89 # La macro compte pour 1 dans la numerotation des commandes
92 # ----- récupération du fichier de config
96 # recuperation de la variable ASTER_ROOT
97 aster_root = os.environ.get('ASTER_ROOT')
98 assert aster_root != None, "<TEST_TEMPS> Variable d'environnement ASTER_ROOT non definie."
99 sys.path.append(os.path.join(aster_root, 'ASTK', 'ASTK_SERV', 'lib'))
100 from as_profil import ASTER_PROFIL
101 from as_config import ASTER_CONFIG
103 l_export = glob('*.export')
104 assert len(l_export) > 0, "<TEST_TEMPS> pas de fichier export dans le repertoire de travail."
106 ficconf = 'config.txt'
107 if not os.path.isfile(ficconf): # if as_run.__version__ < 1.6.3
108 prof = ASTER_PROFIL(l_export[0])
109 if prof.Get('D', typ='conf'):
110 print '<TEST_TEMPS> Surcharge du fichier config.txt non supportée.'
111 REPREF = os.path.join(aster_root, prof['version'][0])
112 ficconf = os.path.join(REPREF, 'config.txt')
113 conf = ASTER_CONFIG(ficconf)
114 except Exception, err:
117 machine = get_idperf(conf)
119 # liste des timers par ordre d'apparition : dict_cmde['commande'] = [timer1, timer2, ...]
121 for num, timer in self.jdc.timer.getsortedtimers():
123 dict_cmde[cmde] = dict_cmde.get(cmde, [])
124 dict_cmde[cmde].append(timer)
126 tab = get_cmde_timers(self.jdc)
128 aster.affiche('MESSAGE', repr(tab))
130 #----------------------------------------------
131 # boucle sur les commandes a tester
135 dres = res_i.cree_dict_valeurs(res_i.mc_liste)
137 'cmde' : dres['COMMANDE'],
138 'nume' : dres['NUME_ORDRE'],
146 l_mach = as_list(dres['MACHINE'])
147 l_vale = as_list(dres['VALE'])
148 if len(l_mach) != len(l_vale):
149 UTMESS('E', 'TEST0_10')
152 l_prec = as_list(dres['PRECISION'])
154 l_prec = l_prec * len(l_vale)
155 if len(l_prec) != len(l_vale):
156 UTMESS('E', 'TEST0_8')
159 tres = (tab.COMMANDE == dres['COMMANDE']) & (tab.NUME_ORDRE == dres['NUME_ORDRE'])
161 UTMESS('E', 'TEST0_7', valk=dres['COMMANDE'], vali=dres['NUME_ORDRE'])
165 infos.append(current)
168 # comparaison des valeurs
169 valtest = getattr(tres, dres['TYPE_TEST'])
170 assert len(valtest) == 1, 'TYPE_TEST invalide'
173 current['vale'] = valtest
175 # reference, precision
177 for mach, vale, precision in zip(l_mach, l_vale, l_prec):
178 if dres['CRITERE'] == 'RELATIF':
179 precision = precision * vale
180 dref[mach.upper()] = {
183 'valmin' : vale - precision,
184 'valmax' : vale + precision
186 dmach = dref.get(machine.upper())
187 # si on n'a pas de référence pour cette machine, on prend la première
189 dmach = dref[l_mach[0].upper()]
192 UTMESS('A', 'TEST0_9', valk=(machine, l_mach[0]))
193 current['refe'] = dmach['vale']
194 current['prec'] = dmach['prec']
195 current['diff'] = valtest - dmach['vale']
196 if dmach['valmin'] < valtest < dmach['valmax']:
197 current['diag'] = 'OK'
198 infos.append(current)
200 # tableau de resultats
201 text_id = MessageLog.GetText('I', 'TEST0_5', valk=(ficconf, machine))
203 txt = [text_id, tab_header,]
205 txt.append(tab_line % line)
206 if line['diag'] != 'OK':
208 txt.append(tab_footer)
209 for unit in ('MESSAGE', 'RESULTAT'):
210 aster.affiche(unit, os.linesep.join(txt))
213 tab1__ = CREA_TABLE(LISTE=(_F(PARA='DIAGNOSTIC', LISTE_I=is_ok),),)
215 TEST_TABLE(TABLE=tab1__,
216 NOM_PARA='DIAGNOSTIC',
224 #-------------------------------------------------------------------------------
225 def get_cmde_timers(jdc):
226 """Retourne un objet Table contenant les mesures de temps pour
227 les commandes terminées.
229 from Utilitai.Table import Table
232 # liste des timers par ordre d'apparition
234 for num, timer in jdc.timer.getsortedtimers():
235 if timer['state'] != 'stop' \
236 or re.sub('[A-Z_]', '', timer['name']).strip() != '': # timers superviseur
239 for k in ('name', 'cpu_dt', 'sys_dt', 'tot_dt'):
241 line['USER+SYS'] = timer['cpu_dt'] + timer['sys_dt']
242 dnum[line['name']] = dnum.get(line['name'], 0) + 1
243 line['NUME_ORDRE'] = dnum[line['name']]
245 tab.Renomme('name', 'COMMANDE')
246 tab.Renomme('cpu_dt', 'USER')
247 tab.Renomme('sys_dt', 'SYSTEM')
248 tab.Renomme('tot_dt', 'ELAPSED')
249 tab = tab['NUME_ORDRE', 'COMMANDE', 'USER', 'SYSTEM', 'USER+SYS', 'ELAPSED']