Existe-t-il un outil permettant d'exécuter une ligne de commande et de signaler le pic d'utilisation RAM?
J'imagine quelque chose d'analogue à/usr/bin/time
Voici un one-liner qui ne nécessite aucun script ni utilitaire externe et ne vous oblige pas à démarrer le processus via un autre programme tel que Valgrind ou time. Vous pouvez donc l'utiliser pour tous les processus en cours d'exécution:
grep VmPeak /proc/$PID/status
(remplacez $PID
par le PID du processus qui vous intéresse)
[Edit: Fonctionne sur Ubuntu 14.04: /usr/bin/time -v command
Assurez-vous d'utiliser le chemin complet.]
On dirait que /usr/bin/time
vous donne cette information, si vous passez -v
(c'est sur Ubuntu 8.10). Voir, par exemple, Maximum resident set size
ci-dessous:
$/usr/bin/time -v ls / .... Commande en cours: "ls /" Temps utilisateur (secondes): 0.00 Temps système (secondes): 0.01 Pourcentage de CPU de ce travail: 250% Temps écoulé (horloge murale) (h: mm: ss ou m: ss): 0 : 00.00 Taille moyenne du texte partagé (kilo-octets): 0 Taille moyenne des données non partagées (kilo-octets): 0 Taille moyenne de la pile (kilo-octets): 0 Total moyen taille (kilo-octets): 0 taille maximale du groupe de résidents (kilo-octets): 0 taille moyenne du groupe de résidents (kilo-octets): 0 défauts de page majeurs (nécessitant des E/S): 0 Erreurs de page mineures (récupération d'un cadre): 315 Changements de contexte volontaires: 2 Changements de contexte involontaires: 0 Permutations: 0 Système de fichiers entrées: 0 sorties du système de fichiers: 0 Messages de socket envoyés: 0 Messages de socket reçus: 0 Signaux d livré: 0 Taille de la page (en octets): 4096 Statut de sortie: 0
(C’est une question déjà posée, ancienne question .. mais juste pour le compte rendu :)
Le script de Yang m'a inspiré et j'ai créé ce petit outil nommé memusg . J'ai simplement augmenté le taux d'échantillonnage à 0,1 pour gérer beaucoup de processus de courte durée. Au lieu de surveiller un seul processus, je lui ai fait mesurer la somme rss du groupe de processus. (Oui, j'écris beaucoup de programmes distincts qui fonctionnent ensemble) Cela fonctionne actuellement sur Mac OS X et Linux. L’utilisation devait être similaire à celle de time
:
memusg ls -alR />/dev/null
Il ne montre que le pic pour le moment, mais je suis intéressé par de petites extensions pour enregistrer d’autres statistiques (approximatives).
C'est bien d'avoir un outil aussi simple pour jeter un coup d'œil avant de commencer tout profilage sérieux.
Valgrind one-liner:
valgrind --tool=massif --pages-as-heap=yes --massif-out-file=massif.out ./test.sh; grep mem_heap_B massif.out | sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1
Notez l'utilisation de --pages-as-heap pour mesurer toute la mémoire d'un processus. Plus d'infos ici: http://valgrind.org/docs/manual/ms-manual.html
Peut-être que (gnu) time (1) fait déjà ce que vous voulez. Par exemple:
$ /usr/bin/time -f "%P %M" command
43% 821248
Mais d'autres outils de profilage peuvent donner des résultats plus précis en fonction de ce que vous recherchez.
Sous Linux:
Utilisez /usr/bin/time -v <program> <args>
et cherchez " Taille maximale du groupe de résidents ".
(Ne pas confondre avec la commande intégrée Bash time
! Utilisez donc le chemin complet, /usr/bin/time
)
Par exemple:
> /usr/bin/time -v ./myapp
User time (seconds): 0.00
. . .
Maximum resident set size (kbytes): 2792
. . .
Sur BSD, MacOS:
Utilisez /usr/bin/time -l <program> <args>
en recherchant " taille maximale du groupe de résidents ":
>/usr/bin/time -l ./myapp
0.01 real 0.00 user 0.00 sys
1440 maximum resident set size
. . .
/ usr/bin/time fait peut-être ce que vous voulez, en fait. Quelque chose comme.
/usr/bin/time --format = '(% Xtext +% Ddata% Mmax)'
Voir le temps (1) pour plus de détails ...
Si le processus s'exécute pendant au moins quelques secondes, vous pouvez utiliser le script bash suivant, qui exécute la ligne de commande donnée, puis affiche le flux RSS maximal (remplace le paramètre rss
par tout autre attribut qui vous intéresse. ) C'est un peu léger, et cela fonctionne pour moi avec la ps
incluse dans Ubuntu 9.04 (que je ne peux pas dire pour time
).
#!/usr/bin/env bash
"$@" & # Run the given command line in the background.
pid=$! peak=0
while true; do
sleep 1
sample="$(ps -o rss= $pid 2> /dev/null)" || break
let peak='sample > peak ? sample : peak'
done
echo "Peak: $peak" 1>&2
Sur MacOS Sierra, utilisez:
/usr/bin/time -l commandToMeasure
Vous pouvez utiliser grep
pour prendre ce que vous voulez peut-être.
time -f '%M' <run_program>
Vous pouvez utiliser un outil tel que Valgrind pour le faire.
Voici (basé sur les autres réponses) un script très simple qui surveille un processus déjà en cours d'exécution. Vous venez de l'exécuter avec le pid du processus que vous voulez regarder comme argument:
#!/usr/bin/env bash
pid=$1
while ps $pid >/dev/null
do
ps -o vsz= ${pid}
sleep 1
done | sort -n | tail -n1
Exemple d'utilisation:
max_mem_usage.sh 23423
Heaptrack est un outil KDE doté d'une interface graphique et d'une interface texte. Je trouve plus approprié que valgrind de comprendre l'utilisation de la mémoire d'un processus, car il fournit plus de détails et de graphiques de flamme. C'est aussi plus rapide parce qu'il vérifie moins que valgrind. Et cela vous donne l'utilisation maximale de la mémoire.
Quoi qu'il en soit, suivre les flux rss et vss est trompeur, car les pages pourraient être partagées, c’est pourquoi memusg
. Ce que vous devriez vraiment faire est de suivre la somme de Pss
dans /proc/[pid]/smaps
ou d’utiliser pmap
. Moniteur système GNOME le faisait auparavant, mais c'était trop cher.
Réinventer la roue, avec le script bash fabriqué à la main. Rapide et propre.
Mon cas d'utilisation: Je voulais surveiller une machine Linux qui avait moins de RAM et je voulais prendre un instantané de l'utilisation de chaque conteneur lorsqu'il fonctionnait de manière intensive.
#!/usr/bin/env bash
threshold=$1
echo "$(date '+%Y-%m-%d %H:%M:%S'): Running free memory monitor with threshold $threshold%.."
while(true)
freePercent=`free -m | grep Mem: | awk '{print ($7/$2)*100}'`
do
if (( $(awk 'BEGIN {print ("'$freePercent'" < "'$threshold'")}') ))
then
echo "$(date '+%Y-%m-%d %H:%M:%S'): Free memory $freePercent% is less than $threshold%"
free -m
docker stats --no-stream
sleep 60
echo ""
else
echo "$(date '+%Y-%m-%d %H:%M:%S'): Sufficient free memory available: $freePercent%"
fi
sleep 30
done
Exemple de sortie:
2017-10-12 13:29:33: Exécution d'un moniteur de mémoire libre avec un seuil de 30% ..
2017-10-12 13:29:33: Mémoire libre suffisante en quantité suffisante: 69.4567%
2017-10-12 13:30:03: Mémoire libre suffisante en quantité disponible: 69.4567%
2017-10-12 16:47:02: Mémoire libre 18,9387%, moins de 30%
votre sortie de commande personnalisée
Utilisez Massif: http://valgrind.org/docs/manual/ms-manual.html
Sur macOS, vous pouvez plutôt utiliser DTrace. L'application "Instruments" est une interface graphique de Nice pour cela, elle est livrée avec XCode.
'htop' est la meilleure commande pour voir quel processus utilise combien de RAM .....
pour plus de détails http://manpages.ubuntu.com/manpages/precise/man1/htop.1.html