09/02/09
Analyse distribuée
Une plongée dans PyROOT et l’accès aux données : CPU et réseau
Plan :
Contexte Comment fonctionne PyROOT
Ouverture et lecture des fichiers Différents environnements de travail
Interactif : lappsl4 Données sur lapp_data Données sur le SE (SAM et DAS)
Sur la grille Jobs sur différents WN Jobs sur même WN
Contexte :3
PyROOT (interface Python)- chainage des fichiers à analyser ( fichiers concaténés lors de leur ouverture )- lecture de l’ensemble des fichiers- merger les fichiers pour n’en avoir que un seul
CPU mesuré = CPU utilisé pour remplir des histogrammes / données
ROOT :
- Comparer CPU / réseau- Pour : - différentes localisations des données - différentes façons de travailler ( série / parallèle ) - jobs sur WN ou UI ?
But :
Setup PyRoot (http://root.cern.ch/root/HowtoPyROOT.html)
Versions de ROOT: /grid_sw/lhcb/lib/lcg/external/root
Versions de python: /grid_sw/lhcb/lib/lcg/external/python
setenv ROOTSYS /grid_sw/lhcb/lib/lcg/external/root/5.18.00d/slc4_ia32_gcc34/root
setenv PYTHONDIR /grid_sw/lhcb/lib/lcg/external/Python/2.5/slc4_ia32_gcc34/
setenv PATH ${ROOTSYS}/bin:${PYTHONDIR}/bin:${PATH}
setenv LD_LIBRARY_PATH ${ROOTSYS}/lib:${PYTHONDIR}/lib:${LD_LIBRARY_PATH}
setenv PYTHONPATH ${ROOTSYS}/lib:${PYTHONPATH}
#librairie castor
ln -s ${LCG_LOCATION}/lib/libdpm.so libshift.so.2.1
setenv LD_LIBRARY_PATH ${PWD}:${LD_LIBRARY_PATH}
Module(s) à importer import ROOT from ROOT import **** (Tfile, TH1F,…)
Ouverture de fichiers Les uns à la suite des autres
input = TFile.Open(“Name.root”) mytree=input.Get('n1') pas plus de 30Mo de fichiers
Chainer les fichiers et les ouvrir tous en même temps chain = TChain('n1') chain.Add(“Name.root”) entries=chain.GetEntries()
PyROOT
=> Mélanger les fichiers ou autre méthode ROOT
5
Création d’un arbre avec une branche contenant des feuilles
fNewFile = TFile("Name","Create,Recreate,…")fNewTree=TTree("Name", "Name")
sBranch_struct="struct cluster_t{\Int_t size;\Float_t eX[SIZE];\
};"
sClusters_struct=sClusters_struct.replace("SIZE",str())gROOT.ProcessLine(sClusters_struct);self.Views.Branch('clusters',cluster_t,'@size/I:clusters.eX['+str(self.nPoints)+']/F') clusters.eX=array('f',range(self.nPoints))
for j in range(0,self.nPoints): clusters.eX[j]=float(self.Variables[0][0][j])
self.Views.Fill()
6
Crée new file and new tree
Crée structure branche avec feuilles
Accrocher structure sur arbre
Rempli variables de la branche
Script utiliséfor File in sFileList: sRootName = '/lapp_data/lhcb/rospabe/Bs_JPsiEta/Prod/'+File chain.Add(sRootName)
#get the entriesentries=chain.GetEntries()
#declaration of the variablesR = array( 'l' , [0] )chain.SetBranchAddress("R",R)BsM = defineArray( 'd' , 20000 )chain.SetBranchAddress("BsM",BsM)nEvt=nEvt+chain.GetEntriesFast()
for jentry in xrange(0,nEvt ): nb=chain.GetEntry(jentry) #loop over reconstructed Bd for j in range(0,R[0]): nBs+=1 mBs.Fill(BsM[j]/1000.)
file.write("Mean Histo = "+str(mBs.GetMean())+"\n")
Liste de fichiers à ouvrir concaténation dans chain
Matcher les entrées
Variables
Remplissage histo
Maximum histo
PyROOT au niveau réseau et CPU
Import ROOT et dépendances (depuis Lappsl) :
Exemple de plots que l’on va voir CPU utilisé Network
Sleeping
t(s)
CPU(kb)
t(s)
Transfert (∆b)
Ouverture et lecture des fichiers (SE)
Ouverture fichiers a la suite : input = TFile.Open(“rfio:…..root”) (0.4’’) mytree=input.Get('n1') (0.1’’) Pas plus de 30Mo de fichiers ⇒ memory leak
t(s)
CPU(kb)
Import ROOT Getting trees
Transfert (∆b)
~13’’ ~13’’
t(s)
Ouverture et lecture des fichiers (lapp_data)
Ouverture fichiers a la suite : input = TFile.Open(/lapp_data/……root”) (0.1’’) mytree=input.Get('n1') (0.1’’) Pas plus de 30Mo de fichiers
CPU(kb)
Getting trees
1.2’’
=> Mélanger les fichiers et autre methode ROOT
Transfert (∆b)
t(s)
t(s)
Getting tree
Chainer les fichiers et les ouvrir en même temps avec
PyROOT
( 200 fichiers : tot = 500Mo)
Fichiers sur Data_Local (gpfs) ou sur le SE (rfio) du Lapp
Accès plus rapide vers Data_Local que SE
CPUmax 380MB
Réseaumax 17MB.s-1
Réseaumax 2MB.s-1
Accès depuis une UI de fichiers sur disque locaI / SE
11
<Débit> 9MB/s
<Débit> 0.9MB/s
WNSE
UI
710’’
60’’
Protocoles ≠
Un seul fichier de 500Mo
(5int, 1 double, 115 float)
Accès plus rapide vers Data_Local que SE (rfio) (5’’ de différence)
CPUmax 530MB
Réseaumax 18MB.s-1
Protocoles ≠ mais effet atténué car 1 seul fichier
12
70’’
<Débit> 13MB/s
WNSE
UI
Accès depuis une UI de fichiers sur disque locaI / SE
Accès depuis un WN de fichiers sur SE
200 fichiers ou un seul fichier de 500Mo (5int, 1 double,
115 float)
Accès plus rapide avec un seul fichier que 200
Temps ~ que depuis une UI Temps < que depuis une UI CPUmax 530MB
Réseaumax 17MB.s-1
Réseaumax 5MB.s-1
13
710’’
50’’
<Débit> 15MB/s
<Débit> 1MB/s
WNSE
UI
Tableau résumé d’accès à distance
CPU Données
Protocole
<NetWork(MB/s)>
Temps (s)
200 fichiers UI SE open rfio 0.9 710
UI Data_Local
open9.1 60
WN SE open rfio 1.0 710
1 fichier mergé
UI SEopen rfio
13.0 70
UI Data_Local
open13.0 65
WN SE open rfio 15.0 50
14
Merger les fichiers diminue temps total car moins d’I/O
Pas d’effet de cache car le taux de renouvellement des fichiers contenus dans le cache est très élevé
Accès depuis une UI de fichiers sur disque local / SE
Trois étapes itératives : copier n fichiers localement (rfcp parallélisés)analyser les n fichiers pendant copie des suivantseffacer fichiers analysés
15
WN SE
UI
Conclusion16
WN SE
UI
Temps rfcp >> rfio lorsque le nombre de fichiers augmente
Réseau utilisé plus optimal avec plusieurs fichiers copiés en même temps
Max du réseau interne Lapp de 1Gb/s
Closer to reality : fichiers de 1G0
Essais avec N fois X fichiers de 1Go X.N=100
tcalcul>ttransfert et tcalcul X =>ttot100’’/1Go si X<40
Limitation vient du calcul
17
...
...
Accès depuis un WN de fichiers sur SE
WN SE
UI
Résumé18
Temps total pour transfert en // et calcul est équivalent qq soit le nombre de fichiers < 40
Limitation vient du calcul
WN SE
UI
Blade de 4 WN sortit spécialement pour ces tests (période calme : Atlas_P)
X jobs mêmes WN (X=1,2,3,4) Travail en rfcp // Réseau même dans 4 cas Les jobs se pénalisent entre
eux : la vitesse lecture/écriture des données sur le disque du blade est bloquante.
Max du réseau cluster WNSE 2*1Gb/s
19
WN SE
UI
Accès depuis un WN de fichiers sur SEJobs sur un même WN ( blade 4 cores)
Conclusions
en “normal” : cpumax 500MB <débit>: 17 et débitmax: 50MB/s
en // : pointmin avec 60fichiers (200MB) UI : débitmax = 70MB/sWN : débitmax = 110MB/s
Fichiers 1Go : même effet (2Go en //) Sur même WN
Transferts fichiers : même débit (100MB/s) CPU partagées => compétition entre jobs Limite d’accès aux données copiées sur disque du bladePas ce genre de problème avec des open rfio
20
Conclusions21
CPUData
Protocole<NetWork>
(MB/s)
UI UI open 13.0Résultat site dépendant ( LAPP : gpfs + réseau )
UI SE rfio:/dpm/…13.0
WN SE rfio:/dpm/… 15.0
Limitation : activité SE et occupation du réseau WN/SE non prévisibles (fonction du type des jobs qui tournent à un moment donné)
UI SE rfcp local UI 70.0
WN SErfcp local WN
110.0Limitation : vitesse
lecture/écriture sur disque WN
1 Fichier de 1G0
100 fichiers de 1G0 en //
Fichiers mergés plutôt que série de petits fichiers “open rfio” plus performant que rfcp mais dépend de
l’activité sur cluster Capacités maximum du réseau Lapp interne et cluster
atteint (1Gb/s)
1/2/3/4 open rfio sur blade
Temps : import root et dépendances : 11.6’’ et 0.4’’ add chain 0’’ getting entries : 180’’ lecture données : 8320/8420/8830/9000’’
CPU(kb)
t(s)
Getting entries
Working
t(s)
Getting entries
Working
Transfert (∆b)
Top Related