Vyroba hlavniho makra
    Pro uspesne spusteni simulaci je nutne nejdrive ziskat informace
o danem requestu, ktere jednotlive simulacni faze ke svemu behu potrebuji.
Jelikoz se informace o requestu stahuji ze SAMu ve FNAL, je treba nasledujici
akce provadet na lokalnim stroji, kde je instalovan SAM, tj. na
sam.farm.particle.cz. Navic se zminene akce musi provadet pod uctem, ktery
je zaregistrovan ve Fermilab, tedy nutno uzit nejaky osobni ucet, nikoli
d0mc.
    Tyto informace a nastaveni ruznych promennych musi byt
shrnuty v samostatnem souboru, hlavnim ridicim makru, ktere se ziska provedenim
nasledujicich kroku :
- Zjistit, ktery request je na rade ke zpracovani
- Na d0minu provest :
- setup sam_common v5_1_0_3
- setup sam_user_api v5_1_0_0
- python /home/bertram/Queue.py
- Pokud nefunguje postup uvedeny v predchozim bodu, lze cislo
requestu, ktery je na rade, zjistit na WWW strance :
- Zjistit, zda jsou nainstalovane cardfily pozadovane verze
    Verze cardfilu pro generator eventu je uvedena v seznamu parametru daneho requestu, viz WWW stranka
s vypisem vsech MC requestu. Seznam verzi cardfilu nainstalovanych na goliasi lze zjistit prohlednutim
adresare /home/d0mc/mcc-dist/packages/cardfiles, nebo pomoci shell skriptu showsoft.
Pokud pozadovana verze cardfilu neni na goliasi nainstalovana, je treba ji pred spustenim simulaci nainstalovat.
Primarni zdroj cardfiles je D0CVS server pristupny z d0mina ,
tez je mozne nejake objevit v SAMU.
Pri instalaci postupujte nasledujicim zpusobem :
- Ke stazeni cardfilu je treba mit na d0minu "forwardable" ticket, tj. pokud se logujete na d0mino z clued0
klustru, pred nalogovanim na d0mino udelat "kinit -f" a uvest kerberosovske heslo.
- Nejdrive se stahnou cardfily dane verze z d0cvs na d0mino (na samu se mi to nepovedlo), tj.
na d0minu se provede :
- setup d0cvs
- cvs checkout -r vxx-xx-xx cardfiles     kde vxx-xx-xx je cislo pozadovane verze
Timto se do adresare cardfiles stahnou vsechny cardfily zadane verze.
- Vsechny cardfily, ktere se stahly do cardfiles je pak treba pretahnout na goliase do adresare
/home/d0mc/mcc-dist/packages/cardfiles/vxx-xx-xx (adresar vxx-xx-xx se musi vytvorit).
- Vyrobit hlavni ridici makro
    |
getrequest -
bash skript na samu v adresari /home/soustruz/mc_macros
|
  |
- stahne informace o requestu a vytvori hlavni macro
- syntaxe : getrequest cislo_requestu [cislo_requestu]
      napr. ./getrequest 5257
2. parameter neni nutne uvadet, ale pokud uveden a je shodny
s 1. parametrem, status stahovaneho requestu ve FNAL databazi zmenen
na "running"
- vystup : hlavni makro Request_cislorequestu.macro
      napr. Request_5257.macro
- skript potrebuje ke sve cinnosti soubory translate.py
, macro.default a
Defaults.py.
|
    |
!!! POZOR !!!    Hlavni makro
je nutne jeste zkontrolovat a pripadne upravit a to v polozkach:
- samglobal : uvest spravne Request ID !!!, FacilityName nastavit na
FZU
- pythia : nastavit pocet eventu/job
- merger : MergeLocation musi byt pro kazdy request jine !!!
navic musi byt jine i pro kazdou skupinu jobu stejneho requestu,
jejichz thumbnaily se budou spojovat !!!
- dale je vhodne vsude zkontrolovat verzi releasu !!!
|
    Priklad takoveho ridiciho makra je zde.
