GNU parallel - I LOVE IT!

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.

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:

$ ps -e -orss=,args= | sort -b -k1,1n | tail -n 1
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.

$ cat mycomputers.txt
sim001
sim002
sim003
...
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".

$ parallel --tag --nonall --sshloginfile mycomputers.txt \
"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.

Output af mit saftige program er noget ala

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

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:

$ cat ~/.ssh/config 
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:

$ cat out.txt | awk '{print $2 " " $1}' | sort -n | tail -n 5
5540 sim019  
5540 sim003  
5540 sim001
1265084 sim002 
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

Kommentarer (33)
sortSortér kommentarer
  • Ældste først
  • Nyeste først
  • Bedste først
Esben Madsen

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:

  [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 :)

  • 5
  • 0
Ole Tange Blogger

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=OpaiGYxkSuQ
http://www.youtube.com/watch?v=P40akGWJ_gY http://www.youtube.com/watch?v=1ntxT-47VPA http://www.youtube.com/watch?v=fOX1EyHkQwc

  • 0
  • 0
Ole Tange Blogger

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.

  • 0
  • 0
Esben Madsen

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...

  • 0
  • 0
Hans Schou

$ 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.

  • 2
  • 0
Peter Lind

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 :)


Endvidere kunne man - hvis man er bange for known hosts - bruge UserKnownHostsFile i forbindelse med StrictHostKeyChecking og derved ikke opdatere sin normale known hosts file.

Ikke at jeg ser problemet med known hosts, men muligheden er der :)

  • 1
  • 0
Baldur Norddahl

Jeg forstår ikke helt. Hvorfor ikke bare?

for i in `cat mycomputers.txt`; 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.

  • 0
  • 0
Mads Forsberg

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.

  • 0
  • 0
Hans Schou

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.

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:

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

ca. 5 sek.

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

ca. 98 sek.

  • 1
  • 0
Uffe Seerup
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.

  • 1
  • 1
Baldur Norddahl

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.

  • 0
  • 0
Log ind eller Opret konto for at kommentere