[perl/crontab/load] Hoe aan te pakken?

Pagina: 1
Acties:

  • BKJ
  • Registratie: April 2000
  • Laatst online: 08-08 11:07
Ik heb een aantal scripts, zo rond de dertig, allemaal geschreven in perl. Deze moeten elk toch een paar keer per uur worden gedraaid. Ik had eerst in mijn contab list elk perl script genoemd maar dit bleek niet te werken omdat dat zo'n hoge load veroorzaakte dat ik defunct kreeg.

Vervolgens heb ik een apart perl script gemaakt die elk van de perl scripts apart aanriep. Dit script was toen het enige wat in mijn crontab stond. Dit werkte al beter totdat het verzamel perl script ook al zo'n beetje dertig entries had. Toen heb ik maar besloten om twee verzamel script geschreven en deze 2 in de crontab geplaatst. En nog merk ik dat sommige scripts niet uitgevoerd worden terwijl de tijdstippen van de 2 scripts verschillen (ieder om de 10 minuten maar de een elke 10 mins die deelbaar zijn door 5 en de andere door 10).

Wat is nu de beste oplossing om dit probleem te verhelpen?

FF wat info nog:

Het zijn allemaal scripts die het volgende doen:
- connectie opbouwen met server (elk script andere server)
- data verwerken
- data opslaan in MySQL

Het zijn scripts die voor een bedrijf verschillende databronnen verkent (van subfilialen) en deze binnenhaalt en verwerkt. Het opbouwen van de connectie gebeurt met LWP::Simple (een get). De MySQL aansturing is met DBI.

Kamer huren


  • tech-no-logical
  • Registratie: December 2000
  • Laatst online: 17-08 19:02
oplossingen kan ik je niet bieden, daar is te weinig informatie voor.

- wat gebeurt er op de machine als je een (verzamel)script handmatig draait ? (qua load, mem-use)
- maken je scripts logfiles ?
- gebruik je lock-files om te zorgen dat geen 2 instances tegelijk draaien (als dat een probleem zou kunnen zijn) ?
- is het (verzamel)script wel klaar in tien minuten ?

  • BKJ
  • Registratie: April 2000
  • Laatst online: 08-08 11:07
tech-no-logical schreef op 29 April 2003 @ 21:53:
- wat gebeurt er op de machine als je een (verzamel)script handmatig draait ? (qua load, mem-use)
- maken je scripts logfiles ?
- gebruik je lock-files om te zorgen dat geen 2 instances tegelijk draaien (als dat een probleem zou kunnen zijn) ?
- is het (verzamel)script wel klaar in tien minuten ?
- handmatig draaien geeft hij dezelfde problemen en draaien sommige script niet
- logfiles kan ik idd wel ff implementeren om te kijken WAAR het fout gaat
- lock files? Nog nooit van gehoord....ff googlen.. :)
- Het verzamelscript is klaar binnen 1 minuut als hij werkt.

Nog wat meer info dan:

Dit is de manier waarop ik de scripts in het verzamelscript aanroep:

code:
1
`perl ~/update/script1.cgi >/dev/null 2>&1`;


Dit is wat er in de crontab staat:

code:
1
2
0,10,20,30,40,50 * * * * perl ~/update/update1.cgi >/dev/null 2>&1
5,15,25,35,45,55 * * * * perl ~/update/update2.cgi >/dev/null 2>&1


Eerst ff over het verzamelscript: Is dit wel de beste manier om een perl script binnen een perl script aan te roepen bedenk ik me ineens.

Opmerking over beide: is die >/dev/null 2>&1 wel verstandig?

Kamer huren


Verwijderd

Je zou je perl scripts kunnen compilen... dat scheelt nogal in het iedere keer opnieuw parsen van de perl code. Daarnaast kan je misschien je code ook nog optimalizeren (minder externe programma's aanroepen o.a.)

Wat je ook kan proberen is je hele code in een while loop zetten, met een sleep aan het einde.
Dan hoef je het script maar 1x te runnen (1x parsen etc) en zorgt het script zelf ervoor dat het regelmatig data processed. (Dus als daemon proccie laten lopen)

Verwijderd

Ohja... als dat verzamelscript alleen maar andere scripts aanroept.... en zelf dus niets interessants doet, dan kan je er beter een shell script van maken... scheelt nogal ;)

