7
votes

Mesure de la mémoire maximale du processus de course longue en Linux

Comment surveiller la mémoire de pointe consommée par un processus de Linux? Ce n'est pas un programme que je peux modifier à l'intérieur de mesurer l'utilisation de la mémoire de pointe.

Je ne veux pas vraiment de mesures détaillées, je ne veux pas non plus qu'ils ralentissent mon programme excessivement .. Donc Valgrind ou quoi que ce soit de poids lourd n'est pas ce que je cherche ... Et comme d'autres messages précédents [ Utilisation de la mémoire maximale d'un processus Linux / Unix , Time -V ne semble pas signaler la mémoire de ma machine ...

Je peux simplement exécuter haut ou ps et extraire les cordes consommées de la mémoire pour Mon identifiant de processus à l'aide d'un script simple. Cependant, mon processus fonctionne pendant environ 20-30 minutes, donc je souhaite pouvoir me connecter et obtenir le maximum. Je peux tolérer des échantillons à grains grossières ... toutes les 1 minute ou plus ... Spécifiquement comment i-> 1. Fourche ce script simple Mem-Mease dans ZSH? 2. Tuez-le lorsque le test-sous-test se termine?


0 commentaires

10 Réponses :


3
votes

En fait, ce que j'ai dit avant:

"" "" p>

Essayez p> xxx pré>

qui devrait l'aider. Si vous n'utilisez que "temps". , bash exécutera l'intégré (qui n'a pas "-v") p>

"" " p>

ne fonctionne pas (retourne 0). P>

J'ai fait le script Perl suivant (que j'ai appelé smaps): p> xxx pré>

puis je l'appelle (par exemple, pour regarder l'utilisation de la mémoire de QGIT): P>

bash -c './smaps $$ & exec qgit'


2 commentaires

