Dette indlæg er alene udtryk for skribentens egen holdning.

GNU parallel - I LOVE IT!

17. november 2011 kl. 21:3933
Artiklen er ældre end 30 dage
Manglende links i teksten kan sandsynligvis findes i bunden af artiklen.

Jeg har lige sidddet med en hade-opgave.
Jeg har en masse Linux-maskiner, hvor jeg kan logge ind på hver af dem med ssh, og jeg vil vide hvor meget RAM, der bruges af den process med mest RAM-forbrug - for hver maskine.

Bemærk at Lixtallet stiger en kende ned igennem indlægget...

<nørd-mode>

Töse-løsningen er login til maskine et - kør top, tryk "M" og se hvad der står øverst. Hvis man har mere end 100 maskiner, så er det ikke bare en hade-løsning med en stupid løsning.

Artiklen fortsætter efter annoncen

Jeg ved godt at min gamle ven Ole Tange have lavet programmet "parallel" (se hjemmesiden for GNU parallel, men aldrig haft brug for det før i dag,
Og jeg er super glad allerede.

Først lavede jeg den UNIX/Linux kommando, der kan vise mig den mest forslugne process:

  1. $ ps -e -orss=,args= | sort -b -k1,1n | tail -n 1
  2. 1714040 gdb simu

Med andre ord "gdb simu" æder 1,7GB hukommelse. Hvis I kan ændre kommandoen til også at vise hvor lang tid den har kørt kunne det være bedre.

Næste delopgave er at kaste alle maskin-navne ned i en fil "mycomputers.txt". Jeg havde heldigvis listen i forvejen.

  1. $ cat mycomputers.txt
  2. sim001
  3. sim002
  4. sim003
  5. ...
  6. sim-sindsygtmange....

GNU Parallel er super nem at oversætte på en normal Linux-maskine: udpak med "tar xvjf", derefter "configure;make;sudo make install".

  1. $ parallel --tag --nonall --sshloginfile mycomputers.txt \
  2. "ps -e -orss=,args= | sort -b -k1,1n | tail -n 1"

Som det kan ses at det sidste argument den kommando, der skal udføres på hver enkelt maskine. De "halv-skumle" argumenter til "parallel" dvs "--tag --nonall" fandt jeg på den udmærkede man-side til programmet.

Artiklen fortsætter efter annoncen

Output af mit saftige program er noget ala

  1. $ parallel ... | tee out.txt
  2. sim001 5540 ntpd -u ntp:ntp -p /var/run/ntpd.pid
  3. sim002 1265084 ics
  4. sim003 5540 ntpd -u ntp:ntp -p /var/run/ntpd.pid
  5. sim004 48222660 /usr/bin/gdb --quiet sim
  6. ...

Det kan nævnes, at jeg ikke orkede at trykke "yes" til hver enkelt ssh-login og derfor har jeg rettet lidt i min SSH opsætning:

  1. $ cat ~/.ssh/config
  2. StrictHostKeyChecking no

Jeg ved godt at der er et sikkerheds-issue i dette - life is tough...

Idet der kom for mange linier ud, og jeg reelt kun var interesseret i at finde de maskiner, med ekstreme processer, så endte jeg med at filtre min "out.txt" en gang til:

  1. $ cat out.txt | awk '{print $2 " " $1}' | sort -n | tail -n 5
  2. 5540 sim019
  3. 5540 sim003
  4. 5540 sim001
  5. 1265084 sim002
  6. 48222660 sim004

Så endelig har jeg en nem oversigt over at sim004 åbenbart kører en diskret lille 48 GB proces.

</nørd-mode>

Hvad kan jeg sige... Unix er nemt :-)

/pto

33 kommentarer.  Hop til debatten
Denne artikel er gratis...

...men det er dyrt at lave god journalistik. Derfor beder vi dig overveje at tegne abonnement på Version2.

Digitaliseringen buldrer derudaf, og it-folkene tegner fremtidens Danmark. Derfor er det vigtigere end nogensinde med et kvalificeret bud på, hvordan it bedst kan være med til at udvikle det danske samfund og erhvervsliv.

