Klaster komputerowy "szpak"

Katedry Teorii Struktury Jądra Atomowego

Instytutu Fizyki Teoretycznej

Wysyłanie programu do wykonania

Aby wysłać program 32-bitowy do wykonania na klastrze należy przygotować skrypt, a następnie wykonać komendę:

qsub nazwa

gdzie nazwa jest nazwą fajlu zawierającego przygotowany skrypt. Program zostanie wysłany do wykonania na jeden z wolnych węzłów 32-bitowych lub 64-bitowych. Natomiast aby wysłać program 64-bitowy do wykonania na klastrze należy wykonać komendę:

qsub -q opteron nazwa

Skrypt w swojej minimalnej formie moze zawierać jedynie trzy linie:

#PBS -l cput=24:00:00,mem=256mb
cd $PBS_O_WORKDIR
program

Pierwsza linia ustala limit czasu cput (w podanym przykładzie 24 godziny) i limit pamięci mem (w podanym przykładzie 256MB). Druga linia zapewnia, że program będzie się wykonywał w tej dyrektorii, z której został wysłany -- tam powinny znajdować się wszystkie fajle używane przez program użytkownika i tam trafią wszystkie fajle wyprodukowane przez ten program. Trzcia linia jest komendą wykonania programu użytkownika.

Administrowanie pamięcią

Podanie jak najmniejszego, ale wystarczającego do wykonania pracy limitu pamięci jest niezwykle istotne z punktu widzenia funkcjonowania klastra. Należy pamiętać, że na jednym węźle mogą się liczyć dwa programy, które dzielą między siebie pamięć węzła. Żądanie zbyt dużej pamięci sprawi więc, że program nie wykona się na węzłach o mniejszej (niewystarczającej) pamięci, a także nie zostanie wpuszczony na węzeł, gdzie liczy się już inny program rezerwujący dla siebie część pamięci. Co więcej, kiedy program zostanie w końcu wpuszczony do wykonania, to zablokuje wejście na ten sam węzeł innemu programowi, który mógłby się z powodzeniem obok niego wykonać. Natomiast podanie zbyt małej pamięci spowoduje, że program zostanie wpuszczony na węzeł, który nie ma w danej chwili tyle pamięci ile będzie potrzebne do wykonania, ale następnie padnie z często niezrozumiałym komunikatem. Upadki takie będą przy tym niepowtarzalne i użytkownik będzie miał spory problem z zorientowaniem się co się dzieje.

Kiedy program się liczy, komenda qstat -f JOB pozwala stwierdzić ile pamięci zużywa aktualnie praca o numerze JOB. Komenda ta podaje dwa rodzaje pamięci, np.:

resources_used.mem = 1879616kb
resources_used.vmem = 1968208kb

Dla dobrze zaprogramowanych i skompilowanych programów, obie podane liczby powinny być bliskie sobie. Jako limit pamięci mem należy podawać liczbę resources_used.vmem zaokrągloną w górę do pełnego megabajta.

Kolejki i priorytety

Na klastrze są zainstalowane dwie kolejki o nazwach workq (kolejka domyślna) oraz opteron. Kolejka workq przeznaczona jest do wykonywania prac 32-bitowych, które mogą się liczyć na wszystkich węzłach (zarówno 32-bitowych jak i 64-bitowych), zaś kolejka opteron przeznaczona jest do wykonywania prac 64-bitowych. Nie ma żadnych ograniczeń na liczbę prac jednego użytkownika wykonujących się jednocześnie. To znaczy, każdy użytkownik może wykorzystać całe zasoby klastra. Nie ma też żadnych ograniczeń na czas jednej pracy (oprócz formatu zadawania czasu ograniczonego do 100 dni). Zalecane jest jednak ograniczenie czasu jednej pracy do kilku dni, aby umożliwić w miarę swobodny przepływ prac przez klaster.

Prace zabierane są do wykonania w kolejności priorytetów ustalanych następującym wzorem:

Priorytet = 1440 * [100+Bonus-(Procent konsumpcji czasu klastra)] + 5 * (Czas oczekiwania w minutach)

