Gå til innhold

[Python] Forbedring: Warningsystem - server nedetid


Anbefalte innlegg

Noen som ønsker å komme til forslag til forbedring av denne lille koden jeg puslet sammen for å følge med at serverne våre altid er oppe - sender sms ved nedetid.

Er ikke helt fornøyd med systemet som pinger serverne, da den sjekker en og en server, noe som blir tregt når det egentlig er snakk om mange servere, det kan føre til nedetid på over en halv time, før vi får sms tilsendt).

 

Ellers så vil jeg gjerne få andre tips og forbedringer.

 

Koden: http://pastie.org/3868013

Endret av warpie
Lenke til kommentar
Videoannonse
Annonse

hva med å flytte waiten ut av for-loopen og heller haden på slutten av while-loopen. (kan være det er kuk med diskusjon.no sin kode-ting anbefaler å heller bruke pastebin eller pastesite for pythonkode)

 

Jeg ville og skrevet om _run funksjonen litt. Den blir så lang og nested at det blir vanskelig å lese, spesielt med tanke på indentation som python bruker.

 

En annen ting, med python skal du bruke 4 spaces for indentation. Prøv å unngå å bruke tabolator eller 2 spaces. Selv om det fungerer går det i mot standarden. - igjen, kan ikke si sikkert om dette er fordi du skriver det slik eller om diskusjon.no kuker til koden -.-

 

---------------

 

Nok ranting. Den letteste måten jeg ser er å prøve å kjøre dette fler tråder og fordele serverene over flere servere. F.eks. om du setter opp 10 tråder så vil du kunne føles mye raskere. Nå er ikke python fullstendig flertrådet på kjernenivå - men trådene vil fungere mer enn bra nok til ditt bruk.

Lenke til kommentar

Indentation var egentlig 4 spaces. Forsøkte å få det korrekt her på diskusjon.no - uten lykke.

- Flyttet kode til pastie.org.

 

Skal se om jeg får til å benytte meg av threading til denne oppgaven. Og kan fikse litt på _run-funksjonen for å skape litt oversikt.

 

"hva med å flytte waiten ut av for-loopen og heller haden på slutten av while-loopen."

- Den står der for å sørge for at hver pingforespørsel er nok lenge i mellom, til å faktisk kunne bedømme om serveren er nede, eller ei. Kan være at det bare er mye last på en server, og dermed så kan det hende at han ikke får svar på forespørselene om de ikke har litt avstand mellom, eller at jeg bare byttet en nettverkskabel på serveren.

Lenke til kommentar
Gjest Gjest slettet-ld9eg7s96q

Heh, driver å lærer meg python. Har ikke vært innom form manipulasjon og var ikke klar over at det var så enkelt ... genialt

Lenke til kommentar

Indentation var egentlig 4 spaces. Forsøkte å få det korrekt her på diskusjon.no - uten lykke.

- Flyttet kode til pastie.org.

 

Skal se om jeg får til å benytte meg av threading til denne oppgaven. Og kan fikse litt på _run-funksjonen for å skape litt oversikt.

 

"hva med å flytte waiten ut av for-loopen og heller haden på slutten av while-loopen."

- Den står der for å sørge for at hver pingforespørsel er nok lenge i mellom, til å faktisk kunne bedømme om serveren er nede, eller ei. Kan være at det bare er mye last på en server, og dermed så kan det hende at han ikke får svar på forespørselene om de ikke har litt avstand mellom, eller at jeg bare byttet en nettverkskabel på serveren.

Det forklarer jo og hvorfor ting tar så lang tid. Du venter alltså 30 sekunder mellom hver ping. Noe som betyr 2 minutter per server. Dette bygger seg jo fort oppover, her burde du se på andre løsninger.

 

Da blir spørsmålet, hvor lang nedetid tillater dere før dere vil ha varsel? F.eks. om det bare er snakk om bytte at patchekabel - forventer dere at det tar mer enn 5 minutter?

 

Uansett, hva med å heller gå gjennom alle serverene uten å vente, og i stede for å sende SMS direkte så legger du alle serverene du oppdager som nede i en liste - og sjekker disse serverene separat senere, og ser om de fortsatt er nede. Vil korte ned kjøretiden drastisk.

 

Lagde et utkast til deg, denne vil heller ikke sende flere SMS om at samme server er nede, før den har kommet opp igjen. Den fungerer slik at den kjører en "2-strike" regel. Det vil si at den kjører gjennom alle serverene med et gitt mellomrom. Om en server er nede blir den markers - og om den fortsatt er nede ved neste gjennomgang sender den en SMS. Har satt den til å ta en pause melliom hver gang den går gjennom serverene på 5 minutter.

 

http://pastie.org/3868447

 

En problem med denne er at den er treg om mange servere er nede (den må vente på 4 timeouts). Men den skal være betydelig raskere enn den du ga tidliggere. Du slipper også unna multi-threading.

