Monitorowanie wydajności wykorzystania zasobów przez zadania

Z KdmWiki
Wersja z dnia 08:29, 19 lip 2016 autorstwa Justa (dyskusja | edycje) (→‎Narzędzia monitorujące na klastrze Bem)
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Przejdź do nawigacji Przejdź do wyszukiwania

< Podręcznik użytkownika KDM < System kolejkowy < Monitorowanie wydajności wykorzystania zasobów przez zadania

Aby efektywnie wykorzystywać zasoby obliczeniowe WCSS należy sprawdzać czy pamięć RAM alokowana dla zadania jest przez nie wykorzystywana, a zadania zlecone na wiele rdzeni (lub węzłów) rzeczywiście wykonują się równolegle. Użytkownicy (w szczególności nowi) powinni monitorować swoje zadania, by upewnić się, że pamięć i procesory zarezerwowane dla zadania są przez nie odpowiednio wykorzystywane.

System kolejkowy PBSPro oferuje narzędzia, dzięki którym można monitorować wykorzystanie zasobów przez zadania (uruchomione lub historyczne).

Monitorowanie wykorzystania zasobów: uruchomione zadania

W pierwszej kolejności należy użyć komendy

> qstat -u $USER 

Polecenie to zwróci listę wszystkich zadań użytkownika znajdujących się w kolejce. Lista powinna wyglądać podobnie do poniższej:

1000.achille user_1   short168 test_1  130814   1   2  2000mb  54:00 R 22:47
2000.achille user_1   short168 test_2  37796    1  12    43gb 104:00 R 22:47
3000.achille user_1   short168 test_3  97915    1   8    23gb  54:00 R 22:47
4000.achille user_1   short168 test_4  37437    1   1  4000mb  54:00 R 22:48

Liczba znajdująca się w pierwszej kolumnie każdego wiersza jest identyfikatorem przypisanym do zadania przez system kolejkowy PBS.

Aby uzyskać więcej informacji na temat konkretnego zadania należy skorzystać z polecenia:

> qstat -f identyfikator_zadania

Na przykład, aby wyświetlić szczegółowe informacje na temat pierwszego zadania z powyższej listy, należy użyć komendy:

> qstat -f 1000

Polecenie to zwraca wiele informacji, z których najistotniejsze (w kontekście wykorzystania zarobów przez zadanie) można uzyskać wyszukując w strumieniu danych odpowiednie linie, np.:

> qstat -f identyfikator_zadania | grep -e resources_used | grep -e .cpupercent -e .cput -e ncpus -e .mem -e .walltime -e npcpus

Dane uzyskane za pomocą powyższej komendy przedstawiają informacje na temat wykorzystania przez zadanie: procesora (etykieta cpupercent), czasu CPU (etykieta cput), pamięci RAM (etykieta mem), czasu obliczeniowego (etykieta walltime), np.:

> qstat -f 1000 | grep -e resources_used | grep -e .cpupercent -e .cput -e ncpus -e .mem -e .walltime -e npcpus

resources_used.cpupercent= 95
resources_used.cput =00:46:18
resources_used.mem =59792kb
resources_used.ncpus = 2
resources_used.vmem =59792kb
resources_used.walltime= 00:48:40

Aby sprawdzić jakie zasoby zostały zaalokowane dla zadania należy użyć polecenia:

> qstat -f 1000 | grep -e Resource_List | grep -e :mem  -e walltime
 
 Resource_List.select = 1:ncpus=2:mem=2000MB
 Resource_List.walltime = 20:00:00

Monitorowanie wykorzystania zasobów: zadania historyczne

Aby uzyskać informację na temat wykorzystania zasobów przez zadanie zakończone w ciągu ostatnich 48-godzin należy użyć komendy:

> qstat -fx identyfikator_zadania | grep -e resources_used | grep -e .cpupercent -e .cput -e ncpus -e .mem -e .walltime -e npcpus

W przypadku zadań zakończonych wcześniej niż w ciągu ostatnich 48h można skorzystać z polecenia:

