Comment enregistrer la mémoire et l'utilisation du processeur d'une application?

16

Similaire à la question Comment enregistrer la charge du processeur? , Je voudrais enregistrer la mémoire d'un processus.

Le processus que je veux enregistrer est tué sur un serveur distant et je veux connaître la charge du processeur et l'utilisation de la mémoire juste avant sa mort.

[mise à jour]

Le petit script de python de Stefano Palazzo et

Les valeurs de sortie d'une ligne de Michał qui sont plus petites que toppour CPU et Mem. Avez-vous une idée pourquoi?

haut de sortie:

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 
2312 schXX     20   0 1241m 328m  58m S  100  0.3  11:56.68 MATLAB 

sortie du script python de Stefano Palazzo:

python memlogger.py 2312
%CPU    %MEM
76.00   0.20
76.00   0.20
Framester
la source
Je ne peux malheureusement pas encore commenter ici, mais vous pouvez trouver ce message d'intérêt expliquant pourquoi pspeut différer de top: stackoverflow.com/questions/131303/…
PM

Réponses:

16

Vous pouvez créer une doublure en coque:

logpid() { while sleep 1; do  ps -p $1 -o pcpu= -o pmem= ; done; }

pour enregistrer le processus avec pid = 123 simplement:

logpid 123

ou pour voir et écrire le journal dans un fichier:

logpid $$ | tee /tmp/pid.log

Si vous souhaitez que d'autres données soient enregistrées, modifiez les -o {this}options. Voir la man pssection "SPECIFICATEURS DE FORMAT STANDARD" pour les paramètres disponibles à utiliser. Si vous souhaitez une résolution temporelle différente, changez sleep {this}de fonction logpid().

Michał Šrajer
la source
Simple et fait le travail!
rafaelbattesti
3

Si vous recherchez précisément les topstatistiques, vous pouvez exécuter topen mode batch en spécifiant le pid du processus que vous recherchez. En prenant l'exemple de cette page ( http://www.dedoimedo.com/computers/linux-cool-hacks.html ) si vous avez tapé

top -b -d 10 -n 3 >> top-file

Vous auriez "top en cours d'exécution en mode batch (-b). Il va actualiser toutes les 10 secondes, comme spécifié par l'indicateur de retard (-d), pour un nombre total de 3 itérations (-n). La sortie sera envoyée dans un fichier. " Y compris -pvous pouvez spécifier le pidprocessus que vous recherchez. Cela renverra bien sûr plus que purement cpu et ram mais il contiendra ces champs. Dans mon cas, par exemple, j'obtiendrais ce qui suit lors de la surveillance du pid 9189 en utilisant top -b -d 10 -n 3 -p 9189 >> ~/top-file:

PID  USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
9189 pmj27     20   0 1617016 808112  27916 S   0.0  0.3   1:36.63 gedit
PM
la source
Cette page, bien qu'elle ne fasse pas de redirection vers un fichier, effectue des modifications plus sophistiquées vous permettant d'obtenir uniquement le CPU imprimé. Si vous quelqu'un connaît un bon moyen de rediriger la sortie vers un fichier et de la mettre à jour périodiquement, je serais intéressé de le savoir. watchne me semble pas idéal pour cela: superuser.com/questions/281347/filtering-top-command-output
PM
2

Ce script python simple devrait faire ce que vous voulez:

import time
import string
import sys
import commands

def get_cpumem(pid):
    d = [i for i in commands.getoutput("ps aux").split("\n")
        if i.split()[1] == str(pid)]
    return (float(d[0].split()[2]), float(d[0].split()[3])) if d else None

if __name__ == '__main__':
    if not len(sys.argv) == 2 or not all(i in string.digits for i in sys.argv[1]):
        print("usage: %s PID" % sys.argv[0])
        exit(2)
    print("%CPU\t%MEM")
    try:
        while True:
            x,y = get_cpumem(sys.argv[1])
            if not x:
                print("no such process")
                exit(1)
            print("%.2f\t%.2f" % (x,y))
            time.sleep(0.5)
    except KeyboardInterrupt:
        print
        exit(0)

Vous devez d'abord trouver l'ID de processus du programme que vous souhaitez surveiller, puis vous pouvez exécuter le script avec le PID comme argument:

python log.py 3912

Il imprimera l'utilisation du processeur et de la RAM en pourcentage deux fois par seconde:

%CPU    %MEM
0.90    0.40
1.43    0.40
8.21    0.40
...

Vous pouvez ensuite rediriger sa sortie vers un fichier afin de l'importer dans une feuille de calcul plus tard ( python log.py 9391 > firefox_log.txt) et importer les données dans une feuille de calcul en sélectionnant Tabvotre séparateur.

Le programme se ferme lorsque vous appuyez sur Ctrl + C ou lorsque le processus est interrompu.

Stefano Palazzo
la source
Cher Stefano, merci beaucoup pour votre script. Malheureusement, il semble produire des résultats erronés. Tu sais pourquoi? Veuillez voir ma question mise à jour.
Framester
À partir de la page de manuel ps man7.org/linux/man-pages/man1/ps.1.html , ps affiche le "temps CPU utilisé divisé par le temps d'exécution du processus (rapport cputime / temps réel), exprimé en pourcentage "- vous obtenez donc une moyenne de l'utilisation du processeur depuis le début
Nicolas Charles