|
    Pokud jiz mame hlavni ridici makro pro zadany request, je
treba ho ze samu prenest na goliase, do direktorie
/home/d0mc/mc_macros. Potom jiz muzeme zacit s vlastnimi simulacemi,
tok dat v simulacich je znazornen na tomto
schematu.
|
    |
Pozor !!!   Pred spustenim jobu
je treba :
- rozmyslet si, kolik jobu spustit a v kolika sadach,
toto je treba
skloubit s poctem jobu, jejichz vystup se bude spojovat dohromady.
- Iain Bertram doporucil spojovat zhruba 10 souboru a
nespojovat vice nez 20-30 souboru kvuli naslednym
potizim s metadaty.
zkontrolovat, zda promenne indir a
outdir jsou ve skriptu jobstatus nastaveny
stejne jako v hlavnim makru (kontrolovano ve skriptu
mc_submitmain).
|
|
|
    Samotne spusteni a beh simulaci ridi sada shell skriptu, jejichz
prehled s naznacenim vzajemne komunikace je zobrazen na nasledujicim obrazku.
|
|
    Simulacni retezec se spousti ve 2 krocich :
- Vytvoreni kopii hlavniho makra pro kazdou sadu jobu
   
|
preparerequest - bash skript na
goliasi v adresari /home/d0mc/mc_macros
- zkontroluje a pripadne opravi nektere polozky v hlavnim makru jako
Request ID,
FacilityName, CurrentDir, DestinationDir, nebo
MergeLocation, pak vyrobi potrebny pocet kopii makra a vytvori
mergelocation direktorie pro kazdou sadu jobu
- syntaxe : preparerequest    cislo_requestu    pocet_sad_jobu
  [test]
- napr. preparerequest 8809 10, nebo   preparerequest 8950 10 test
- pokud byl zadan 3. parameter a jeho hodnota je "test", CurrentDir,
DestinationDir a
MergeLocation se nastavi na testovaci adresare
|
- Vlasni spusteni simulaci
   
|
mc_submitmain - bash skript na
goliasi v adresari /home/d0mc/mc_macros
- spusti vsechny sady jobu a kontroluje jejich beh
- syntaxe : mc_submitmain    cislo_requestu    pocet_sad_jobu
   pocet_jobu_na_sadu > outputfile.out 2>&1 &
