2010-11-11 5 views
1

Je voudrais être en mesure de redémarrer un service quand il utilise trop de mémoire (ce qui est lié à un bogue dans une bibliothèque tierce partie)Connaître la taille de l'empreinte mémoire

J'ai utilisé cela pour limiter la quantité de mémoire qui peut être demandé:

resource.setrlimit(resource.RLIMIT_AS, (128*1024*1024, 128*1024*1024)) 

Mais la bibliothèque tierce partie se coince dans une allocation de mémoire défaillante et busyloop mémoire réinscriptible demande. Donc je veux pouvoir, dans un fil, interroger la taille actuelle de la mémoire du processus.

La langue que j'utilise est python, mais une solution pour n'importe quel langage de programmation peut être traduite en code python, à condition qu'elle soit viable et sensible sous Linux.

+0

pouvez-vous nous dire quelle bibliothèque éviter? –

+0

Hah, bon appel. Non, je ne peux pas. Pardon. – Jerub

Répondre

1

Monit est un service que vous pouvez exécuter pour surveiller les processus externes. Tout ce que vous devez faire est de vider votre pid dans un fichier pour lire. Les gens l'utilisent souvent pour surveiller leur serveur Web. L'un des tests que peut effectuer Monit est l'utilisation totale de la mémoire. Vous pouvez définir une valeur et si votre processus utilise trop de mémoire, il sera redémarré. Voici un exemple de configuration monit

check process yourProgram 
     with pidfile "/var/run/YOUR.pid" 
     start program = "/path/to/PROG.py" 
     stop program = "/script/to/kill/prog/kill_script.sh" 
     restart if totalmem is greater than 60.0 MB 
0

Vous pouvez lire l'utilisation actuelle de la mémoire à l'aide du système de fichiers /proc.

Le format est /proc/[pid]/status. Dans le fichier virtuel status, vous pouvez voir le VmRSS actuel (mémoire résident).

+0

J'espérais éviter de lire/proc/self/status (/ proc/self est le processus en cours) mais si je ne peux rien faire d'autre, je suppose que je peux le faire. – Jerub

1

C'est le code que j'ai trouvé. Semble fonctionner correctement, et évite trop d'analyse de chaîne. Les noms de variables que je décompresse proviennent de la page de manuel proc(5), et il s'agit probablement d'un meilleur moyen d'extraire les informations du système d'exploitation que l'analyse de chaîne /proc/self/status.

def get_vsize(): 
    parts = open('/proc/self/stat').read().split() 
    (pid, comm, state, ppid, pgrp, session, tty, tpgid, flags, minflt, cminflt, 
    majflt, cmajflt, utime, stime, cutime, cstime, counter, priority, timeout, 
    itrealvalue, starttime, vsize, rss, rlim, startcode, endcode, startstack, 
    kstkesp, kstkeip, signal, blocked, sigignore, sigcatch, wchan, 
    ) = parts[:35] 
    return int(vsize) 

def memory_watcher(): 
    while True: 
     time.sleep(120) 
     if get_vsize() > 120*1024*1024: 
      os.kill(0, signal.SIGTERM) 
Questions connexes