ipv:
`perl something somethine`


#!/bin/sh
perl something something ....
etc
etc

Verwijderd

Daarnaast....

Op wat voor hardware draait dit.... is die voldoende voor de lading perl processen die je tegelijkertijd wil runnen (alles vanaf 300Mhz met wat (90+) geheugen zou voldoende moeten zijn)

Die uitvoer redirection kan je beter naar een bestand doen... dan krijg je nog wat debugging info, en als je het bestand gewoon iedere keer laat overwriten kost het je ook nog eens geen diskspace...
Maar dat is een afweging die je moet maken.... diskspace, of betere logging/debugging

  • BKJ
  • Registratie: April 2000
  • Laatst online: 08-08 11:07
Verwijderd schreef op 29 April 2003 @ 22:16:
Je zou je perl scripts kunnen compilen... dat scheelt nogal in het iedere keer opnieuw parsen van de perl code. Daarnaast kan je misschien je code ook nog optimalizeren (minder externe programma's aanroepen o.a.))
Hoe compileer je perl scripts? Iets met perlcc? De code is al behoorlijk geoptimaliseerd.....daar valt weinig te halen helaas......
Wat je ook kan proberen is je hele code in een while loop zetten, met een sleep aan het einde.
Dan hoef je het script maar 1x te runnen (1x parsen etc) en zorgt het script zelf ervoor dat het regelmatig data processed. (Dus als daemon proccie laten lopen)
Dat wordt wel een enorme file....lijkt me niet echt praktisch. Daarbij runt het script als een normale user en dat pikt de server niet. Misschien heeft root meer rechten maar het wordtniet gewaardeerd als ik begin te spelen met de root user.

Kamer huren


  • BKJ
  • Registratie: April 2000
  • Laatst online: 08-08 11:07
Verwijderd schreef op 29 april 2003 @ 22:20:
Ohja... als dat verzamelscript alleen maar andere scripts aanroept.... en zelf dus niets interessants doet, dan kan je er beter een shell script van maken... scheelt nogal ;)

ipv:
`perl something somethine`


#!/bin/sh
perl something something ....
etc
etc
Dat is een verdomd handig idee! Moeten de regels ook afgesloten worden met ;'s?

Als ik het goed heb moet het zo werken?:


code:
1
2
3
4
5
6
7
8
9
#!/bin/sh
perl script1.cgi
perl script2.cgi

           .
           .
           .

perl scriptn.cgi

Kamer huren


Verwijderd

Ik bedoel niet alle code in 1 grote loop, maar waar je nu een script aaroept vanuit cron (zeg script X)
verander je de code van X in...

#!/usr/bin/perl

while(true)
{
De originele versie van X

sleep tot een bepaalde tijd....
}

Excuus voor de pseude/foute code... heb al een tijdje geen perl meer gebruikt ;)

Perl compilen kan met verschillende compilers... Ik weet in ieder gevan van het bestaan af van een commerciele perl compiler (die we bij mij op het werk gebruiken). Er zijn vast ook nog wel freeware perl compilers ;)

Verwijderd

hitchhacker schreef op 29 april 2003 @ 22:29:
[...]

code:
1
2
3
4
#!/bin/sh
perl script1.cgi
perl script2.cgi
perl scriptn.cgi
Yep.... that's it...
Nou is het misschien beter om ook nog wat fout-afhandeling en/of logging hierin te verwerken, maar deze code zou een stuk sneller moeten runnen dan het vergelijkbare in perl (scheelt 1 shell starten per script)

  • BKJ
  • Registratie: April 2000
  • Laatst online: 08-08 11:07
FF een paar stresstesten gedaan en het blijkt idd dat een bash script minder load veroorzaakt. De perl scripts worden nu allemaal netjes uitgevoerd......Gelukkig heeft perl ook een ingebouwde timeout bij LWP zodat als een server onbereikbaar is er gewoon doorgegaan wordt naarhet volgende script.

Mark, bedankt voor je hulp!

Kamer huren

Pagina: 1