- napr. ./mc_submitmain 8809 20 10 > request8809.out 2>&1 &
|
|
|
mc_submitmain - hlavni skript ridici
beh simulaci
Vstupni parametery
- cislo requestu
- pocet sad jobu
- pocet jobu na sadu
- [resubmit] - nepovinny parametr, viz popis
Popis
- Ulozi RequestID do "current.request", pocet sad jobu do "njobsets*.dat" a
pocet jobu na sadu do "njobsperset*.dat", kde "*" znaci cislo requestu, tyto
udaje pak pouzivaji ostatni skripty.
- Pro kazdou sadu jobu spusti skript mc_submitseq, ktery danou sadu jobu spusti.
- Pravidelne kontroluje beh sad jobu dokud pocet uspesne dokoncenych jobu neni roven pozadovane hodnote, tj.
pocet sad jobu * pocet jobu na sadu. Pri kontrole se provadi :
- test, zda neexistuji joby se stejnym timestamp (identifikacni cislo jobu), pokud ano, tak
zastavi (kill -9) beh skriptu mc_submitseq pro danou sadu, a odstrani
joby se stejnym timestamp z PBS (qdel).
- kontrola, zda bezi skript mc_submitseq pro kazdou sadu, pokud ne, tak
se spocte, pomoci skriptu jobstatus, pocet uspesne dokoncenych jobu v dane
sade. Pokud je toto cislo mensi nez pozadovany pocet jobu na sadu, zjisti stav posledniho jobu
(skript jobstatus) a pokud job skoncil chybou, pokusi se ho opravit
spustenim skriptu repairjob. Po dobehnuti skriptu repairjob
znovu otestuje stav opravovaneho jobu (skript jobstatus) a pokud
se oprava nezdarila, dany job smaze pomoci skriptu deletejob. Znovu spocte
pocet uspesne dokoncenych jobu v dane sade (skript jobstatus) a pokud je mensi
nez pozadovany pocet a dana sadu opravdu nebezi, znovu spusti skript mc_submitseq
pro danou sadu.
- likviduje procesy (d0gstar) neviditelne v qstat (killdog)
- Ulozi informace o vsech uspesne dokoncenych jobech, s uzitim skriptu jobstatus,
do souboru pro snadny prenos dat ze samu do FNAL.
- Spusti skript jobs2mysql, ktery z udaju o jednotlivych jobech vytvori soubor
snadno pouzitelny v MySQL.
- Pokud zadano "resubmit" jako 4. parametr, nezapisuje se pocet zadanych sad a jobu na sadu, ale zkontroluje se,
za zadane hodnoty souhlasi s temi, ktere jsou v souborech njobsets*.dat a njopsperset*.dat, kde "*" je
cislo requestu. Pokud ne, skript skonci. Rovnez se pak nespousti sady jobu, tj. nespousti se skript
mc_submitseq. Zacnou se provadet az kontroly, zda bezi sady jobu. Lze vyhodne
pouzit na znovuspusteni simulaci po padu, nebo nucenem zastaveni tohoto skriptu.
|
|
mc_submitseq - skript ridici beh 1 sady
jobu
Vstupni parametry
- jmeno hlavniho makra pro danou sadu
- pocet jobu v sade
- cislo sady
- nepovinny parametr : pokud uveden, beh skriptu se v pripade, ze mergelocation pro danou sadu NENI prazdna,
NEukonci; pouziva se pri znovuspusteni skriptu v ramci skriptu
mc_submitmain
Popis
- Provede setup releasu a dalsich potrebnych veci (python ...).
- Spusti mc_runjob, cimz vytvori 1 job, vcetne jeho direktorie a timestamp.
- Otestuje, zda nove vytvorene timestamp jiz neexistuje, pokud ano, vymaze ho ze souboru gen-merge.registry
v mergelocation dane sady a znovu spusti mc_runjob.
- Zapise timestamp jobu do lots (list of timestamps) souboru dane sady
a requestu.
- Spusti 1 vytvoreny job do PBS.
- Zapise udaje o jobu (cislo requestu, timestamp jobu, PBS ID jobu a pocet generovanych eventu) do souboru
jobparams.dat.
- Kontroluje, zda v PBS bezi job dane sady. Pokud ano, zkontroluje, zda ve fazi d0gstar nedoslo k zacykleni kvuli
chybe v trasovani castice a v tom pripade job v PBS zrusi (qdel). Pokud jiz zadny job dane sady v PBS neni,
zjisti stav posledniho spusteneho jobu pomoci skriptu jobstatus. Jestlize job
dobehl v poradku, vytvori job dalsi (spustenim mc_runjob) a posle ho do PBS. Pokud
job skoncil s chybou, ukonci svuj beh.
|
|
jobstatus - skript, ktery zjistuje stav
jobu
Vstupni parametry
- timestamp jobu
- nepovinny parametr, pokud uveden, jobstatus vypise detailni popis stavu jobu
Popis
- Podiva se, zda job nebezi jako PBS job. Pokud ano, zjisti, zda ceka ve fronte, nebo jiz bezi, pripadne zda nejde
o opravny job.
- Kdyz job neni na vypisu PBS procesu, podiva se, zda job vytvoril ve vystupni direktorii, v podadresari copyd0om,
metadata soubor import*.py s timestamp jobu. Pokud import*.py metadata soubor existuje, otestuje, zda je
spravne vyplnen (dokoncen), tj. zda jsou vyplneny udaje o poctu eventu, cas spusteni a dokonceni jobu a velikost
souboru. Jestlize je import*.py metadata soubor spravne vyplnen, podiva se, zda existuji import*.py metadata
soubory (1 pro d0reco raw data a 1 pro tmb) i ve vystupni direktorii pro d0reco fazi. Pokud ano, job je oznacen
jako dokonceny a v poradku. Jestlize ale import*.py metadata soubor(y) pro d0reco fazi chybi, ale existuje
import*.py metadata soubor pro copyd0om, je job oznacen jako chybny (ERROR). Pokud vsak neexistuje
import*.py metadata soubor pro copyd0om, nebo neni dokonceno jeho vyplneni, je stav jobu nastaven na FATAL
ERROR. Stav jobu je oznacen jako FATAL ERROR i v pripade, ze ve fazi copyd0om nebyl vytvoren logfile,
nebo v logfilu (v direktorii jobu) neni zminka o otevreni vystupniho souboru copyd0om faze pro zapis.
- Pokud byl zadan i druhy parametr, vypise detailni informace o stavu jobu, vcetne timestamp, PBS ID jobu
a pripadne i simulacni faze, kde nastala chyba. Vypise pripadne vicekrat pouzite timestamp a informace
o existenci vystupnich data a metadata souboru kazde faze.
Mozne stavy jobu jsou :
- 1 : QUEUED
- 2 : RUNNING
- 3 : DONE OK
- 4 : ERROR
- 5, 6 : FATAL ERROR
- 7 : IN REPAIR
|
|
repairjob - skript zajistujici opravu
jobu
Vstupni parametry
- timestamp jobu
- stav jobu
- cislo sady jobu
Popis
- Zjisti, zda se zadane timestamp nevyskytuje v souboru jobparams.dat
vice nez 1x (multiple timestamp). Pokud ano, tak zavola skript deletejob
a job smaze.
- Prohledne vystupni direktorie vsech simulacnich fazi (generator, d0gstar, d0sim, d0reco, copyd0om), zda
v nich existuje logfile. Pokud logfile neexistuje, nebo v nem neni zminka o ulozeni eventu do vystupniho
souboru, pak prvni faze, ktera splnuje nekterou z uvedenych podminek je oznacena jako faze, ve ktere doslo
k chybe.
- Pokud chyba nastala ve fazi d0sim, d0reco, nebo copyd0om, pokusi se job opravit. Nejdrive smaze vystupni
datove soubory v chybove fazi, jestlize stav jobu je 4 (ERROR), smaze i vystupni soubory jobu z faze
copyd0om. Pote vymaze zminky o jobu ze souboru gen-merge.registry a gen-merge.finished (v mergelocation
direktorii). Vytvori shell skript obsahujici prikazy ke spusteni vsech potrebnych simulacnich fazi a
spusti ho do PBS.
|
|
deletejob - skript na mazani
jobu
Vstupni parametry
- timestamp jobu
Popis
- Smaze vystupni soubory jobu z PBS.
- Vymaze zminku o jobu ze souboru lots (list of timestamps) a
jobparams.dat.
- Smaze direktorii jobu.
- Smaze vystup z jobu (vystupni direktorie).
- Smaze soubory vytvorene jobem v merge location adresari a vymaze zminky o jobu ze souboru gen-merge.registry
a gen-merge.finished.
|
|
jobs2mysql - skript vytvarejici info soubor
o jobech pro MySQL
Vstupni parametry
- cislo requestu
Popis
- Nacte informace o jobu ze souboru jobparams.dat a prida k nim stav jobu, po zavolani
skriptu jobstatus a informace o stavu prenosu na SAM (vzdy jen "NONE").
- Veskere informace pak ulozi do souboru jobs2mysql*.dat, kde "*" oznacuje cislo requestu.
|
|
preparerequest - skript na pripravu spusteni
simulaci
Vstupni parametry
- cislo requestu
- pocet sad jobu
- nepovinny parametr :     pokud uveden a roven "test", direktorie pro vstup a vystup jobu nastaveny
na testovaci adresar
Popis
- Zkontroluje spravne vyplneni nekterych polozek v hlavnim makru, jako :
- FacilityName - neco jako nazev farmy, melo by byt fzu
- RequestID - cislo requestu
- JobName - jmeno jobu, soucast nazvu direktorie jobu !!!
- MergeLocation - jmeno adresare pro "merge location", direktorie, kde jsou soubory potrebne pro rozhodovani
o spojovani vystupu jobu
- CurrentDir - jmeno direktorie, kde se vytvareji adresare jednotlivych jobu
- DestinationDir - jmeno direktorie, kam se uklada vystup z jobu
a pokud jsou tyto polozky spatne vyplneny, opravi je.
- Vytvori kopii hlavniho makra pro kazdou sadu jobu s unikatnim "JobName" a "MergeLocation".
- Vytvori potrebnou adresarovou strukturu v MergeLocation.
|
Stav jobu a kvalitu jejich vystupu lze kontrolovat nekolika zpusoby, jez se lisi mnozstvim poskytovanych informaci :
   Vystup z bezchybne probehlych jobu je treba bud deklarovat, nebo