Procent konsumpcji czasu klastra przez danego użytkownika obliczany jest jako średnia ważona z ostatnich 48 godzin, przy czym każde kolejne coraz wcześniejsze dwie godziny mają wagę o czynnik 0.9 mniejszą. Tabelę konsumpcji czasu można obejrzeć wykonując komendę diagnose -h. Czas oczekiwania jest czasem od chwili wpuszczenia danej pracy do kolejki. Bonus jest parametem preferencji dla użytkowników realizujaących zadania Katedry TSJA -- aktualnie ustawiony na 40 procent.

Wzór ten zapewnia, że każdy użytkownik, ktory liczył mało w ciągu ostatnich 48 godzin przejdzie przed wszystkimi tymi, którzy liczyli dużo. Komenda showq pozwala obejrzeć listę prac oczekujących na wykonanie ustawioną w kolejności priorytetów. Komenda checkjob JOB pozwala stwierdzic stan bieżący pracy o numerze JOB, łącznie z przydzielonym jej priorytetem.

Komenda qdel JOB pozwala przerwać pracę w dowolnym momencie i usunąć ją z kolejek.

Praca zostaje wzięta do wykonania tylko wtedy jeżeli są dle niej wolne zasoby -- w praktyce chodzi o węzeł z wystarczająco dużą dostępną aktualnie pamięcią.

Inny przykład skryptu

Bardziej rozbudowana froma skryptu może zawierać więcej linii, na przykład:

#!/bin/bash
#PBS -j oe
#PBS -r n
#PBS -l cput=168:00:00,mem=45mb
#
cd $PBS_O_WORKDIR
#
echo -n 'Obliczenia na komputerze: '
hostname
echo -n 'Obliczenia rozpoczete: '
date
#
echo ' PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND'
top -n 10000 -d 600 -b | grep program &
#
program
#
echo -n 'Obliczenia zakonczone: '
date

Rolę tych linii można streścić następująco:
Nr linii Opis
1 Shell, w którym ma się wykonać skrypt
2 Żądanie aby fajle stdout i stderr odesłane były we wspólnym fajlu
3 Żądanie, aby system nie ponawiał automatycznie ponownego uruchomienia tego samego skryptu, jeśli jego wykonanie zostanie z jakichś powodów przerwane.
4 Podanie limitów czasu i pamięci, jak powyżej.
6 Ustalenie dyrektorii, jak powyżej.
8-9 Wypuszczenie na stdout informacji o nazwie węzła, na którym program się wykonywał. Aktualne nazwy węzłów to a00--a14, a ich parametry podane są poniżej.
10-11 Wypuszczenie na stdout informacji o dacie i godzinie rozpoczęcia wykonywania programu.
13-14 Wypuszczenie na stdout informacji o pamięci używanej przez program. Pamięć próbkowana jest co 10 minut. W linii 14 należy zamiast program wpisać rzeczywistą nazwę programu wysyłanego do wykonania w linii 16.
16 Komenda wykonania programu użytkownika, jak powyżej.
18-19 Wypuszczenie na stdout informacji o dacie i godzinie zakończenia wykonywania programu.

Parametry węzłów

Lista aktualnych węzłów wraz z ich parametrami przedstawia się następująco:
NazwaRodzaj Procesor PamięćUwagi
a00 I 1xMP1600+1.0GB Serwer
a01 II 2xMP1600+1.0GB
a02 II 2xMP1600+1.0GB
a03 0 2xMP1600+1.0GB Wyłączony
a04 0 2xMP1600+1.0GB Wyłączony
a05 II 2xMP1600+1.0GB
a06 II 2xMP1600+1.0GB
a07 II 2xMP1600+1.0GB
a08 II 2xMP1600+1.0GB
a09 IV 2xMP2000+2.0GB
a10 III 2xMP2000+1.0GB
a11 IV 2xMP2000+2.0GB
a12 IV 2xMP2000+2.0GB
a13 IV 2xMP2000+2.0GB
a14 IV 2xMP2000+2.0GB
a15 V 2xMP2400+2.0GB
b01 VI 2xOPT246 8.0GB
b02 VI 2xOPT246 8.0GB
b03 VI 2xOPT246 8.0GB
b04 VI 2xOPT246 8.0GB
b05 VII 2xOPT270 Dual Core 4.0GB
b06 VII 2xOPT270 Dual Core 4.0GB
b07 VII 2xOPT270 Dual Core 4.0GB
b08 VII 2xOPT270 Dual Core 4.0GB


Ostatnie modyfikacje: 26 września 2006.