Récupérer le load average d’un serveur avec python + fonction sleep


Le load average désigne, sous les systèmes UNIX, une moyenne de la charge système, une mesure de la quantité de travail que fait le système durant la période considérée. Celle-ci est disponible via la commande top ou uptime, ou encore via le fichier système /proc/loadavg. (Voir wikipedia)

Un petit truc simple pour connaitre le load average de son serveur depuis son script python.

sous un shell python on tape:

>>> open("/proc/loadavg").readline().split(" ")[:3]   
['3.01', '2.74', '2.91']

On obtient une liste avec les load average des 1, 5 et 15 dernières minutes, c’est magique, pas besoin d’installer des scripts pourris qui mettent cent ans à configurer et qui marchent une fois sur deux (j’ai passé 1 journée pour essayer de conf Monit en vain, de la merde en boite faite par un autiste)

Mon serveur a les couilles dans un étaux comme on peut le voir, on peut imaginer une fonction qui va attendre que la charge baisse avant d’exécuter la prochaine tâche de torture.

 
import time
 
#wait if load average is too high
def load_average_wait(treshold=1):
    """
        If server is above the treshold value, wait for lower load before continue
    """
 
    while float(open("/proc/loadavg").readline().split(" ")[:3][0]) > treshold:
        time.sleep(10)
 
 
# my script part that eat a lot...
while True:
 
    # Encode video, is there anything else eating so much cpu in the universe ?
    encode_video()
 
    # wait if cpu start boiling...
    load_average_wait(1.5)

ça m’a sauvé 2 serveurs de la mort certaine, j’ai bien tenté un renice mais ça ne suffisait pas.

EDIT:
On peut également s’en servir pour s’envoyer des emails en cas de surcharge du serveur et ce sans installer d’usine à gaz genre nagio et autre…

Leave a comment

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.