primo ulozit na SAM. Pri deklaraci vystupu se manipuluje pouze s metadata
souborem (python skript), ktery se zaregistruje (nebo i ulozi ?) v SAM databazi,
zatimco pri ukladani se na SAM presune vlastni datovy soubor.
   Jak deklaraci tak samotne ukladani vystupu na SAM nutno
provadet ze stroje, kde je nainstalovan SAM, tj. ze stroje
sam.farm.particle.cz a to pod Fermilabu znamym uctem (osobni ucet),
ucet d0mc uzit nelze.
   Prenos nasimulovanych dat na SAM ve FNAL lze v zasade provest 2 zpusoby :
|
moverequest2sam - skript na prenos dat na SAM
Vstupni parametry
- cislo requestu
- pocet sad jobu, ktere se maji prenest na SAM
Popis
- Nejdrive je treba, pro kazdou sadu jobu, jejiz vystup se ma prenest na SAM, prenest z goliase
na sam soubor lots"RequestID"-"cislo_sady"-doneok.dat.
Tento soubor obsahuje seznam timestampu vsech uspesne dokoncenych jobu, jejichz vystup se ma prenest
na SAM ve FNAL.
- Pro kazdou sadu jobu (sady c.1 - hodnota 2. parametru) se spusti skript movejobset2sam,
ktery prenese vystup jobu dane sady na SAM.
- Pokud presun vsech sad jobu probehl uspesne, nastavi status requestu ve FNAL SAM databazi na "finished".
|
|
movejobset2sam - skript na prenos dat z 1 sady jobu na SAM
Vstupni parametry
- cislo requestu
- cislo sady jobu
Popis
- Na zacatku skript zkontroluje, zda v pracovnim adresari existuje soubor se seznamem timestampu vsech
uspesne dokoncenych jobu lots"RequestID"-"cislo_sady"-doneok.dat. Pokud ne, ukonci se.
- Pokud dana sada jeste nebyla presunuta na SAM (podiva se do souboru movedjobsets"RequestID".dat), pak pro
kazde timestamp v souboru lots"RequestID"-"cislo_sady"-doneok.dat, spusti
skript move2sam-v1, ktery prenese vystup z 1 jobu na SAM.
- V pripade uspechu zapise cislo prenesene sady do souboru movedjobsets"RequestID".dat.
|
|
move2sam-v1 - skript na prenos dat z 1 jobu na SAM
Vstupni parametry
- timestamp jobu
- copyd0om prepinac (=1 copyd0om se ulozi na SAM, <>1 - copyd0om se nepresune)
Popis
- Zkontroluje zda existuji vsechny soubory, jez se budou deklarovat/ukladat na SAM. Pokud nejaky chybi, skript
se ukonci.
- Skript pote deklaruje, nebo ulozi vsechny soubory, 1 jobu se zadanym timestamp, k tomu urcene na SAM ve
FNAL.
|
    Zde jsou uvedeny ruzne problemy, s kterymi se lze setkat pri behu D0 MC simulaci s navody, jak