Og der har aldrig været mere akut brug for en kritisk vagthund, der råber op, når der tages forkerte it-beslutninger.

Den rolle har Version2 indtaget siden 2006 - og det bliver vi ved med.

Debatten
Log ind eller opret en bruger for at deltage i debatten.
settingsDebatindstillinger
27
18. november 2011 kl. 19:31

Godt nok besværligt, bare for noget "så" simpelt...

Og jeg enda selv Linux bruger

32
20. november 2011 kl. 10:44

Øhhh besværligt synes jeg slet ikke det var. Det var bare at sammesætte et par komponenter, så havde jeg løsningen.

26
18. november 2011 kl. 17:41

  1. icm -script {ps | sort -des WS | select -first 1} (gc mycomputers.txt)

Invoke-Command (alias icm) udfører samme script block (ikke overført som kildetekst) på flere computere samtidigt.

Get-Process (alias ps) returnerer en liste over process-info objekter

Sort-Object (alias sort) sorterer på udvalgte properties, her descending på WorkingSet.

Select-Object (alias select) kan udvælge fra listen.

Fordi det er process-info objekter bliver de formatteret i tabelform med mindre en anden formattering benyttes. Fordi objekterne er modtaget fra "remote" computere bliver computername medtaget i listen.

Get-Content (alias gc, cat) læser en fil og returnerer et array af linierne.

22
18. november 2011 kl. 16:14

Jeg forstår ikke helt. Hvorfor ikke bare?

  1. for i in <code>cat mycomputers.txt</code>; do ssh $i 'ps -e -orss=,args= | sort -b -k1,1n | tail -n 1'; done

Parallels er sikkert meget smart, men hvis man ikke har det allerede er der vist ingen grund til at hente det bare på grund af denne opgave.

25
18. november 2011 kl. 17:38

Jeg forstår ikke helt. Hvorfor ikke bare?

Du har helt ret. Hvad kan 'parallel' som 'for' ikke kan? Svaret er at 'parallel' kan gøre det hurtigere, specielt hvis du har flere cpuer.

  1. time parallel --tag -j+0 ping -W1 -c1 192.168.1.{} | grep received ::: $(seq 99)

Hvis ikke du har så mange cpu'er, så giv den gas:

  1. time parallel --tag -j99 ping -W1 -c1 192.168.1.{} | grep received ::: $(seq 99)
ca. 5 sek.

  1. time for N in $(seq 99); do echo -n "$N " ; ping -W1 -c1 192.168.1.$N | grep received ; done
ca. 98 sek.

24
18. november 2011 kl. 17:32

i Baldurs eksempel udføres kommandoen sekventielt på all 'remote hosts' - med parallel (eller lignende værktøjer) udføres kommandoen parallelt.

30
18. november 2011 kl. 22:49

Det med atomic output er smart, men dog ikke nødvendigt for denne opgave. Princippielt kan linjerne blive blandet, men i praksis sker det ikke. Det med at køre det parallelt er grundlæggende også overkill til Peters opgave. Medmindre han har en seriøst stor klynge, så tager det næppe et minut at køre dem sekventielt.

31
20. november 2011 kl. 10:40

Jeg har en seriøst stor klynge....

23
18. november 2011 kl. 17:18

Da jeg bruger shellen som Baldur beskriver nærmest dagligt fra en jumphost med ssh nøgler på osv, må jeg tilslutte mig og spørge hvad er det parallel kan? Det virker endda nemmere at putte en masse echo og andet lol ind i shell kommandoen så man kan få et "pænere" output.

20
18. november 2011 kl. 12:25

$ cat out.txt | awk '{print $2 " " $1}' | sort -n | tail -n 5

Det er meget at skrive....

Hvis du kan leve med at tallet står i 2. kolonne, så:

$ sort -k2 -n out.txt | tail -n 5

og bonus er at du beholder sidste del af linjen.

19
18. november 2011 kl. 12:12

Smarte softwarearkitekter snakker så meget i disse år om det pattern, der hedder "Seperation of Concerns".

Unix har hele tiden været der. :-)

/Carsten

16
18. november 2011 kl. 10:52