Sortie en 2 pièces ... toujours pas utile :( Temps d'utilisateur (secondes): 16.50 Temps système (secondes): 0,47% de la CPU Ce travail a été: 100% écoulé (Horloge murale) Temps (H: MM: SS ou M: SS): 0: 16.96 Taille de texte partagée moyenne (KBYTES): 0


Taille de données non partagée moyenne (KBYTES): 0 Taille moyenne de la pile (KBYtes): 0 Taille totale moyenne moyenne (KBYTES): 0 Maximum de résident Taille (KBYTES): 0 MOYEN MOYEN DE RESIDENT Taille (KBYTES): 0 Major (nécessitant des E / S) Défauts de page de page: 0 Défauts de page de la page (Récupération de cadre): 255315 Commutateurs de contexte volontaire: 1211 Interrupteurs de contexte involontaire: 1232 Swaps: 0 Entrées du système de fichiers: 0 Sens du système de fichiers: 68472 Messages de socket envoyé: 0 Taille de la page reçue: 0 Taille de la page ( octets): 4096



1
votes

Vous pouvez utiliser un plugin Munin-noeud pour le faire, mais c'est un peu de poids lourd. http://munin.projects.linpro.no/


0 commentaires

7
votes

Il suffit d'utiliser Top -N pour itérer un nombre de fois spécifié, et -D pour retarder les mises à jour. Vous pouvez également saisir uniquement la sortie correspondant à votre processus en grepping son PID, comme: xxx pré>

lire la page manuelle supérieure pour plus d'informations p>

man top


0 commentaires

1
votes

/ proc / pid / smaps, comme / proc / pid / maps, ne donne que des informations sur les mappages de mémoire virtuelle, pas l'utilisation de la mémoire physique réelle. Top and PS donne le RSS, qui (selon ce que vous voulez savoir) peut ne pas être un bon indicateur de l'utilisation de la mémoire.

Un bon pari, si vous exécutez sur un noyau Linux plus tard que 2.6.28.7, vous devez utiliser la fonction de pageMAP. Il y a une discussion sur cette science et source pour certains outils chez www.eqware.net/articles/capturingprocessMemoryUsageUnLUX .

L'outil de collecte de page est destiné à capturer l'utilisation de la mémoire de tous les processus, et impose probablement un plus grand fardeau de la CPU que vous le souhaitez. Vous devriez facilement pouvoir le modifier, cependant, de sorte qu'il capture des données pour seulement un identifiant de processus spécifique. Cela réduirait suffisamment les frais généraux afin que vous puissiez facilement le courir toutes les quelques secondes. Je n'ai pas essayé, mais je pense que l'outil d'analyse de page doit fonctionner sans changement.

eqvan


0 commentaires

2
votes

Valgrind avec massif ne devrait pas être trop lourd, mais je recommanderais d'utiliser / proc. Vous pouvez facilement écrire votre propre script de moniteur. Voici le mien, pour votre commodité: xxx


0 commentaires

1
votes

Cela dépend de quel type de mémoire que vous souhaitez surveiller.

Surveillance de la macette suivante en triant le numéro de tout le processus (tout total du thread) vous permettra de surveiller la mémoire physique malloc chaque processus utilise. P>

Vous pouvez écrire un programme AC pour la rendre encore plus rapide, mais je pensais que Awk était le choix minimum à cet effet. P>

  • m.a mémoire mappée anonyme
    • .p privé
      • .d sale == malloc / mmpped tas et pile alloué et mémoire écrite li>
      • .c Clean == MALLOC / MMPLAD Mémoire de tas et de pile une fois alloué, écrit, puis libéré, mais pas encore récupéré li> ul> li>
      • .s partagés
        • .d sale == Il ne devrait y avoir aucune li>
        • .c propre == Il ne devrait y avoir aucune li> ul> li> ul> li>
        • m.n nommé mémoire mappée
          • .p privé
            • .d sale == fichier mmpped mémoire écrite privée li>
            • .c Clean == Mapping Programme / Library Texte privé mappé Li> ul> li>
            • .s partagés
              • .D Dirty == Fichier Mémoire écrite partagée Li>
              • .c Clean == Texte de la bibliothèque mappée partagée mappé Li> ul> li> ul> li> ul>

                Je préférerais obtenir les chiffres comme suit pour obtenir les chiffres réels au moins frais généraux.
                Vous devez les résumer afin de diviser ce que PS montre comme RSS et obtenez des numéros plus précis de ne pas confondre. p>

                MAPD: P>

                 awk '/^[0-9a-f]/{if ($6=="") {anon=1}else{anon=0}} /Private_Clean/{if(anon) {asum+=$2}else{nasum+=$2}} END{printf "sum=%d\n",asum}' /proc/<pid>/smaps
                


0 commentaires

1
votes

Plutôt que de voter / procurner un milliard de fois une seconde, pourquoi pas seulement traiter la production de la strace?

http://tstarling.com/blog/ 2010/06 / mesure-mémoire-usage-with-strace /


1 commentaires

Cela ne tient pas compte des fichiers mappés en mémoire, ce qui ne consomme vraiment pas de mémoire comme la mémoire réelle.



1
votes

Les métriques de mémoire précises peuvent être données par interface de noyau PageMap - utilisée dans la bibliothèque de libpagemap https://fedorahosted.org/libpagemap/ . La bibliothèque fournit également des utilisateurs d'utilisateurs afin que vous puissiez démarrer la mémoire de surveillance immédiatement.


0 commentaires

1
votes

Une meilleure alternative pour mesurer l'utilisation de la mémoire RSS pic / hautes eaux est la CGMEMTime outil disponible ici:

https://github.com/gsauthof/cgmemtime

C'est aussi facile à utiliser comme / usr / bin / time et sans le ralentissement du massif du Valgrind 'fort> . En outre, il est basé sur une fonctionnalité Kernel nommé cgroups , il est donc encore plus précis que d'autres méthodes de vote.


0 commentaires

0
votes

Si vous n'avez besoin que de surveiller un seul processus, vous pouvez faire quelque chose comme ceci:

#!/bin/bash
PID=$(pidof myprog)
while true; do
    printf "%s: %s KB\n" "$(date --iso=sec)" "$(grep VmHWM: /proc/$PID/status | awk '{print $2}')";
    sleep 5s;
done


0 commentaires