tyto situace resit.
| Bezi vice jobu jedne sady najednou |
| |
Vzdy smi bezet pouze 1 job v kazde sade, proto pokud jich soucasne bezi vice, je treba vsechny pozdeji
spustene joby zrusit a veskere zaznamy o nich smazat.
|
|
| Neni treba zastavovat beh sady jobu (script mc_submitseq), postaci zrusit nechtene joby
v PBS (qdel PBSID_jobu) a smazat o nem veskere zaznamy. Uklidovou praci za nas provede skript
deletejob, jeho popis a syntaxi naleznete
zde. |
| Vsechny joby padaji a maji status
"FATAL ERROR" |
| |
Obecne nelze rici, co je pricinou potizi. |
|
| Ale v takovemto pripade lze postupovat nasledovne :
- prohlednout vystupni soubor ze skriptu mc_submitmain, zda neobsahuje nejake chybove
hlasky
- zkontrolovat vystupni soubory ze skriptu mc_submitseq (vystup pro danou sadu jobu v
souborech nohup"RequestID"-"cislo-sady"*.out), zda neobsahuje chybove hlasky
- zkontrolovat funkcnost skriptu jobstatus
|
| Spadl skript
mc_submitmain a tim se cele simulace postupne zastavuji |
|
| Pokud spadl hlavni skript mc_submitmain pak lze bud pockat az vsechny dosud bezici joby
dobehnou, nebo bezici joby stopnout a znovu spustit skript mc_submitmain s
resubmit jako 4. parametrem, vize syntaxe
zde.
|
| Nektere sady se "zasekly" a vyrazne
zaostavaji v poctu hotovych jobu za ostatnimi |
| |
Pokud si nejste jisty, ze se skutecne jedna o patologicky stav, lze zkontrolovat, kolikrat se
dana sada znovu spoustela, tj. kolik existuje vystupnich souboru skriptu mc_submitseq
pro danou sadu (nohup"RequestID"-"cislo sady"*.dat). Nadmerne vysoky pocet techto souboru a hlavne vyssi stari
souboru se zaznamem o poslednim uspesne dokoncenem jobu ukazuje na abnormalni stav sady, ktery vyzaduje zasah.
|
|
| Nejdrive samozrejme prohledneme prislusne vystupni soubory ze skriptu mc_submitseq
pro danou sadu (nohup"RequestID"-"cislo sady"*.dat), jestli se tam nevyskytuji nejake chybove hlasky.
Dale zjistime, kde k potizim dochazi, tj. v jake fazi simulacniho retezce. Prohledneme tedy vystupy z jednotlivych
simulacnich fazi jobu, tj. soubor "direktorie_jobu/faze/*/task-stdout-stderr.log" (predtim nutno direktorii spadleho
jobu prejmenovat, aby se nesmazala). Velmi pravdepodobne jde o chybu pri pripojovani vystupu z daneho jobu k vystupu
z predchozich jobu, coz by se melo projevit hlaskou "CheckMerge : Job not finished", ci necim podobnym ve fazi
merger. V takovem pripade se podivame do merge location dane sady a zkontrolujeme, zda se lisi
soubory gen-merge.registry a gen-merge.finished. Pokud ano (a posledni job dane sady hlasi stav
"FATAL ERROR"), pak onu radku, ktera v souboru gen-merge.registry prebyva, smazeme. To by melo potize s touto
sadou odstranit.
|