GNU Parallel var oprindeligt en replacement for xargs, men mange af mine brugere begyndte at (mis)bruge GNU Parallel istedet for pdsh/dsh/clusterssh. Den primære grund var vist, at de ikke gad lære endnu et værktøj, og at de med GNU Parallel på en let måde kunne opbygge komplekse kommandoer, som de så kunne få udført på flere maskiner. Derfor fik GNU Parallel for nogle måneder siden --onall (som kører alle kommandoer med genererede argumenter på alle maskiner) og --nonall (som tager no arguments).

Så muligheden for at køre den samme kommando med samme args på mange maskiner er ikke den primære force i GNU Parallel. Den primære force er at køre den samme kommando med forskellige argumenter enten på samme eller flere samarbejdende maskiner.

Lær mere om GNU Parallel: http://www.youtube.com/watch?v=OpaiGYxkSuQhttp://www.youtube.com/watch?v=P40akGWJ_gY http://www.youtube.com/watch?v=1ntxT-47VPA http://www.youtube.com/watch?v=fOX1EyHkQwc

14
18. november 2011 kl. 08:46

men ville pdsh ikke gøre det samme?

10
17. november 2011 kl. 23:37

Jeg ved godt at der er et sikkerheds-issue i dette - life is tough...

ifølge den fine manpage du selv henviser til er formatet for et "sshlogin" argument på formen:
  1. [sshcommand [options]][username@]hostname
så du kunne jo begrænse "StrictHostKeyChecking no" til kun at gælde for den process du kører her ved at tilføje optionen på din hostliste :)

8
17. november 2011 kl. 23:16

Nysgerrighed, hvilken process æder 48G?

Det er eddermukkemig meget.

17
18. november 2011 kl. 11:03

På vores systemer er 48G processer ikke usædvanligt. Idag kørte der på een af vores maskiner:

47.3g R 27.0g R 23.6g R

Vi roder med DNA analyser og R er den fri version af matematiksystem S (som minder lidt om MatLab, hvis du kender det), hvortil der er skrevet en del DNA-analysemoduler.

18
18. november 2011 kl. 12:06

R er den fri version af matematiksystem S (som minder lidt om MatLab, hvis du kender det)

tjae... de har hver deres styrker... R er primært beregnet til statistik og MatLab mest til generelle numeriske matrix beregninger... og de kan naturligvis begge begnyttes til at gøre meget af det den anden kan... men jeg kan godt nok ikke lide måden man definerer matricer på i R... men det var vist et sidespor :) Tak for det lille indblik i parallel brug og udvikling i øvrigt - kender alt for godt den med at det nogle gange er "lettere" at tweake noget man kender til at gøre det man vil end at bruge noget der er mere egnet...

11
17. november 2011 kl. 23:37

Jeg ved ikke præcis hvad det er - men jeg ved hvem, der skal lave nogle klaps :)

13
17. november 2011 kl. 23:56

Det kunne du vel finde ud af ved at tilføje en $3 til awk

Edit: Som Jakob lige har skrevet

6
17. november 2011 kl. 23:11

get-process -computername x,y,z

eller pipe fra en ou i AD

Windows er blevet nemt :)

9
17. november 2011 kl. 23:34

dog minus list formattering man det kan laves i en lang linje

3
17. november 2011 kl. 22:45

At der er en lille hjemmeopgave ovenfor :-)

Hvis I kan ændre kommandoen til også at vise hvor lang tid den har kørt kunne det være bedre.

7
17. november 2011 kl. 23:15

ps -e -orss=,start,args= | sort -b -k1,1n | tail -n 1

12
17. november 2011 kl. 23:45

Eller for ikke at lave rod i awk scriptet:

ps -e -orss=,args=,start= | sort -b -k1,1n | tail -n 1

Og så til sidst bruge

awk '{print $2,$1,$3}'

4
17. november 2011 kl. 23:00

ps -e -orss=,time=,args= | sort -b -k1,1n | tail -n 1

6
17. november 2011 kl. 23:05

Unix er smukt :-)

5
17. november 2011 kl. 23:05

tak!

1
17. november 2011 kl. 22:30

med en kop kaffe inden sengetid Godt skreven

2
17. november 2011 kl. 22:43

Tak :)