Endret av etse
Lenke til kommentar
Det forklarer jo og hvorfor ting tar så lang tid. Du venter alltså 30 sekunder mellom hver ping. Noe som betyr 2 minutter per server. Dette bygger seg jo fort oppover, her burde du se på andre løsninger.

- Bygger seg fort opp, er veldig klar over det. Tenker da at flere tråder hadde gjort seg, men vet ikke hvordan dette blir mht. at serveren som blir satt opp for å pinge bare har en CPU-kjerne, har ikke mye kjenskap til å jobbe med flere tråder.

 

Vi tilater helst ikke mer en 10(-15?) minutter før SMS må sendes, dermed så tenker jeg at multithreading hadde vært eksemplarisk på noe slik. Bytte av TP-kabel, restart o.l tar nok ikke mer en ~2min, men kan altids bli oppgaver som er mer tidskrevende ~40-50 minutter - dog kjeldent. Dermed så tenkte jeg at mellomrommet før den kan sende en NY SMS må være på en time.

 

Skal ikke møte på noe problematikk med flere servere nede samtidig - Finner det iallefall veldig usansynlig at mange skal gå ned samtidig.

 

- Det ser forresten ut som du fikk til noe greit der, etse. Skal se bedre over den.

 


Q: Noen som har kjenskap til et (opensource) program som kan kommunisere med mobil (sende SMS) gjennom kommandolinja, eller har en pythoninterface? Prøvde Gammu, men å konfigurere den under Windows XP var et slit, og tenker beklagligvis like så om linux - får nok til under linux, men... Endret av warpie
Lenke til kommentar

- Bygger seg fort opp, er veldig klar over det. Tenker da at flere tråder hadde gjort seg, men vet ikke hvordan dette blir mht. at serveren som blir satt opp for å pinge bare har en CPU-kjerne, har ikke mye kjenskap til å jobbe med flere tråder.

 

Man kan fint kjøre flere hundre tråder på en cpu uten noen problem, spesielt hvis de venter på I/O.

 

Fikset forresten opp i en bug i mitt eksempel. Hadde glemt å fjerne server navnet fra logg funksjon calls.

Lenke til kommentar

Python kjører ikke tråder på kjernetråd uansett, det blir virituelle tråder. Så hvor mange kjerner du har vil ikke påvirke python. Alle trådet i python kjører inni en prosess, og multitasking evnen til en flerkjernet prosessor blir derfor ikke utnyttet. Men du for forsatt fordelen ved at du kan kjøre ting paralelt, noe som gir stor ytelsesforskjell hvis oppgavene du gjør består av mye venting. Noe pingingen din gjør. (Du venter stor sett på svar)

 

Både min og Terrasque sin implementasjo fungerer utmerket til ditt bruk, Og de sjekker relativt ofte. Utne å ha sett for nøye på Terrasque sin, men ser han har tatt på seg bryet å immplementere ordentlig logging - som er positivt. Jeg tror egentlig en blanding av min og han sin ville være det beste. Jeg lagde en helt annen approach på problemet - mens han tok din og gjorde den paralell.

 

Angående min kode, om du vil endre på hvor ofte den sjekker serveren så endrer du det enkelt (bare se på hvordan jeg konstruerer klassen).

Lenke til kommentar

Jepp. Jeg bare tok original logikk og splittet opp for multithreading, og hev vekk de stygge, stygge print statements'a. (*ugh*)

 

Liker forresten å ha egne objekter for hver enkelt-ting i slike situasjoner. Føler det generelt sett er bedre å jobbe med :)

 

Up / Down state tracking er for eksempel (imho) lettere å lage når man har et objekt for hver server, istedet for å sjonglere med lister :)

 

F.eks hvis man legger til variablene "server_up" (default True), "last_message" (None) og "num_messages" (0), og så class funksjoner "state_up()" og "state_down()" (og caller de fra sjekk loop'en istedet for å sende sms direkte) så er man på god vei allerede :D Da kan man lett legge til en funksjon for å sende første sms med en gang, neste etter 10 minutter, neste deretter etter en time, osv... Og en SMS for når den kommer opp igjen :)

  • Liker 1
Lenke til kommentar

Hvorfor ikke flytte lista med servere som skal sjekkes ut av koden og inn i en database? SQLite f.eks.

Så gjør du om scriptet til å kun sjekke _en_ server, for så å avslutte.

Så lar du cron ta seg av kjøringen?

 

Evt så kan du gjøre det omvendt. Serverne sender en enkel heartbeat hvert minutt til overvåkningsserveren. Så sender du SMS når det er 10 minutter siden siste heartbeat...

 

Når det gjelder SMS så har jeg en hack som lar deg bruke et vanlig netcom-abb over nett til å sende sms (uten å gå via minside.netcom.no) og prisen vil være som en vanlig sms på abbonementet. har det bare i en C#-snutt foreløpig, men hvis noen har lyst så kan jeg bearbeide den litt for å få den mer generisk...

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...