> tracejob -n liczba_dni_do_sprawdzenia identyfikator_zadania | egrep -o -e resources_used.cput=[0-9]+ -e resources_used.ncpus=[0-9]+ 
 -e resources_used.mem=[0-9]+[a-z]+ -e resources_used.walltime=[0-9]+

Za parametr liczba_dni_do_sprawdzenia należy podać liczbę dni, dla których mają zostać sprawdzone informacje o zadaniu.

Wykorzystanie pamięci

Etykieta resources_used.mem wskazuje maksymalną ilość pamięci RAM (w kilobajtach) wykorzystaną przez zadanie obliczeniowe, natomiast etykieta Resource_List.select wyświetla informacje o pamięci zaalokowanej dla zadania.

Przykład: zadanie 1000.achilles wykorzystało maksymalnie ok. 58 MB pamięci, podczas gdy ilość pamięci zarezerwowanej dla zadania wynosi 2000 MB. W tym przypadku pamięć zarezerwowana dla zadania została przeszacowana kilkudziesięciokrotnie.

Wykorzystanie czasu obliczeniowego

Etykieta "resources_used.walltime" wskazuje ilość czasu obliczeniowego wykorzystanego przez zadanie, natomiast etykieta "Resource_List.walltime" wyświetla informacje o liczbie godzin obliczeniowych zarezerwowanych dla zadania.

Przykład: zadanie 1000.achilles wykonywało się przez 48 min. i 40 s , natomiast dla zadania zarezerwowanych zostało 20 godzin obliczeniowych.

Wykorzystanie procesora: Jaka jest skalowalność mojego programu?

Skalowalność aplikacji można oszacować eksperymentalnie. Jeśli to możliwe należy w taki sposób dobrać zestaw danych wejściowych, aby zadanie na jednym procesorze liczyło się co najmniej kilkadziesiąt minut, ale nie dłużej niż 10 godzin. Następnie zadanie to należy uruchomić na 2,4 oraz 8 procesorach i sprawdzać czas wykonania i stopień przyspieszenia obliczeń.

Informacje na temat wykorzystania procesora przez zadanie można uzyskać z etykiet resources_used.cpupercent, resources_used.cput, resources_used.walltime.

W przypadku zadań idealnie zrównoleglonych, czas CPU powinien być równy iloczynowi czasu obliczeniowego oraz liczby procesorów wykorzystywanych przez zadanie, tj.: cput = ncpus x walltime

W rzeczywistości wartość cput jest zawsze mniejsza od iloczynu liczby procesorów i walltime'u - w przypadku wydajnie wykonujących się zadań nie powinna być jednak dużo mniejsza.

Przykład: wartość cput dla zadania 1000.achilles jest ok. dwukrotnie mniejsza od iloczynu ncpus x walltime. Oznacza to, że zadanie to nie wykonuje się równolegle - tylko jeden procesor jest wykorzystywany do obliczeń, drugi jest marnowany przez zadanie. W celu uniknięcia tego typu marnotrawienia zasobów obliczeniowych zachęcamy użytkowników do sprawdzania efektywności zadań zleconych na wiele procesorów (węzłów) obliczeniowych.

Efektywność wykonywania zadania na wielu rdzeniach (węzłach) można ocenić w następujący sposób:

  • Stopień przyspieszenia obliczeń na n-rdzeniach: (cput/walltime), np. dla zadania 1000.achilles otrzymujemy: 46/48=0.95
  • Wydajność wykorzystania rdzeni obliczeniowych: (cput/walltime)/ncpus*100%, np. dla zadania 1000.achilles otrzymujemy: (46/48)/2*100%=48%

Przykład:

  • Walltime zadania zleconego na 1 węzeł obliczeniowy jest równy 13 dni.
  • Walltime tego samego zadania zleconego na 4 węzły obliczeniowe jest równy 11 dni. Przyspieszenie obliczeń: 1,3x . Wydajność wykorzystania węzłów obliczeniowych: 64%.
  • Walltime tego samego zadania zleconego na 8 węzłów obliczeniowych jest równy 8 dni. Przyspieszenie obliczeń: 1,5x. Wydajność wykorzystania węzłów obliczeniowych: 19%.