Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
grid [2007/09/12 21:18] zeman Hlava clusteru. |
grid [2015/02/13 19:53] ufal +more lucifers |
||
---|---|---|---|
Line 3: | Line 3: | ||
Cluster (shluk) neboli grid (mříž, síť) je skupina počítačů, | Cluster (shluk) neboli grid (mříž, síť) je skupina počítačů, | ||
- | * lrc.ufal.hide.ms.mff.cuni.cz: | + | * lrc.ufal.hide.ms.mff.cuni.cz: |
- | * fireball1 až 10 (na každém | + | * V následující tabulce je uveden seznam výpočetních uzlů clusteru |
- | * tauri1 až 10 (na každém 4 procesory | + | |
- | * orion1 až 10 (na každém 4 procesory | + | ^ Jméno |
- | | + | | andromeda[1-13] |
+ | | fireball[1-10] | ||
+ | | hyperion[1-10] | 2xCore2 | ||
+ | | lucifer[1-10] | 2xCore4 | ||
+ | | orion[1-10] | ||
+ | | pandora[1-10] | ||
+ | | sol[1-8, | ||
+ | | tauri[1-10] | ||
+ | | cosmos | ||
+ | | belzebub | ||
+ | | iridium | ||
+ | | twister[1,2] | 2xCore4 Intel Xeon 2.4 Ghz | 48 | Ubuntu 10.04 | | ||
+ | | ||
Frontovací systém umožňuje: | Frontovací systém umožňuje: | ||
Line 14: | Line 26: | ||
* poslat mnoho úloh k řešení najednou, úlohy budou ale spuštěny teprve, když na to bude čas | * poslat mnoho úloh k řešení najednou, úlohy budou ale spuštěny teprve, když na to bude čas | ||
* " | * " | ||
+ | |||
+ | ===== Jak začít ===== | ||
Jednou za život musíte provést [[Základní nastavení SGE]], abyste SGE mohli používat. | Jednou za život musíte provést [[Základní nastavení SGE]], abyste SGE mohli používat. | ||
- | |||
- | |||
- | ===== Pravidla pro správné používání clusteru ===== | ||
- | |||
- | Základní pravidlo, které musíme všichni ctít, aby SGE plnilo svou úlohu dobře: | ||
- | |||
- | * Nespouštět úlohy ručně. (O ručně spuštěných úlohách SGE nemá informaci, klidně na daný uzel pošle ještě další úlohy z fronty.) | ||
- | * Pokud možno používat '' | ||
- | * Uklízet po sobě lokální data, protože jinak si tam už nikdo nic užitečného nepustí. | ||
- | |||
- | Víc pravidel není. | ||
===== Ukázka užití SGE ===== | ===== Ukázka užití SGE ===== | ||
Line 33: | Line 36: | ||
< | < | ||
- | ssh lrc | + | ssh lrc2 |
# přihlašte se na hlavu clusteru | # přihlašte se na hlavu clusteru | ||
echo " | echo " | ||
Line 42: | Line 45: | ||
# Ale dodatečné parametry zařídily: | # Ale dodatečné parametry zařídily: | ||
# -cwd ... skript bude spuštěn v aktuálním adresáři (a nikoli homu) | # -cwd ... skript bude spuštěn v aktuálním adresáři (a nikoli homu) | ||
+ | # -V ... proměnné z vašeho prostředí budou zkopírovány do prostředí skriptu | ||
# -j y ... standardní a chybový výstup bude spojen (jako to dělá nohup) | # -j y ... standardní a chybový výstup bude spojen (jako to dělá nohup) | ||
# Pořadí parametrů **je** důležité, | # Pořadí parametrů **je** důležité, | ||
qstat | qstat | ||
- | | + | qstat -u ' |
+ | | ||
# SGE chvíli čeká, než skript opravdu spustí. Pro malinké úlohy tedy SGE může představovat | # SGE chvíli čeká, než skript opravdu spustí. Pro malinké úlohy tedy SGE může představovat | ||
# zbytečné zpoždění. | # zbytečné zpoždění. | ||
+ | # -u ' | ||
cat skript.sh.oXXXXX | cat skript.sh.oXXXXX | ||
# vypište si výstup skriptu. XXXXX je ID jobu, které bylo přiděleno | # vypište si výstup skriptu. XXXXX je ID jobu, které bylo přiděleno | ||
Line 69: | Line 75: | ||
qsub -S /bin/bash | qsub -S /bin/bash | ||
# když chcete, aby skript běžel v bashi | # když chcete, aby skript běžel v bashi | ||
- | qdel all | + | qsub -V |
+ | # když chcete předat proměnné prostředí | ||
+ | qdel \* | ||
# když chcete zrušit všechny své joby (rušit cizí nesmíte) | # když chcete zrušit všechny své joby (rušit cizí nesmíte) | ||
</ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Pravidla pro správné používání clusteru ===== | ||
+ | |||
+ | Základní pravidlo, které musíme všichni ctít, aby SGE plnilo svou úlohu dobře: | ||
+ | |||
+ | * Nespouštět úlohy ručně. (O ručně spuštěných úlohách SGE nemá informaci, klidně na daný uzel pošle ještě další úlohy z fronty.) | ||
+ | * Interaktivní shell se dá získat příkazem '' | ||
+ | |||
+ | Další doporučení: | ||
+ | * Pokud možno používat '' | ||
+ | * Dotaz: jak se kombinuje '' | ||
+ | * Uklízet po sobě lokální data, protože jinak si tam už nikdo nic užitečného nepustí. | ||
+ | * Vyhnout se hodně divokému paralelnímu přístupu ke sdíleným diskům. NFS server to pak nepěkně zpomalí pro všechny. Distribuujte tedy i data. | ||
+ | * Informovat SGE, kolik paměti úloha žere, aby na strojích nedošla paměť (a používat " | ||
+ | |||
+ | |||
+ | Víc pravidel není. | ||
+ | |||
+ | ===== Slušné chování ===== | ||
+ | |||
+ | Pokud chci spouštět úlohy, které poběží dlouhou dobu (hodiny, dny), nepustím je všechny najednou, aby cluster mohli využívat i ostatní. | ||
===== Triky a opentlení ===== | ===== Triky a opentlení ===== | ||
- | ==== ~bojar/ | + | |
+ | ==== ~bojar/ | ||
qsubmit je jako qsub, ale příjemnější: | qsubmit je jako qsub, ale příjemnější: | ||
- | * nemusíte vyrábět skript, vyrobí ho sám | + | * nemusíte vyrábět skript, vyrobí ho sám (pozn.: nemusíte vyrábět skript, když použijete přepínač '' |
* nemusíte připisovat '' | * nemusíte připisovat '' | ||
- | |||
< | < | ||
- | ~bojar/ | + | ~bojar/ |
</ | </ | ||
+ | lépe funguje '' | ||
+ | |||
+ | ==== ~zeman/ | ||
+ | |||
+ | Podobná věc pro '' | ||
+ | |||
+ | <code tcsh> | ||
+ | echo $* > $SCRIPTFILE | ||
+ | echo $* | ||
+ | echo qsub -cwd -V -S /bin/tcsh -m e $SCRIPTFILE | ||
+ | qsub -cwd -V -S /bin/tcsh -m e $SCRIPTFILE | ||
+ | qstat -u ' | ||
+ | rm $SCRIPTFILE</ | ||
+ | |||
+ | Příklad spuštění: | ||
+ | |||
+ | < | ||
+ | |||
+ | (Kdybych místo uvozovek použil apostrofy, nerozbalily by se mi proměnné. První argument (název skriptu) klidně mohl být v uvozovkách spolu s přesměrováním. Dal jsem ho ven jen proto, že potom '' | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== TectoMT: devel/ | ||
+ | |||
+ | Jako '' | ||
+ | |||
+ | | ||
+ | |||
+ | Skript zadanou hromádku souboru rozdělí do '' | ||
+ | |||
+ | Soubory možno zadat filelistem, nebo pomocí '' | ||
+ | |||
+ | Je nutné buď zadat '' | ||
+ | |||
+ | Parametr '' | ||
+ | |||
+ | Parametr '' | ||
+ | |||
+ | Výstup každého jobu jde do vlastního logu, '' | ||
+ | |||
+ | Parametr '' | ||
+ | |||
+ | Bez '' | ||
+ | |||
+ | ===== Monitorování úloh ===== | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * ''/ | ||
+ | * ''/ | ||
+ | * ''/ | ||
+ | * mem_total: celkova pamet uzlu | ||
+ | * mem_free: tedy kolik je jeste volne pameti z pametove quoty uzlu | ||
+ | * act_mem_free: | ||
+ | * mem_used: kolik je pameti skutecne pouzito | ||
+ | * ''/ | ||
+ | * celkovy pocet jader, pocet vyuzitych jader | ||
+ | * celkova velikost RAM, kolik je ji fyzicky nepouzite, kolik je ji jeste nerezervovane | ||
+ | * po jednotlivych uzivatelich (zrovna pocitajicich) -- kolik jim bezi uloh, kolik jich maji ve fronte a kolik z nich je ve stavu hold | ||
+ | * '' | ||
+ | * [[https:// | ||
===== Časté a záludné problémy ===== | ===== Časté a záludné problémy ===== | ||
- | ==== Submitnutý job nesmí znovu submitovat ==== | ||
- | Pokud se nemýlím, není dovoleno použít '' | + | ==== Submitnutý job může znovu submitovat ==== |
+ | |||
+ | Danovy starší zkušenosti s clusterem PBS (nikoli SGE) říkaly, že tohle nejde. Ale jde to, aspoň u nás. Příkazy | ||
+ | |||
==== Proměnné prostředí, | ==== Proměnné prostředí, | ||
Line 99: | Line 198: | ||
Zatím nevím přesně, které ze souborů '' | Zatím nevím přesně, které ze souborů '' | ||
+ | |||
+ | Z toho například také vyplývá, že bez ošetření se jako **Java** používá | ||
+ | |||
+ | java version " | ||
+ | gij (GNU libgcj) version 4.1.2 20070502 (Red Hat 4.1.2-12) | ||
+ | |||
+ | Pokud chcete submittovaný program pouštět ve svém oblíbeném prostředí (např. nastavení '' | ||
==== Jiný shell ==== | ==== Jiný shell ==== | ||
Line 143: | Line 249: | ||
fi | fi | ||
</ | </ | ||
+ | |||
+ | ==== Jak zjistit, jaké zdroje jsem pro svou úlohu požadoval ==== | ||
+ | |||
+ | < | ||
+ | hard resource_list: | ||
+ | hard resource_list: | ||
+ | hard resource_list: | ||
+ | hard resource_list: | ||
+ | hard resource_list: | ||
+ | hard resource_list: | ||
+ | |||
+ | ==== Jak rezervovat více jader na stejném stroji pro 1 job ==== | ||
+ | |||
+ | < | ||
+ | qsub -pe smp <pocet jader> | ||
+ | </ | ||
+ | |||
+ | ===== Synchronizace úloh (v Perlu) ===== | ||
+ | |||
+ | Pokud chci paralelizovat část úlohy (zde '' | ||
+ | |||
+ | * Obalím svůj skript pro běh na gridu – vytvořím '' | ||
+ | < | ||
+ | #!/bin/bash | ||
+ | . / | ||
+ | |||
+ | qrsh -cwd -V -p -50 -l mf=5g -now no ' | ||
+ | </ | ||
+ | * Ve svém hlavním skriptu ho pak zavolám a posbírám výsledky: | ||
+ | < | ||
+ | use FileHandle; | ||
+ | use IPC::Open2; | ||
+ | use threads; | ||
+ | use threads:: | ||
+ | my @threads; | ||
+ | my @results; | ||
+ | share(@results); | ||
+ | for (@inputs) | ||
+ | my $t = async { | ||
+ | my $reader; my $writer; | ||
+ | my $pid = open2($reader, | ||
+ | die " | ||
+ | $writer-> | ||
+ | print $writer " | ||
+ | $writer-> | ||
+ | for (< | ||
+ | chomp; | ||
+ | { | ||
+ | lock @results; | ||
+ | push @results, $_; | ||
+ | } | ||
+ | } | ||
+ | waitpid $pid, 0; # Pockame s ukoncenim vlakna na ukonceni ulohy v gridu | ||
+ | return $? >> 8; # Pokusime se ziskat navratovou hodnotu (netestoval jsem) | ||
+ | }; | ||
+ | push @threads, $t; | ||
+ | } | ||
+ | for (@threads) | ||
+ | die "Child exited with non-zero exit code" if $_-> | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Poznámky: | ||
+ | * Pokud lze všechno předat parametry, nemusí se otevírat obousměrná roura a situace bude jednodušší | ||
+ | * Pokud '' | ||
+ | * Celý příklad je k vidění v Czengu od V.N. |